Go練習問題2-☆2:簡単なじゃんけんゲームを作ろう

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

Go言語の初心者向け問題2-☆2:簡単なじゃんけんゲームを作ろう

この問題を解くために必要な知識:
レベル1の知識、論理演算子と代入演算子、条件分岐、ループ処理、ラベルとgoto文、無限ループ、配列、スライスとキャパシティ、整列と検索、マップ

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

Go練習問題2-☆2:簡単なじゃんけんゲームを作ろう




簡単なじゃんけんゲームを作成しましょう。

このプログラムでは、プレイヤーとコンピュータが「グー」「チョキ」「パー」のいずれかを選択し、結果を表示します。

プレイヤーが選択した手とコンピュータがランダムに選んだ手を比較し、勝敗を判定して画面に表示するプログラムを作成してください。

この問題の要件

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

  1. 定数として「グー」「チョキ」「パー」を定義すること。
  2. プレイヤーが入力した手を取得し、その入力に基づいて「グー」「チョキ」「パー」のいずれかを選択させること。
  3. プレイヤーの手とコンピュータの手を比較し、勝敗を判定する関数を作成すること。
  4. 勝敗の結果を「引き分け」「あなたの勝ち」「コンピュータの勝ち」のいずれかとして画面に表示すること。
  5. fmt パッケージをインポートし、入出力操作を行うこと。
  6. math/rand パッケージをインポートし、乱数生成を行うこと。
  7. time パッケージをインポートし、乱数のシードを設定すること。
  8. コンピュータの手をランダムに選択するロジックを実装すること。以下の手順に従うこと:
    • rand.Seed(time.Now().UnixNano()) を使って現在の時間に基づいたシードを設定すること。
    • rand.Intn(選択肢数) を使って 0 から 2 までの乱数を生成し、その値をコンピュータの選択とすること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

じゃんけんゲームへようこそ!
以下から選択してください:
0: グー
1: チョキ
2: パー
あなたの選択は: 1
あなたの手: チョキ
コンピュータの手: パー
結果: あなたの勝ち

この問題を解くヒント

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

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

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

1.import文
 1-1. fmt パッケージのインポート
 1-2. math/rand パッケージのインポート
 1-3. time パッケージのインポート

2.main関数の定義
 2-1. 定数の定義
  2-1-1. グー, チョキ, パー, 選択肢数 の定義
 2-2. 手の名前 スライスの定義
 2-3. プレイヤーの選択肢を取得するための関数定義
  2-3-1. プレイヤーに選択肢を表示
  2-3-2. プレイヤーからの入力を受け取り、その選択を返す
 2-4. コンピュータの選択肢をランダムに生成するための関数定義
  2-4-1. rand.Seed で現在の時間に基づいて乱数のシードを設定
  2-4-2. rand.Intn で 0 から 選択肢数 までの乱数を生成し、コンピュータの選択とする
 2-5. 勝敗を判定するための関数定義
  2-5-1. プレイヤーとコンピュータの選択肢が同じ場合は「引き分け」
  2-5-2. プレイヤーの勝ちの条件を判定し、「あなたの勝ち」と返す
  2-5-3. その他の条件(コンピュータの勝ち)を判定し、「コンピュータの勝ち」と返す
 2-6. メインロジック
  2-6-1. プレイヤーの手を取得し、コンピュータの手をランダムに生成
  2-6-2. プレイヤーとコンピュータの手を表示
  2-6-3. 勝敗を判定し、結果を表示

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

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

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// プレイヤーの選択肢を示す定数
	const (
		グー     = 0
		チョキ   = 1
		パー     = 2
		選択肢数 = 3
	)

	// プレイヤーの選択肢に対応する名前
	手の名前 := []string{"グー", "チョキ", "パー"}

	// プレイヤーの選択肢を取得するロジック
	プレイヤーの手を選ぶ := func() int {
		var 選択 int
		fmt.Println("じゃんけんゲームへようこそ!")
		fmt.Println("以下から選択してください:")
		fmt.Println("0: グー")
		fmt.Println("1: チョキ")
		fmt.Println("2: パー")
		fmt.Print("あなたの選択は: ")
		fmt.Scan(&選択)
		return 選択
	}

	// コンピュータの選択肢をランダムに生成するロジック
	コンピュータの手を選ぶ := func() int {
		rand.Seed(time.Now().UnixNano()) // 現在の時間に基づいて乱数のシードを設定
		return rand.Intn(選択肢数)       // 0から選択肢数(3)までの乱数を生成
	}

	// 【穴埋め問題1】
	// ここに勝敗を判定するためのロジックを記述してください。
	// プレイヤーとコンピュータの手を比較し、「引き分け」「あなたの勝ち」「コンピュータの勝ち」を返すコードを書いてください。

	// メインロジック
	プレイヤーの手 := プレイヤーの手を選ぶ()
	コンピュータの手 := コンピュータの手を選ぶ()

	fmt.Printf("あなたの手: %s\n", 手の名前[プレイヤーの手])
	fmt.Printf("コンピュータの手: %s\n", 手の名前[コンピュータの手])

	結果 := 勝敗を判定(プレイヤーの手, コンピュータの手)
	fmt.Println("結果:", 結果)
}

 

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

解答例と解説

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

正解コードの例

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

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// プレイヤーの選択肢を示す定数
	const (
		グー     = 0
		チョキ   = 1
		パー     = 2
		選択肢数 = 3
	)

	// プレイヤーの選択肢に対応する名前
	手の名前 := []string{"グー", "チョキ", "パー"}

	// プレイヤーの選択肢を取得するロジック
	プレイヤーの手を選ぶ := func() int {
		var 選択 int
		fmt.Println("じゃんけんゲームへようこそ!")
		fmt.Println("以下から選択してください:")
		fmt.Println("0: グー")
		fmt.Println("1: チョキ")
		fmt.Println("2: パー")
		fmt.Print("あなたの選択は: ")
		fmt.Scan(&選択)
		return 選択
	}

	// コンピュータの選択肢をランダムに生成するロジック
	コンピュータの手を選ぶ := func() int {
		rand.Seed(time.Now().UnixNano())
		return rand.Intn(選択肢数)
	}

	// 勝敗を判定するロジック
	勝敗を判定 := func(プレイヤーの手, コンピュータの手 int) string {
		// 勝敗の判定ロジック
		if プレイヤーの手 == コンピュータの手 {
			return "引き分け"
		} else if (プレイヤーの手 == グー && コンピュータの手 == チョキ) ||
			(プレイヤーの手 == チョキ && コンピュータの手 == パー) ||
			(プレイヤーの手 == パー && コンピュータの手 == グー) {
			return "あなたの勝ち"
		} else {
			return "コンピュータの勝ち"
		}
	}

	// メインロジック
	プレイヤーの手 := プレイヤーの手を選ぶ()
	コンピュータの手 := コンピュータの手を選ぶ()

	fmt.Printf("あなたの手: %s\n", 手の名前[プレイヤーの手])
	fmt.Printf("コンピュータの手: %s\n", 手の名前[コンピュータの手])

	結果 := 勝敗を判定(プレイヤーの手, コンピュータの手)
	fmt.Println("結果:", 結果)
}

正解コードの解説

じゃんけんゲームのGoコードの各部分を初心者向けに説明します。このコードがどのように動作するのかを理解し、Goプログラミングの基礎を学びましょう。

インポート文

import (
	"fmt"
	"math/rand"
	"time"
)

最初に、fmt パッケージをインポートしています。これは、文字列やデータを出力するために使用します。

また、math/rand パッケージは乱数を生成するために使います。time パッケージは、乱数生成のシードを設定するために使用します。

これにより、プログラムを実行するたびに異なる乱数が生成されるようになります。

定数の定義

const (
	グー     = 0
	チョキ   = 1
	パー     = 2
	選択肢数 = 3
)

ここでは、じゃんけんの3つの手である「グー」「チョキ」「パー」を表す定数を定義しています。

各手は0から2までの整数で表され、選択肢数を3として定義しています。これにより、プログラム全体でこれらの定数を使ってじゃんけんの手を扱うことができます。

手の名前の定義

手の名前 := []string{"グー", "チョキ", "パー"}

この行では、じゃんけんの手に対応する名前を文字列のスライスとして定義しています。このスライスを使って、後でプレイヤーとコンピュータの手を表示します。

プレイヤーの選択肢を取得するロジック

プレイヤーの手を選ぶ := func() int {
	var 選択 int
	fmt.Println("じゃんけんゲームへようこそ!")
	fmt.Println("以下から選択してください:")
	fmt.Println("0: グー")
	fmt.Println("1: チョキ")
	fmt.Println("2: パー")
	fmt.Print("あなたの選択は: ")
	fmt.Scan(&選択)
	return 選択
}

この部分では、プレイヤーがじゃんけんの手を選択するための入力を取得しています。fmt.Scan を使用してプレイヤーの選択を整数として受け取り、その値を返します。

コンピュータの選択肢をランダムに生成するロジック

コンピュータの手を選ぶ := func() int {
	rand.Seed(time.Now().UnixNano()) // 現在の時間に基づいて乱数のシードを設定
	return rand.Intn(選択肢数)       // 0から選択肢数(3)までの乱数を生成
}

ここでは、コンピュータがじゃんけんの手をランダムに選択するためのロジックを定義しています。

rand.Seed で乱数のシードを現在の時間に基づいて設定し、rand.Intn を使って0から2までの乱数を生成し、その結果をコンピュータの手として返します。

勝敗を判定するロジック

勝敗を判定 := func(プレイヤーの手, コンピュータの手 int) string {
	if プレイヤーの手 == コンピュータの手 {
		return "引き分け"
	} else if (プレイヤーの手 == グー && コンピュータの手 == チョキ) ||
		(プレイヤーの手 == チョキ && コンピュータの手 == パー) ||
		(プレイヤーの手 == パー && コンピュータの手 == グー) {
		return "あなたの勝ち"
	} else {
		return "コンピュータの勝ち"
	}
}

この部分は、プレイヤーとコンピュータの手を比較して勝敗を決定するロジックです。

同じ手を選んだ場合は引き分けとし、勝利条件に応じて「あなたの勝ち」または「コンピュータの勝ち」を返します。

メインロジック

プレイヤーの手 := プレイヤーの手を選ぶ()
コンピュータの手 := コンピュータの手を選ぶ()

fmt.Printf("あなたの手: %s\n", 手の名前[プレイヤーの手])
fmt.Printf("コンピュータの手: %s\n", 手の名前[コンピュータの手])

結果 := 勝敗を判定(プレイヤーの手, コンピュータの手)
fmt.Println("結果:", 結果)

ここでは、プレイヤーの手とコンピュータの手を取得し、それぞれの手を表示します。最後に、勝敗を判定 関数を使って結果を判定し、その結果を表示します。

これにより、じゃんけんの結果が出力されます。

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

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

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

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






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