在基于文本的控制台游戏中接收用户命令

我正在做一些基于文本控制台游戏,有点趣味,并且正在开始处理在控制台中input的用户命令。

是否有一些很好的devise模式来决定如何处理用户进入控制台窗口的命令?

我的想法到目前为止:

我创建了一个基本的查询结构来获取命令和它的参数。 它的工作原理有如下(代码是C#):

var userCommand = _getUserInputQuery.Invoke(new GetUserInputRequest { FullCommandText = Console.ReadLine() }); 

我现在在userCommand中有两个对象可用。 首先,我有命令的名称作为stringuserCommand.UserCommand ,其次我有一个string数组的参数userCommand.UserCommandArgs

我想现在有几种方法可以处理我所拥有的信息。

最基本的forms可能是一个简单的switch/if在命令名称和调用所需的相关类/方法(似乎有点icky虽然)。

我也想到了所有命令的通用接口IUserInputCommand我可以使用reflection创建所需的类,并从接口发射一个通用的Invoke方法。 (虽然我不确定这将有多么有用,有些命令invokations会需要不同的数据比其他)。

现在有哪些devise模式可以解决这类问题? 你会亲自做什么?

旧的MUD和Talkers(主要是说话者代码库)将使用一系列结构数组来保持查找只能用于可能的字母匹配。 这将完成

 input[0].ToLowerInvarriant() - 'a' 

==所有的命令以相同的字母开头的索引…在C#中,但是我会说只是使用一个字典。 他们的string散列例程很好,很灵活

 Dictionary<string, Delegate> dCommandHash; 

或者会这样工作。 然后就是

 if ( dCommandHash.ContainsKey(userCommand.UserCommand)) Whatever.You.Call.Invoke.On.Invoke(dCommandHash[userCommand.UserCommand],userCommand.UserCommandArgs); 

可能是完成这个最直接的方法。

如果你想看看这个方法看起来像是什么进化path,那么看看MudOSparsing器 。 这是定义基于模式的parsing的复杂而强大的机制,意味着能够智能地为多个名词和形容词的目标路由命令处理,并处理诸如put ITEM in CONTAINER put on CLOTHING情况与put on CLOTHING (即非常不同的动作恰巧从相同的动词开始)。 这可能有助于说明你要去的地方。