C#でじゃんけん 第2版
C# でじゃんけんするプログラム 第2版 です。
第2版では、実行の流れの各項目をメソッドに分割し、main からそれぞれのメソッドを呼び出すようにします。大きいメソッド 1 つより、適当な大きさに分割された複数のメソッドのほうが、なにをしているか理解しやすいと思います。
メインメソッドは、以下のようになりました。第1版では、勝ち、負け、あいこの判断とその結果の表示はまとめて行っていました。第2版では、結果の判断とその表示は、それぞれのメソッドに分割します。
// メインメソッドです。 static void Main() { Console.WriteLine("じゃんけんしましょう!"); // 1. あなたが出す手を読み込みます。 int yourHand = ReadYourHand(); // 2. コンピュータが出す手を乱数で生成します。 int computerHand = DecideComputerHand(); // 3. あなたの手とコンピュータの手を表示します。 ShowHands(yourHand, computerHand); // 4. 勝ち、負け、あいこを判断します。 int result = JudgeResult(yourHand, computerHand); // 5. 結果を表示します。 ShowResult(result); Console.WriteLine("また遊びましょう。それでは!"); }
あなたが出す手を読み込むReadYourHand()メソッドは、次のようになります。
/// <summary> /// あなたが出す手を読み込みます。 /// </summary> /// <returns> /// 読み込んだあなたが出す手を返します。 /// </returns> static int ReadYourHand() { // あなたの手を格納する整数型の変数 'yourHand' を定義します。 int yourHand; // あなたの手が読み込めるまで繰り返します。 for ( ; ; ) { // 入力を促すメッセージを表示します。 string prompt = String.Format( "あなたはなにを出しますか ({0}:グー、{1}:チョキ、{2}:パー): ", GU, CYOKI, PA); Console.Write(prompt); // キーボードから入力された文字列を、変数 'yourInput' に格納します。 string yourInput = Console.ReadLine(); // 変数 'yourInput' に格納された文字列を整数として解釈し、うまく解釈できれば // 変数 'yourHand' に整数値を格納します。さらに 'yourHand' が GU、CYOHI、 // あるいは PA なら、繰り返しから抜けます。 if (Int32.TryParse(yourInput, out yourHand) && (yourHand == GU || yourHand == CYOKI || yourHand == PA)) { break; } // ここが実行されるのは、入力された文字列が整数でなかった、あるいは // GU, CYOKI、PA のいずれでもなかった場合です。問題の内容とその対処方法を示す // メッセージを表示します。 string errorMessage = String.Format( "'{0}' の入力は不正です。{1}、{2}、{3} のいずれかを入力してください。", yourInput, GU, CYOKI, PA); Console.WriteLine(errorMessage); } return yourHand; }
次のメソッドDecideComputerHand()は、コンピュータが出す手を乱数で生成します。
/// <summary> /// コンピュータが出す手を乱数で生成します。 /// </summary> /// <returns> /// 生成したコンピュータが出す手を返します。 /// </returns> static int DecideComputerHand() { // 乱数は System.Random.Next(Int32) メソッドで生成します。このメソッドは 0 以上、 // 指定の最大値未満のランダムな整数を返します。ここでは、0, 1, 2 のいずれかを返します。 // 返された値は、整数型の変数 'computerHand' に格納します。 int computerHand = _rand.Next(HAND_MAX); return computerHand; }
次のメソッドShowHands()は、引数で受け取ったあなたの手とコンピュータの手を表示します。
/// <summary> /// あなたの手とコンピュータの手を表示します。 /// </summary> /// <param name="yourHand">あなたの手です。</param> /// <param name="computerHand">コンピュータの手です。</param> static void ShowHands(int yourHand, int computerHand) { Console.WriteLine("あなたの手: {0}", yourHand); Console.WriteLine("コンピュータの手: {0}", computerHand); }
次のJudgeResult()メソッドは、引数であなたの手とコンピュータの手を受け取り、勝ち、負け、あいこを判断し、その結果を返します。勝ち、負け、あいこは、定数YouWin、Draw、ComputerWinを定義しておきます。
/// <summary> /// 勝ち、負け、あいこを判断します。 /// </summary> /// <param name="yourHand">あなたの手です。</param> /// <param name="computerHand">コンピュータの手です。</param> /// <returns> /// 判断した結果を返します。 /// </returns> static int JudgeResult(int yourHand, int computerHand) { int result; // あなたの手は GU、CYOKI、PA の 3 つのうちのどれか、コンピュータの手も // その 3 つのうちのどれかです。あなたの手とコンピュータの手の組み合わせは // 3 x 3 = 9 通りのうちのどれかになります。これらを if 文で場合分けし、 // 勝ち、負け、あいこを判断し、その結果を返します。 if (yourHand == GU) { if (computerHand == GU) { // あなた: GU、コンピュータ: GU => あいこ result = Draw; } else if (computerHand == CYOKI) { // あなた: GU、コンピュータ: CYOKI => あなたの勝ち result = YouWin; } else { // あなた: GU、コンピュータ: PA => コンピュータの勝ち result = ComputerWin; } } else if (yourHand == CYOKI) { if (computerHand == GU) { // あなた: CYOKI、コンピュータ: GU => コンピュータの勝ち result = ComputerWin; } else if (computerHand == CYOKI) { // あなた: CYOKI、コンピュータ: CYOKI => あいこ result = Draw; } else { // あなた: CYOKI、コンピュータ: PA => あなたの勝ち result = YouWin; } } else { if (computerHand == GU) { // あなた: PA、コンピュータ: GU => あなたの勝ち result = YouWin; } else if (computerHand == CYOKI) { // あなた: PA、コンピュータ: CYOKI => コンピュータの勝ち result = ComputerWin; } else { // あなた: PA、コンピュータ: PA => あいこ result = Draw; } } return result; }
最後は結果を表示するShowResult()メソッドです。
/// <summary> /// 結果を表示します。 /// </summary> /// <param name="result">判断した結果です。</param> static void ShowResult(int result) { if (result == YouWin) { Console.WriteLine("あなたの勝ちです。"); } else if (result == Draw) { Console.WriteLine("あいこです。"); } else { Console.WriteLine("コンピュータの勝ちです。"); } }