あなたが始めていることを考えると、最初に単純なケースでこれを見ることができますが、これswitch
を達成するためにステートメントを使用することはできません.
簡単にするために、コマンドは 1 つまたは 2 つの単語に制限されており、最初の単語は動詞で、存在する場合は 2 番目の単語は動詞であると仮定しましょう。これにより、かなりの数の可能性が得られます。
North
South
Examine
Take
Drop
等...
次の入力文字列があるとしますstrInput
。
string strInput = "examine hat";
まずこれを分割したいと思います。を使用してこれを行うことができますString.Split
:
string[] arguments = strInput.Split(' ');
これにより、文字列配列が得られます。
引数 [0] は調べる
引数 [1] は帽子です
ユーザーが入力した場合、常に2番目のものがあるとは限らないことに注意してください。
`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!
これで、拡張可能なシステムができました。新しいコマンドとハンドラを簡単に追加できます! より複雑になりますが、本質的に、これはあなたが望むことを行うための良い方法です.
編集:あなたの質問は、単語の順序を気にするべきではないと言っていることは承知しています。テキスト アドベンチャー ゲームを作成している場合は、ランダムに入力するのではなく、動詞/名詞などの文法を作成することをお勧めします。