Go言語の初心者向け問題2-☆2:数字当てゲームを作ろう
<<前の問題 | 問題集Top |
次の問題>> |
Go練習問題2-☆3:数字当てゲームを作ろう
1から100までの数字を当てるゲームを作成しましょう。
このプログラムでは、コンピュータがランダムに生成した数字をプレイヤーが5回以内に当てることを目指します。
プレイヤーが入力した数字と、コンピュータが選んだ数字を比較し、適切なヒントを出しながら正解に近づけます。
この問題の要件
以下の要件に従ってコードを完成させてください。
const
を使用して、プレイヤーが数字を当てるための試行回数を定数maxTries
として定義すること。rand.Seed(time.Now().UnixNano())
を使用して乱数生成のシードを設定し、rand.Intn(100) + 1
で1から100までのランダムな数字を生成すること。for
ループを使用して、プレイヤーに最大maxTries
回まで数字を入力させること。fmt.Scan
を使用してプレイヤーから入力を受け取り、その入力を整数として格納すること。- プレイヤーが入力した数字とコンピュータが選んだ数字を比較し、次のヒントを表示すること。
- 入力した数字が小さい場合は「もっと大きな数字です。」と表示すること。
- 入力した数字が大きい場合は「もっと小さな数字です。」と表示すること。
- 正解の場合は、試行回数と共に「おめでとうございます!〇回目で正解です!」と表示してゲームを終了すること。
- プレイヤーがすべての試行を終えても正解できなかった場合は、「残念!正解は〇〇でした。」と表示すること。
ただし、以下のような実行結果となるコードを書くこと。
*****↓↓正解コードの実行結果の例↓↓*****
数字当てゲームへようこそ! 1から100の間の数字を当ててください。 試行回数は最大で5回です。 1回目の試行: 数字を入力してください: 50 もっと大きな数字です。 2回目の試行: 数字を入力してください: 75 もっと小さな数字です。 3回目の試行: 数字を入力してください: 60 もっと大きな数字です。 4回目の試行: 数字を入力してください: 70 もっと小さな数字です。 5回目の試行: 数字を入力してください: 65 おめでとうございます!5回目で正解です!
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. fmt
パッケージのインポート
1-2. math/rand
パッケージのインポート
1-3. time
パッケージのインポート
2.main関数の定義
2-1. 定数の定義
2-1-1. プレイヤーの試行回数を定数 maxTries
として宣言
2-2. 乱数生成のためのシード設定
2-3. ランダムなターゲットナンバーの生成
2-4. ゲームの開始メッセージを表示
2-5. ループ処理でプレイヤーの試行を開始
2-5-1. for
ループの開始
2-5-2. プレイヤーに数字を入力させる
2-5-3. プレイヤーの入力とターゲットナンバーを比較
2-5-3-1. プレイヤーの入力がターゲットナンバーより小さい場合に「もっと大きな数字です。」と表示
2-5-3-2. プレイヤーの入力がターゲットナンバーより大きい場合に「もっと小さな数字です。」と表示
2-5-3-3. プレイヤーの入力がターゲットナンバーと一致した場合に「おめでとうございます!」と表示し、ゲームを終了
2-6. ループを抜けても正解できなかった場合の処理
2-6-1. プレイヤーに「残念!正解は〇〇でした。」と表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
package main import ( "fmt" "math/rand" "time" ) func main() { // 定数を定義 const maxTries = 5 // プレイヤーが数字を当てるための試行回数 // プレイヤーが当てるべき数字をランダムに生成 rand.Seed(time.Now().UnixNano()) targetNumber := rand.Intn(100) + 1 // 1から100の間のランダムな数字 // プレイヤーにゲームの説明を表示 fmt.Println("数字当てゲームへようこそ!") fmt.Println("1から100の間の数字を当ててください。") fmt.Printf("試行回数は最大で%d回です。\n", maxTries) // 【穴埋め問題1】 // ここにプレイヤーの試行をループで処理するコードを書いてください。 // 各試行でプレイヤーに数字を入力させ、正解かどうかを判定します。 // 正解ならメッセージを表示してゲームを終了します。 // もしプレイヤーが全試行回数で当てられなかった場合 /*【穴埋め問題2】ここにプレイヤーが正解できなかった場合のメッセージを表示するコードを書いてください。*/ }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例と解説
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
package main import ( "fmt" "math/rand" "time" ) func main() { // 定数を定義 const maxTries = 5 // プレイヤーが数字を当てるための試行回数 // プレイヤーが当てるべき数字をランダムに生成 rand.Seed(time.Now().UnixNano()) targetNumber := rand.Intn(100) + 1 // 1から100の間のランダムな数字 // プレイヤーにゲームの説明を表示 fmt.Println("数字当てゲームへようこそ!") fmt.Println("1から100の間の数字を当ててください。") fmt.Printf("試行回数は最大で%d回です。\n", maxTries) // 試行を開始 for tries := 1; tries <= maxTries; tries++ { var guess int fmt.Printf("%d回目の試行: 数字を入力してください: ", tries) fmt.Scan(&guess) // プレイヤーが入力した数字とターゲットの数字を比較 if guess < targetNumber { fmt.Println("もっと大きな数字です。") } else if guess > targetNumber { fmt.Println("もっと小さな数字です。") } else { fmt.Printf("おめでとうございます!%d回目で正解です!\n", tries) return // ゲーム終了 } } // もしプレイヤーが全試行回数で当てられなかった場合 fmt.Printf("残念!正解は%dでした。\n", targetNumber) }
正解コードの解説
この解説では、Go言語を使って数字当てゲームを作成するコードの各部分を説明します。各文法がどのように機能しているかを理解し、Goプログラミングの基礎を学びましょう。
インポート文
import ( "fmt" "math/rand" "time" )
この部分では、プログラムで使用するパッケージをインポートしています。fmt
パッケージは、文字列を表示したり入力を受け取ったりするために使います。
math/rand
パッケージは、乱数を生成するために使用します。また、time
パッケージは、乱数生成のシードを設定するために使います。
これにより、プログラムを実行するたびに異なる乱数が生成されます。
定数の定義
const maxTries = 5 // プレイヤーが数字を当てるための試行回数
ここでは、プレイヤーが数字を当てるために最大で何回試行できるかを定義するための定数 maxTries
を宣言しています。
定数を使うことで、この値がコード内で変更されないことを保証します。
乱数生成のシード設定とターゲットナンバーの生成
rand.Seed
関数は乱数のシードを設定し、rand.Intn(100) + 1
で1から100までのランダムな数字を生成します。
シードを設定することで、プログラムが実行されるたびに異なる乱数が生成され、ゲームが面白くなります。
ゲームの開始メッセージを表示
fmt.Println("数字当てゲームへようこそ!") fmt.Println("1から100の間の数字を当ててください。") fmt.Printf("試行回数は最大で%d回です。\n", maxTries)
この部分では、プレイヤーに対してゲームの説明を表示します。ゲームが始まる前に、プレイヤーが何をすべきか、どのくらいの回数試行できるかを知らせます。
プレイヤーの試行をループで処理
for tries := 1; tries <= maxTries; tries++ { var guess int fmt.Printf("%d回目の試行: 数字を入力してください: ", tries) fmt.Scan(&guess) // プレイヤーが入力した数字とターゲットの数字を比較 if guess < targetNumber { fmt.Println("もっと大きな数字です。") } else if guess > targetNumber { fmt.Println("もっと小さな数字です。") } else { fmt.Printf("おめでとうございます!%d回目で正解です!\n", tries) return // ゲーム終了 } }
この部分では、for
ループを使ってプレイヤーが5回まで数字を入力できるようにしています。各試行で、プレイヤーが入力した数字とターゲットナンバーを比較し、その結果に応じてフィードバックを提供します。
- 入力した数字がターゲットナンバーより小さい場合、「もっと大きな数字です。」と表示されます。
- 入力した数字がターゲットナンバーより大きい場合、「もっと小さな数字です。」と表示されます。
- プレイヤーが正解した場合、試行回数と共に「おめでとうございます!」と表示され、ゲームが終了します。
プレイヤーが正解できなかった場合の処理
fmt.Printf("残念!正解は%dでした。\n", targetNumber)
この部分では、プレイヤーが5回試行しても正解できなかった場合に、正解の数字を表示してゲームを終了します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。