【Kotlin】レッスン2-☆3:じゃんけんゲームの作り方|if文と乱数で勝敗を判定しよう

一つ前のページでは数字当てゲームを作成しました。
今回は 簡単なじゃんけんゲーム について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:if文による分岐処理を理解しよう
・Lesson2-3:when文による分岐処理を理解しよう
・Lesson2-4:スマートキャストを理解しよう
・Lesson2-5:for文による繰り返し処理を理解しよう
・Lesson2-6:while文による繰り返し処理を理解しよう
・Lesson2-7:繰り返しを制御しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理を理解しよう
・確認問題2-☆1:ハイアンドローゲームを作ろう
・確認問題2-☆2:数字当てゲームを作ろう
・確認問題2-☆3:簡単なじゃんけんゲームを作ろう ◁今回はココ
Lesson3:関数編
Lesson4:コレクション編
Lesson5:オブジェクト指向編
Kotlinのゲームコード一覧はこちら
確認問題|Kotlinで簡単なじゃんけんゲームを作ろう

簡単な「じゃんけん」ゲームを作成しましょう。
プレイヤーはグー、チョキ、パーのいずれかを選び、コンピューターと対戦します。
ゲーム終了後には、続けるかどうかをユーザーに問いかけ、続ける場合はもう一度プレイできるようにしてください。
この問題の要件
以下の要件に従ってコードを完成させてください。
- プログラム開始時に「じゃんけんゲームを始めます!」と表示すること。
- プレイヤーの手を数字で入力できるようにし、以下の選択肢を表示すること:
- グー:
0
- チョキ:
1
- パー:
2
- グー:
- 入力が無効(0, 1, 2以外)の場合は、「無効な入力です。もう一度入力してください。」と表示し、再入力を促すこと。
- コンピュータの手をランダムに選択すること。
- プレイヤーとコンピュータの手を「グー」「チョキ」「パー」の文字列に変換し、表示すること。
- ゲーム終了後に「もう一度遊びますか?(はい: y, いいえ: n)」と表示し、プレイヤーに続行の意志を尋ねること。
- プレイヤーが
y
を入力した場合、ゲームを繰り返すこと。y
以外を入力した場合は「ゲームを終了します。」と表示して終了すること。
ただし、以下のような実行結果となること。
じゃんけんゲームを始めます! じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 0 あなたの手: グー コンピューターの手: チョキ あなたの勝ちです! もう一度遊びますか?(はい: y, いいえ: n): y じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 1 あなたの手: チョキ コンピューターの手: チョキ 引き分けです! もう一度遊びますか?(はい: y, いいえ: n): n ゲームを終了します。
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:kotlin.random.Randomをインポート
2:main関数の定義
□ 「じゃんけんゲームを始めます!」と出力
□ do-whileループの開始
□ □ 「じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2):」と出力
□ □ 変数playerChoiceにreadLine()で入力された文字列をtoIntOrNull()で変換して代入
□ □ if文でplayerChoiceがnullまたは0〜2以外であるかを判定
□ □ □ 真の場合、「無効な入力です。もう一度入力してください。」と出力し、continueでループの先頭に戻る
□ □ 変数computerChoiceにRandom.nextInt(3)で0〜2のランダム整数を代入
□ □ when式でplayerChoiceを文字列(「グー」「チョキ」「パー」)に変換し、変数playerHandに代入
□ □ when式でcomputerChoiceを文字列(「グー」「チョキ」「パー」)に変換し、変数computerHandに代入
□ □ 「あなたの手: {playerHand}」と出力
□ □ 「コンピューターの手: {computerHand}」と出力
□ □ when式でplayerChoiceとcomputerChoiceを比較し、結果を変数resultに代入
□ □ □ 両者が同じ場合、「引き分けです!」を代入
□ □ □ 勝利条件の場合、「あなたの勝ちです!」を代入
□ □ □ それ以外の場合、「あなたの負けです!」を代入
□ □ 変数resultを出力
□ □ 「もう一度遊びますか?(はい: y, いいえ: n):」と出力
□ □ 変数continueGameにreadLine()で入力された文字列をlowercase()で変換して代入
□ □ if文でcontinueGameが”y”でない場合を判定
□ □ □ 真の場合、「ゲームを終了します。」と出力し、breakでループを終了
□ while文の条件として常にtrueを指定
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import kotlin.random.Random fun main() { println("じゃんけんゲームを始めます!") do { println("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2):") /* 【穴埋め問題1】 ここでプレイヤーの入力を整数に変換し、変数playerChoiceに代入するコードを書いてください。 無効な入力を考慮してください。 */ /* 【穴埋め問題2】 コンピューターの手をランダムに決定するコードを書いてください。 */ /* 【穴埋め問題3】 ここでwhen文を使ってplayerChoiceを「グー」「チョキ」「パー」の文字列に変換し、 変数playerHandに代入するコードを書いてください。 */ /* 【穴埋め問題4】 ここでwhen文を使ってcomputerChoiceを「グー」「チョキ」「パー」の文字列に変換し、 変数computerHandに代入するコードを書いてください。 */ println("あなたの手: $playerHand") println("コンピューターの手: $computerHand") /* 【穴埋め問題5】 ここでwhen文を使い、playerChoiceとcomputerChoiceの勝敗を判定して結果を変数resultに代入するコードを書いてください。 */ println(result) println("もう一度遊びますか?(はい: y, いいえ: n):") val continueGame = readLine()?.lowercase() if (continueGame != "y") { println("ゲームを終了します。") break } } while (true) }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
練習問題の解答と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
import kotlin.random.Random fun main() { println("じゃんけんゲームを始めます!") do { println("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2):") val playerChoice = readLine()?.toIntOrNull() if (playerChoice == null || playerChoice !in 0..2) { println("無効な入力です。もう一度入力してください。") continue } val computerChoice = Random.nextInt(3) val playerHand = when (playerChoice) { 0 -> "グー" 1 -> "チョキ" 2 -> "パー" else -> "不明な手" } val computerHand = when (computerChoice) { 0 -> "グー" 1 -> "チョキ" 2 -> "パー" else -> "不明な手" } println("あなたの手: $playerHand") println("コンピューターの手: $computerHand") val result = when { playerChoice == computerChoice -> "引き分けです!" (playerChoice == 0 && computerChoice == 1) || (playerChoice == 1 && computerChoice == 2) || (playerChoice == 2 && computerChoice == 0) -> "あなたの勝ちです!" else -> "あなたの負けです!" } println(result) println("もう一度遊びますか?(はい: y, いいえ: n):") val continueGame = readLine()?.lowercase() if (continueGame != "y") { println("ゲームを終了します。") break } } while (true) }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
ランダム数生成の準備
import kotlin.random.Random
kotlin.random.Random
はランダムな数値を生成するためのクラスです。このコードでは、コンピュータがランダムにじゃんけんの手を選ぶために使用します。
メイン関数の定義
fun main() { println("じゃんけんゲームを始めます!")
fun main()
はプログラムのエントリーポイントです。main
関数の中にゲームのすべてのロジックが記述されています。println
は画面にメッセージを出力する関数で、ここではゲームの開始メッセージを表示しています。
繰り返し処理 (
do-while
ループ)do { // ゲームのロジック } while (true)
do-while
ループは条件が成立する限りブロックを繰り返します。この場合、プレイヤーが「ゲーム終了」を選ぶまでループが続きます。
プレイヤーの入力処理
println("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2):") val playerChoice = readLine()?.toIntOrNull() if (playerChoice == null || playerChoice !in 0..2) { println("無効な入力です。もう一度入力してください。") continue }
readLine()
はユーザーからの入力を読み取ります。toIntOrNull()
は入力された文字列を整数に変換しますが、変換できない場合はnull
を返します。- 条件式で入力が無効かどうかを確認し、無効なら再入力を促します。
コンピュータの手をランダムに選ぶ
val computerChoice = Random.nextInt(3)
Random.nextInt(3)
は0から2の間でランダムな整数を生成します(上限の3は含まない)。- これによりコンピュータのじゃんけんの手がランダムに決まります。
選択した手を文字列に変換
val playerHand = when (playerChoice) { 0 -> "グー" 1 -> "チョキ" 2 -> "パー" else -> "不明な手" }
when
構文は条件によって処理を分岐するために使います。ここではプレイヤーとコンピュータの手(0, 1, 2)をそれぞれ「グー」「チョキ」「パー」に変換しています。
勝敗の判定
val result = when { playerChoice == computerChoice -> "引き分けです!" (playerChoice == 0 && computerChoice == 1) || (playerChoice == 1 && computerChoice == 2) || (playerChoice == 2 && computerChoice == 0) -> "あなたの勝ちです!" else -> "あなたの負けです!" }
- 再び
when
を使用して勝敗を判定します。 - 勝利条件を具体的に記述し、条件に合致した場合に適切な結果を表示します。
ゲームの継続確認
println("もう一度遊びますか?(はい: y, いいえ: n):") val continueGame = readLine()?.lowercase() if (continueGame != "y") { println("ゲームを終了します。") break }
プレイヤーが
y
を入力した場合にゲームを続行し、それ以外ではループを終了します。
まとめ
このコードを通じて以下のポイントを学べます。
do-while
ループの使い方: 条件に応じて処理を繰り返す。- ユーザー入力の検証: 無効な入力に対する処理方法。
- 条件分岐(
when
構文): 複雑な条件の分岐処理。 - ランダムな数値生成: ゲームのコンピュータロジックでの応用。
じゃんけんゲームの実装を通して、Kotlinの基本的な構文やプログラムの流れを学ぶことができました。
このコードをベースにして、さらに複雑なゲームや機能を作ってみてください!
Kotlinのゲームコード一覧はこちら