ブール変数を使用して、ゲームの終了をループに知らせることができます。コマンドはループ内で照会する必要があり、ループの開始時にコマンドがわからないため、ループ条件をループの最後に置きます。
bool doExit = false;
do {
string command = Console.ReadLine().ToLower();
switch (command) {
case "exit":
case "quit":
doExit = true;
break;
case "otherCommand":
HandleOtherCommand();
break;
case "?":
case "h":
case "help":
PrintHelp();
break;
default:
Console.WriteLine("Invalid command!");
PrintHelp();
break;
}
} while (!doExit);
ブール変数を使用すると、他の条件が満たされたときにゲームを簡単に終了できるという利点があります。たとえば、プレイヤーがゲームに勝ったり負けたりしたときなどです。
次にメソッドについて説明します。同じソース コード (Program.cs) 内にメソッドを配置したり、新しいクラスを作成したりできます。Program.cs 内で、次のように記述します。
private static void PrintHelp()
{
Console.WriteLine("Valid commands:");
Console.WriteLine("help, h, ?: Print this help.");
Console.WriteLine("exit, quit: End this game.");
Console.WriteLine("...");
}
Main
メソッドが静的であるため、この同じクラス内の他のメソッドも静的でなければならないことに注意してください。コマンド用に他のクラスを作成する場合は、静的クラスを作成するかどうかを選択できます。静的クラスは、メソッドを配置する場所にすぎません。
static class GameCommands
{
// The `public` modifier makes it visible to other classes.
public static void PrintHelp()
{
...
}
public static void SomeOtherCommand()
{
...
}
}
このようなメソッドは、className.MethodName()
構文で呼び出すことができます。
GameCommands.PrintHelp();
さまざまな状態を保存する必要がある場合 (スコアなど)。非静的クラスを作成するのが適切です。クラスインスタンスまたはオブジェクトと呼ばれるそのようなクラスのコピーを作成できます。これは実際にはクラスの状態のみをコピーし、メソッド コードはコピーしません。非静的メソッドは、この状態 (フィールド、プロパティ) に作用できます。
class Player
{
// Constructor. Initializes an instance of the class (an object).
public Player (string name)
{
Name = name;
}
// Property
public int Score { get; private set; }
// Property
public string Name { get; private set; }
// Instance method (non-static method) having a parameter.
public void IncreaseScoreBy(int points)
{
Score += points;
}
public void PrintWinner()
{
Console.WriteLine("The winner is {0} with a score of {2} points." Name, Score);
}
}
このようなクラスを使用できます
Player player1 = new Player("John"); // Pass an argument to the constructor.
Player player2 = new Player("Sue");
player1.IncreaseScoreBy(5);
player2.IncreaseScoreBy(100);
if (player1.Score > player2.Score) {
player1.PrintWinner();
} else if (player2.Score > player1.Score)
player2.PrintWinner();
} else {
Console.WriteLine("The score is even!");
}
今まで戻り値のないメソッドを使っていました。これは、戻り値の型を置き換える void キーワードによって通知されます。
void MethodWithNoReturnValue() { ... }
戻り値がある場合 (つまり、メソッドが関数である場合)、戻り値の型を指定する必要があります。ステートメントはreturn
関数を終了し、戻り値を指定します。
double Reciprocal(double x)
{
return 1.0 / x;
}
同じクラス内でこのように呼び出します
double y = Reciprocal(x);
または、静的な場合はオブジェクト名またはクラス名を先頭に追加します。