【Kotlin】確認問題2-☆3:簡単なじゃんけんゲームを作ろう

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

この記事の練習問題で使用する知識:
メイン関数入力と出力の基本コメントの書き方変数と定数Null安全性文字列の連結と埋め込みimport文比較演算子と論理演算子if文による分岐処理when文による分岐処理while文による繰り返し処理繰り返しの制御

Kotlinのゲームコード一覧はこちら

<<前のページ Kotlin記事一覧 次のページ>>

確認問題:簡単なじゃんけんゲームを作ろう





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

プレイヤーはグー、チョキ、パーのいずれかを選び、コンピューターと対戦します。

ゲーム終了後には、続けるかどうかをユーザーに問いかけ、続ける場合はもう一度プレイできるようにしてください。

この問題の要件

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

  1. プログラム開始時に「じゃんけんゲームを始めます!」と表示すること。
  2. プレイヤーの手を数字で入力できるようにし、以下の選択肢を表示すること:
    • グー: 0
    • チョキ: 1
    • パー: 2
  3. 入力が無効(0, 1, 2以外)の場合は、「無効な入力です。もう一度入力してください。」と表示し、再入力を促すこと。
  4. コンピュータの手をランダムに選択すること。
  5. プレイヤーとコンピュータの手を「グー」「チョキ」「パー」の文字列に変換し、表示すること。
  6. ゲーム終了後に「もう一度遊びますか?(はい: y, いいえ: n)」と表示し、プレイヤーに続行の意志を尋ねること。
  7. プレイヤーが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を入力した場合にゲームを続行し、それ以外ではループを終了します。

まとめ

このコードを通じて以下のポイントを学べます。

  1. do-whileループの使い方: 条件に応じて処理を繰り返す。
  2. ユーザー入力の検証: 無効な入力に対する処理方法。
  3. 条件分岐(when構文): 複雑な条件の分岐処理。
  4. ランダムな数値生成: ゲームのコンピュータロジックでの応用。

じゃんけんゲームの実装を通して、Kotlinの基本的な構文やプログラムの流れを学ぶことができました。

このコードをベースにして、さらに複雑なゲームや機能を作ってみてください!

Kotlinのゲームコード一覧はこちら

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

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

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






    Kotlinのテキスト&問題集トップへ戻る
    トップページへ戻る