Kotlin練習問題1-☆4:数字当てゲームを作ろう

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

Kotlinの初心者向け問題1-☆4:数字当てゲームを作ろう

この問題を解くために必要な知識:
コメントの書き方、変数と定数、基本データ型、算術演算と論理演算、入力と出力、import文、配列、分岐処理(if、if~else、when)、繰り返し処理(for、while、do~while)、Null安全、スマートキャスト

<<前の問題 問題集Top 次の問題>>

Kotlin練習問題1-☆4_数字当てゲームを作ろう





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

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

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

この問題の要件

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

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

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

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

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

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

この問題を解くヒント

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

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

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

1.main関数の定義
 1-1. targetNumber変数の初期化
  1-1-1. Random.nextIntメソッドを使用して1から100までのランダムな整数を生成
 1-2. userGuess変数の宣言と初期化
 1-3. attemptCount変数の宣言と初期化

2.ユーザー入力のループ処理
 2-1. whileループによる数当てゲームの実行
  2-1-1. ユーザーに1から100までの数字を入力させる
  2-1-2. 入力値を整数に変換し、userGuessに格納
  2-1-3. userGuessがnullの場合のエラーメッセージ表示
  2-1-4. userGuessが有効な場合、attemptCountをインクリメント
  2-1-5. 入力された数字が正解かどうかを判定
   2-1-5-1. 数字が正解より小さい場合のメッセージ表示
   2-1-5-2. 数字が正解より大きい場合のメッセージ表示
   2-1-5-3. 数字が正解の場合のメッセージ表示

3.ゲームの終了処理
 3-1. ゲーム終了メッセージの表示

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

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

import kotlin.random.Random

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

    /*【穴埋め問題2】 
    ここにユーザーの入力を格納する変数`userGuess`を宣言し、初期化するコードを書いてください。
    */

    /*【穴埋め問題3】 
    ここに試行回数を記録する変数`attemptCount`を宣言し、初期化するコードを書いてください。
    */

    // ユーザーが正しい数字を当てるまで繰り返す
    while (userGuess != targetNumber) {
        print("1から100までの数字を入力してください: ")
        /*【穴埋め問題4】 
        ここにユーザーの入力を読み取り、整数に変換して`userGuess`に格納するコードを書いてください。
        */

        if (userGuess != null) {
            /*【穴埋め問題5】 
            ここに試行回数をインクリメントするコードを書いてください。
            */

            // 入力された数字が正解かどうかを判定
            when {
                /*【穴埋め問題6】 
                ここにユーザーの入力が正解の数字より小さい場合にメッセージを表示するコードを書いてください。
                */
                /*【穴埋め問題7】 
                ここにユーザーの入力が正解の数字より大きい場合にメッセージを表示するコードを書いてください。
                */
                /*【穴埋め問題8】 
                ここにユーザーの入力が正解だった場合にメッセージを表示し、試行回数を表示するコードを書いてください。
                */
            }
        } else {
            /*【穴埋め問題9】 
            ここに`userGuess`がnullの場合にエラーメッセージを表示するコードを書いてください。
            */
        }
    }

    /*【穴埋め問題10】 
    ここにゲーム終了時のメッセージを表示するコードを書いてください。
    */
}

 

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

解答例

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

正解コードの例

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

********************

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("ゲームを終了します。")
}

********************

コードの解説

乱数の生成と変数の初期化

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

このコードでは、Kotlin標準ライブラリのRandomクラスを使って、1から100までのランダムな整数を生成し、それをtargetNumberという変数に格納しています。

valキーワードを使って定義された変数は再代入ができないため、targetNumberは一度設定された後に変更されません。

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

userGuessはユーザーが入力した数値を格納するための変数で、Int?とすることで、null値も保持できるようにしています。

attemptCountはユーザーが何回試行したかを記録するための変数で、varキーワードを使って定義されているため、値を変更できます。

ユーザー入力とループ処理

while (userGuess != targetNumber) {
    print("1から100までの数字を入力してください: ")
    val input = readLine()
    userGuess = input?.toIntOrNull()

この部分では、whileループを使用して、ユーザーが正しい数字を当てるまでゲームを繰り返します。

readLine()関数を使ってユーザーの入力を読み取り、それを整数に変換してuserGuessに格納します。

toIntOrNull()は、変換に失敗した場合にnullを返すため、無効な入力も考慮しています。

入力の検証とヒントの表示

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

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

ここでは、if文を使って、userGuessnullでないことを確認しています。

nullでない場合、試行回数をカウントし、when式でユーザーの入力がtargetNumberより小さいか大きいかを判定し、それに応じたメッセージを表示します。

もしuserGuessnullの場合には、エラーメッセージを表示して再入力を促します。

ゲームの終了

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

ユーザーが正解の数字を当てた後、ゲームの終了メッセージを表示します。

この部分では、単にゲームの終了を知らせるためのメッセージが表示されるだけですが、プログラム全体の終了を示す重要な役割を果たしています。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

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

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






    Kotlin練習問題集へ戻る
    トップページへ戻る