はじめに
Goを学び始めたので、練習も兼ねて 数字当てゲーム を作ってみました。
今回は「1〜100の数字を当てるゲーム」を例に、コードの解説と遊び方を紹介します。
作るゲームのルール
- コンピュータが1〜100の数字をランダムで選ぶ
- プレイヤーは数字を予想して入力
- 入力ごとに「もっと大きい」「もっと小さい」でヒントをもらえる
- 最大5回まで予想可能
- 最後にこれまでの予想履歴を表示
コード全体
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 乱数の初期化
rand.Seed(time.Now().UnixNano())
// 1~100の数字。正解の数字
target := rand.Intn(100) + 1
// 回数制限
maxAttempts := 5
// 予想した数字を記録する
guesses := []int{}
var guess int
fmt.Println("数字当てゲーム! 1~100の数字を当ててね")
// 最後に必ず履歴を出す
defer func() {
fmt.Println("あなたの予想履歴:", guesses)
}()
for i := 1; i <= maxAttempts; i++ {
fmt.Print("予想した数字を入力: ")
_, err := fmt.Scan(&guess)
if err != nil {
fmt.Println("数字を入力してね")
continue
}
// 入力した数字を記録
guesses = append(guesses, guess)
if guess < target {
fmt.Println("もっと大きいよ!")
} else if guess > target {
fmt.Println("もっと小さいよ!")
} else {
fmt.Println("正解!")
return
}
}
fmt.Printf("残念!正解は%dでした!\n", target)
}
コードのポイント
-
乱数の初期化
rand.Seed(time.Now().UnixNano())
-
time.Now().UnixNano()
を渡すことで、毎回違う乱数が生成されます
-
-
予想回数と履歴
maxAttempts := 5 guesses := []int{}
- Sliceを使って入力履歴を管理する練習にもなります
- 回数制限を設けることで、ゲームに緊張感を出すことができます
-
guesses
に入力履歴を保存して最後に表示させる仕組みです
-
入力と条件判定
_, err := fmt.Scan(&guess) if guess < target { fmt.Println("もっと大きいよ!") }
- 標準入力から数字を読み取ります
- 条件に応じて「もっと大きいよ!」「もっと小さいよ!」のヒントを出します
-
deferで履歴表示
defer func() { fmt.Println("あなたの予想履歴:", guesses) }()
-
defer
をつけると必ず最後に実行されます - ゲーム終了時に履歴を表示できる便利な方法です
-
実行例
数字当てゲーム! 1~100の数字を当ててね
予想した数字を入力: 50
もっと小さいよ!
予想した数字を入力: 25
もっと大きいよ!
予想した数字を入力: 37
正解!
あなたの予想履歴: [50 25 37]
まとめ・応用アイデア
-
ChatGPTと相談しながら、学習にもなる数当てゲームを作成することができました
-
応用例として以下が考えられます
- 回数制限を変更
- 範囲を1〜1000に拡大
- GUI化してより遊びやすくする