MENU

【Java】レッスン2-☆1:ハイアンドローゲームの作成でif文とRandomを学ぼう

tggaa478@yahoo.co.jp

一つ前のページでは例外処理について学習しました。

今回は ハイアンドロー ゲーム を作成していきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編

 ・Lesson2-1:比較演算子と論理演算子を理解しよう
 ・Lesson2-2:if文による分岐処理を理解しよう
 ・Lesson2-3:switch文による分岐処理を理解しよう
 ・Lesson2-4:for文による繰り返し処理を理解しよう
 ・Lesson2-5:while文による繰り返し処理を理解しよう
 ・Lesson2-6:繰り返しを制御しよう
 ・Lesson2-7:配列を理解しよう
 ・Lesson2-8:エラーメッセージを読めるようになろう
 ・Lesson2-9:例外処理を理解しよう
 ・確認問題2-☆1:ハイアンドロー ゲームを作ろう ◁今回はココ
 ・確認問題2-☆2:数字当てゲームを作ろう
 ・確認問題2-☆3:じゃんけんゲームを作ろう
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス

<<前のページ

学習記事一覧

次のページ>>

練習問題|ハイアンドローゲームを作って条件分岐を学ぼう

簡単なハイアンドローゲームを作成しましょう。

このゲームは、プレイヤーとコンピュータにランダムなカード(1から13までの整数)が配られ、プレイヤーは自分のカードを見た後、コンピュータのカードが自分のカードよりも大きいか小さいかを予想します。

プレイヤーが予想した後、コンピュータのカードを表示し、予想が正しければプレイヤーの勝ち、間違っていれば負けとなります。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • Random クラスを使用して、プレイヤーとコンピュータにランダムなカード(1から13の範囲)をそれぞれ配ること。
  • プレイヤーのカードを画面に表示し、コンピュータのカードは伏せておくこと。
  • プレイヤーに「コンピュータのカードが自分のカードより大きいか小さいか」を予想させ、予想を入力させること。
  • プレイヤーの入力(1: 大きい、2: 小さい)に応じて、予想の結果を判定すること。
  • コンピュータのカードを表示し、予想が当たったかどうかを結果として表示すること。

ただし、以下のような実行結果となること。

=== ハイアンドローゲームへようこそ! ===
【プレイヤー】8 VS ??【コンピュータ】
あなたのカードはコンピュータのカードより大きい?小さい?
1: 大きい、2: 小さい
⇒ 2
【プレイヤー】8 VS 10【コンピュータ】
正解!あなたの勝ち!

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:Randomクラスをインポート
2:Scannerクラスをインポート
3:HighAndLowGameクラスの定義
  □ mainメソッドの定義
  □ □ 「ハイアンドローゲームへようこそ!」と出力
  □ □ Randomオブジェクトrandの初期化
  □ □ 変数playerCardに1から13までのランダムな数値を代入
  □ □ 変数computerCardに1から13までのランダムな数値を代入
  □ □ プレイヤーのカードのみ表示し、コンピュータのカードは非表示
  □ □ 「あなたのカードはコンピュータのカードより大きい?小さい?」と出力
  □ □ 「1: 大きい、2: 小さい」と選択肢を出力
  □ □ Scannerオブジェクトscannerを用いてユーザーの入力を取得し、変数choiceに代入
  □ □ プレイヤーとコンピュータのカードを表示
  □ □ if文でplayerCardとcomputerCardが同じかを判定
  □ □ □ 真の場合、「引き分け!」と出力
  □ □ else if文でplayerCardとcomputerCardの比較およびchoiceの一致を判定
  □ □ □ □ 真の場合、「正解!あなたの勝ち!」と出力
  □ □ □ 偽の場合、「残念!あなたの負け!」と出力

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import java.util.Random;
import java.util.Scanner;

public class HighAndLowGame {
    public static void main(String[] args) {
        // ゲーム開始メッセージ
        
        /* 【穴埋め問題1】
        ここに「=== ハイアンドローゲームへようこそ! ===」というメッセージを出力するコードを書いてください。
        */

        // プレイヤーとコンピュータにランダムなカード(1〜13の数字)を配る
        Random rand = new Random();
        
        /* 【穴埋め問題2】
        ここでランダムなカードを生成し、それぞれ playerCard と computerCard に代入するコードを書いてください。
        */

        // プレイヤーに配られたカードを表示し、コンピュータのカードはまだ表示しない
        
        /* 【穴埋め問題3】
        ここにプレイヤーのカードを表示し、コンピュータのカードを「??」と表示するコードを書いてください。
        */

        // プレイヤーにコンピュータのカードが大きいか小さいかを予想させる
        
        /* 【穴埋め問題4】
        ここで「あなたのカードはコンピュータのカードより大きい?小さい?」と「1: 大きい、2: 小さい」という選択肢を表示するコードを書いてください。
        */

        // ユーザーの入力を取得
        Scanner scanner = new Scanner(System.in);
        
        /* 【穴埋め問題5】
        ここでユーザーの入力を受け取り、変数 choice に代入するコードを書いてください。
        */

        // コンピュータのカードを表示
        
        /* 【穴埋め問題6】
        ここにプレイヤーのカードとコンピュータのカードを並べて表示するコードを書いてください。
        */

        // 勝負の結果を判定
        
        /* 【穴埋め問題7】
        ここでプレイヤーとコンピュータのカードが同じ場合の処理を追加し、「引き分け!」というメッセージを表示してください。
        */
        
        /* 【穴埋め問題8】
        プレイヤーの選択(choice)とカードの大小関係を判定し、勝敗に応じて「正解!あなたの勝ち!」または「残念!あなたの負け!」と表示するコードを書いてください。
        */
    }
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

練習問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
import java.util.Random;
import java.util.Scanner;

public class HighAndLowGame {
    public static void main(String[] args) {
        // ゲーム開始メッセージ
        System.out.println("=== ハイアンドローゲームへようこそ! ===");

        // プレイヤーとコンピュータにランダムなカード(1〜13の数字)を配る
        Random rand = new Random();
        int playerCard = rand.nextInt(13) + 1;
        int computerCard = rand.nextInt(13) + 1;

        // プレイヤーに配られたカードを表示し、コンピュータのカードはまだ表示しない
        System.out.println("【プレイヤー】" + playerCard + " VS ??【コンピュータ】");

        // プレイヤーにコンピュータのカードが大きいか小さいかを予想させる
        System.out.println("あなたのカードはコンピュータのカードより大きい?小さい?");
        System.out.println("1: 大きい、2: 小さい");

        // ユーザーの入力を取得
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        // コンピュータのカードを表示
        System.out.println("【プレイヤー】" + playerCard + " VS " + computerCard + "【コンピュータ】");

        // 勝負の結果を判定
        if (playerCard == computerCard) {
            System.out.println("引き分け!");
        } else if ((playerCard < computerCard && choice == 1) || (playerCard > computerCard && choice == 2)) {
            System.out.println("正解!あなたの勝ち!");
        } else {
            System.out.println("残念!あなたの負け!");
        }
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

ライブラリのインポート

import java.util.Random;
import java.util.Scanner;

ここではJavaの標準ライブラリからRandomクラスとScannerクラスをインポートしています。

Randomクラスはランダムな数値を生成するために、Scannerクラスはユーザーの入力を受け取るために使用します。

クラス定義とmainメソッド

public class HighAndLowGame {
    public static void main(String[] args) {

HighAndLowGameというクラスを定義し、プログラムのエントリーポイントであるmainメソッドを用意しています。

mainメソッド内のコードが実行されます。

ゲーム開始メッセージの表示

System.out.println("=== ハイアンドローゲームへようこそ! ===");

ゲームの開始を知らせるメッセージを表示しています。

ランダムなカードの生成

Random rand = new Random();
int playerCard = rand.nextInt(13) + 1;
int computerCard = rand.nextInt(13) + 1;

Randomクラスのインスタンスrandを使用して、1から13までのランダムな整数を生成し、playerCardcomputerCardにそれぞれ割り当てています。

この値がプレイヤーとコンピュータのカードとして使用されます。

カードの表示と予想の入力を促す

System.out.println("【プレイヤー】" + playerCard + " VS ??【コンピュータ】");
System.out.println("あなたのカードはコンピュータのカードより大きい?小さい?");
System.out.println("1: 大きい、2: 小さい");

プレイヤーに配られたカードの数値を表示し、コンピュータのカードは隠した状態で「??」として表示します。

プレイヤーには「大きい」または「小さい」どちらかを選んで予想してもらいます。

ユーザーの入力を取得

Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();

Scannerオブジェクトscannerを使用して、プレイヤーが入力した予想(1または2)をchoice変数に格納します。

choiceの値によって、プレイヤーがコンピュータのカードが「大きい」か「小さい」かを予想したことが記録されます。

コンピュータのカードの公開

System.out.println("【プレイヤー】" + playerCard + " VS " + computerCard + "【コンピュータ】");

コンピュータのカードを公開し、プレイヤーとコンピュータのカードが並べて表示されます。

勝敗の判定

if (playerCard == computerCard) {
    System.out.println("引き分け!");
} else if ((playerCard < computerCard && choice == 1) || (playerCard > computerCard && choice == 2)) {
    System.out.println("正解!あなたの勝ち!");
} else {
    System.out.println("残念!あなたの負け!");
}

if文でプレイヤーとコンピュータのカードを比較し、勝敗を判定します。

  • プレイヤーとコンピュータのカードが同じ場合は「引き分け!」と表示します。
  • プレイヤーの予想が正しい場合(プレイヤーが「大きい」と予想し、実際にプレイヤーのカードが大きい場合、または「小さい」と予想し、実際に小さい場合)は「正解!あなたの勝ち!」と表示します。
  • 予想が外れた場合は「残念!あなたの負け!」と表示します。

まとめ

この「ハイアンドローゲーム」のコードでは、JavaのRandomScannerクラスを使ってユーザーとコンピュータがカードの大小を競うゲームを実現しました。

条件分岐やユーザー入力の処理といった、Javaプログラミングの基本的な要素が使われています。

初めての方は各文法を理解しながら、プログラムの流れを追ってみてください。

また今回紹介したプログラムでは、ユーザーが1か2以外の数値を入力した際、強制的に負けるようになっています。

是非コードを改変し、1か2以外の数値が入力された際には再度入力を促すようなプログラムの作成に挑戦してみて下さい。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいJava学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました