【Kotlin】確認問題2-☆2:数字当てゲームを作ろう

記事内に商品プロモーションを含む場合があります

この記事の練習問題で使用する知識:
メイン関数入力と出力の基本コメントの書き方変数と定数Null安全性文字列の連結と埋め込みimport文比較演算子と論理演算子if文による分岐処理when文による分岐処理while文による繰り返し処理

Kotlinのゲームコード一覧はこちら

<<前のページ Kotlin記事一覧 次のページ>>

確認問題:数字当てゲームを作ろう





簡単な「数字当てゲーム」を作成しましょう。

このゲームでは、コンピューターが1から100までのランダムな整数を生成し、ユーザーがその数字を当てるまで繰り返し入力します。

ユーザーが正しい数字を当てるまでゲームは続き、正解した時点で試行回数が表示されます。

この問題の要件

以下の要件に従ってプログラムを作成してください。

  • 1から100までのランダムな整数を生成し、targetNumberという変数に格納してください。
  • ユーザーが入力した数字をuserGuessという変数に格納し、正しい数字を当てるまでループを使って繰り返し処理を行います。
  • ユーザーの入力が有効な整数かどうかを確認してください。無効な入力の場合、エラーメッセージを表示し、再入力を促します。
  • ユーザーの入力した数字が、targetNumberより小さいか大きいかを判定し、それに応じて「もっと大きい数字です」や「もっと小さい数字です」と表示します。
  • ユーザーが正しい数字を当てた場合、「正解です!」と表示し、試行回数を表示してゲームを終了します。
  • ゲーム終了時に「ゲームを終了します。」と表示します。

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

----- ↓出力される結果の例↓ -----

1から100までの数字を入力してください: 50
もっと大きい数字です。
1から100までの数字を入力してください: 75
もっと小さい数字です。
1から100までの数字を入力してください: 60
もっと小さい数字です。
1から100までの数字を入力してください: 55
正解です!試行回数: 4
ゲームを終了します。

この問題を解くヒント

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

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

正解のコードは上から順に以下のような構成となっています。

1:Randomクラスをインポート
2:main関数の定義
  □ Randomクラスを使用して1〜100の範囲でランダムな整数を生成し、targetNumberに代入
  □ userGuess変数をInt?型で宣言し初期化
  □ attemptCount変数を初期化
  □ whileループを開始し、userGuessがtargetNumberと一致するまで繰り返す
  □ □ 「1から100までの数字を入力してください: 」と出力
  □ □ readLineで入力を取得し、input変数に代入
  □ □ inputをtoIntOrNullで変換し、userGuessに代入
  □ □ if文でuserGuessがnullでないかを判定
  □ □ □ attemptCountをインクリメント
  □ □ □ when式でuserGuessとtargetNumberを比較
  □ □ □ □ userGuessがtargetNumberより小さい場合、「もっと大きい数字です。」と出力
  □ □ □ □ userGuessがtargetNumberより大きい場合、「もっと小さい数字です。」と出力
  □ □ □ □ elseの場合、「正解です!試行回数: attemptCount」を出力
  □ □ elseの場合、「有効な数字を入力してください。」と出力
  □ whileループ終了後、「ゲームを終了します。」と出力

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

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

import kotlin.random.Random

fun main() {
    /*【穴埋め問題1】
    ここで1〜100のランダムな整数を生成し、変数targetNumberに代入するコードを書いてください。
    */

    /*【穴埋め問題2】
    ユーザーの入力を格納するInt?型の変数userGuessを初期化するコードを書いてください。
    */

    /*【穴埋め問題3】
    試行回数を記録するための変数attemptCountを初期化するコードを書いてください。
    */

    // ユーザーが正しい数字を当てるまで繰り返す
    /*【穴埋め問題4】
    whileループを開始し、userGuessがtargetNumberと一致するまで繰り返す条件式を書いてください。
    */

        print("1から100までの数字を入力してください: ")

        /*【穴埋め問題5】
        ユーザーの入力を取得し、Int?型に変換してuserGuessに代入するコードを書いてください。
        */

        /*【穴埋め問題6】
        if文でuserGuessがnullでない場合の条件を記述してください。
        */

            /*【穴埋め問題7】
            試行回数を記録する変数attemptCountをインクリメントするコードを書いてください。
            */

            /*【穴埋め問題8】
            when式を使用してuserGuessとtargetNumberを比較し、次の指示に従ったコードを書いてください。
            ・userGuessがtargetNumberより小さい場合、「もっと大きい数字です。」と出力
            ・userGuessがtargetNumberより大きい場合、「もっと小さい数字です。」と出力
            ・正解の場合、「正解です!試行回数: attemptCount」と出力
            */

        /*【穴埋め問題9】
        userGuessがnullの場合、「有効な数字を入力してください。」と出力するコードを書いてください。
        */

    println("ゲームを終了します。")
}

この問題の穴埋めコードは以上です。

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

ゲームの正解コードと解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

import kotlin.random.Random

fun main() {
    val targetNumber = Random.nextInt(1, 101) // 1から100までのランダムな整数を生成

    var userGuess: Int? = 0 // ユーザーの入力を格納する変数を初期化
    var attemptCount = 0 // 試行回数を記録する変数を初期化

    // ユーザーが正しい数字を当てるまで繰り返す
    while (userGuess != targetNumber) {
        print("1から100までの数字を入力してください: ")
        val input = readLine()
        userGuess = input?.toIntOrNull()

        if (userGuess != null) {
            attemptCount++ // 試行回数をカウント

            // 入力された数字が正解かどうかを判定
            when {
                userGuess < targetNumber -> println("もっと大きい数字です。")
                userGuess > targetNumber -> println("もっと小さい数字です。")
                else -> println("正解です!試行回数: $attemptCount")
            }
        } else {
            println("有効な数字を入力してください。")
        }
    }

    println("ゲームを終了します。")
}

正解コードの解説

このコードは1から100までのランダムな数値を当てるゲームを実現します。

コードの各部分を分解して詳しく説明します。

ランダム関数のインポートとエントリーポイント

import kotlin.random.Random

fun main() {
  • import kotlin.random.Random:Kotlin標準ライブラリのRandomクラスをインポートしています。このクラスを使うとランダムな数値を生成できます。
  • fun main():Kotlinプログラムのエントリーポイントであるメイン関数を定義しています。この関数内にゲーム全体の処理が記述されています。

ランダムな数値の生成

val targetNumber = Random.nextInt(1, 101) // 1から100までのランダムな整数を生成
  • 1以上100以下のランダムな整数を生成し、変数targetNumberに格納します。
  • プレイヤーが当てるべき「正解の数字」として使用されます。

変数の初期化

var userGuess: Int? = 0 // ユーザーの入力を格納する変数を初期化
var attemptCount = 0 // 試行回数を記録する変数を初期化
  1. userGuess:
    • プレイヤーが入力した数字を格納します。
    • Int?(nullable型)は、nullを許容する整数型です。最初にnullを使うことで不正な状態の防止や安全な入力チェックが可能になります。
  2. attemptCount:ゲームの試行回数を記録する変数です。プレイヤーが入力するたびにカウントを増加させます。

ゲームのループ処理

while (userGuess != targetNumber) {
  • 条件が満たされている間(userGuesstargetNumberと異なる間)ループが継続されます。
  • このループが終了するのは、プレイヤーが正解の数字を当てたときです。

ユーザー入力の取得

print("1から100までの数字を入力してください: ")
val input = readLine()
userGuess = input?.toIntOrNull()
  • print:プレイヤーに数字を入力するよう促すメッセージを表示します。
  • readLine():コンソールから入力を受け取ります。入力された値は文字列として取得されます。
  • toIntOrNull():文字列を整数に変換します。変換できない場合はnullを返します。これにより、不正な入力が処理されてもプログラムがエラーで終了しません。

入力チェック

if (userGuess != null) {
    attemptCount++ // 試行回数をカウント
  • if (userGuess != null):プレイヤーが正しい整数を入力した場合にのみ、この条件が満たされます。
  • attemptCount++:試行回数を1増加させます。

正解かどうかの判定

when {
    userGuess < targetNumber -> println("もっと大きい数字です。")
    userGuess > targetNumber -> println("もっと小さい数字です。")
    else -> println("正解です!試行回数: $attemptCount")
}
  • userGuess < targetNumber:入力が正解より小さい場合、「もっと大きい数字です」と表示します。
  • userGuess > targetNumber:入力が正解より大きい場合、「もっと小さい数字です」と表示します。
  • else:入力が正解の場合、「正解です!」と試行回数を表示します。

無効な入力への対応

} else {
    println("有効な数字を入力してください。")

プレイヤーが無効な値を入力した場合に実行されます。メッセージを表示して再入力を促します。

ゲーム終了メッセージ

println("ゲームを終了します。")

ゲームが終了したことを明示するメッセージを表示します。

まとめ

このKotlinコードではランダムな数値の生成、入力チェック、繰り返し処理、条件分岐を学ぶことができます。

ゲームを完成させたら、自分で改造して範囲を変更したり、ヒントの仕組みを追加するなど、さらなる練習に挑戦してみましょう!

Kotlinのゲームコード一覧はこちら

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlinテキスト&問題集へ戻る
    トップページへ戻る