考虑到你刚开始,我们可以先在简单的情况下看这个,但你不能使用switch
语句来实现这一点。
为简单起见,让我们假设您的命令限制为 1 或 2 个单词,并且第一个单词是动词,第二个单词(如果存在)是名词。这给了我们很多可能性:
North
South
Examine
Take
Drop
ETC...
假设我们有一个输入字符串strInput
:
string strInput = "examine hat";
我们想先把它分开。我们可以使用String.Split
:
string[] arguments = strInput.Split(' ');
这会给我们一个字符串数组:
参数 [0] 是检查
论据 [1] 是帽子
请注意,如果用户键入以下内容,我们并不总是有第二个:
`North`
然后:
参数 [0] 是北
我们需要检查一下!现在,检查这一点的可怕(但简单)方法是:
if(arguments[0] == "North")
{
// code to go North
}
else if(arguments[0] == "Take")
{
// code to work with Take. We'd check on arguments[1] here!
}
// etc...
不幸的是,这段代码会变得冗长、复杂且无法使用。你怎么知道在任何阶段你能做什么和不能做什么?如何添加新命令?因此,让我们使用 C# 的美妙委托功能,同时介绍Dictionary
. 字典允许我们将一种类型(键)映射到另一种类型(在本例中为委托)。使用这种方法,我们可以创建委托来处理不同类型的命令。
public delegate void HandleCommand(string[] _input);
在这里,我们委托了一个代表。先别管它,但让我们介绍一些可以与命令一起使用的函数:
public void Handle_North(string[] _input)
{
// code to go North. This function could just as easily be something that handles
// *all* directions and checks _input[0] to see where to go!
}
public void Handle_Take(string[] _input)
{
if(_input.Length > 1) // Did the user specify an object to take?
{
// code to handle Take.
}
}
等等。现在我们需要创建一个字典来将命令映射到这些函数:
Dictionary<String, HandleCommand> map = new Dictionary<String, HandleCommand>();
在这里,我们声明了一个将字符串映射到我们的委托类型的字典HandleCommand
。现在我们需要填充它!
map["north"] = Handle_North;
map["take"] = Handle_Take;
// and the rest of our commands
现在,鉴于我们之前的示例,让我们像以前一样拆分字符串,并调用正确的处理程序!
string[] arguments = strInput.Split(' ');
if(arguments.Length > 0 && map.ContainsKey(arguments[0]))
map[arguments[0]](arguments); // calls our function!
现在我们有了一个可扩展的系统。添加新命令和处理程序很容易!它变得更加复杂,但本质上这是做你想做的事的好方法。
编辑:我知道你的问题说它不应该关心单词的顺序。如果你正在编写一个文字冒险游戏,你最好形成一些动词/名词或类似的语法,而不是让东西随机输入。