【Python】レッスン2-S3:じゃんけんゲームを作ろう

ながみえ
【Python学習記事のアイキャッチ画像】Lesson2-☆3 簡単なじゃんけんゲームを作ろう

一つ前のLessonでは数字当てゲームを作成しました。

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

Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:条件分岐(if-else文)を理解しよう
・Lesson2-3:条件分岐(if-elif-else文)を理解しよう
・Lesson2-4:条件分岐(match文)を理解しよう
・Lesson2-5:繰り返し処理(for文)を理解しよう
・Lesson2-6:繰り返し処理(while文)を理解しよう
・Lesson2-7:繰り返しの制御を理解しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理の基礎を理解しよう
・練習問題2-1:ハイアンドロー ゲームを作ろう
・練習問題2-2:数字当てゲームを作ろう
・練習問題2-3:簡単なじゃんけんゲームを作ろう ◁今回はココ
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)

Pythonのゲームコード一覧は こちらをクリック
Pythonでのゲームプリ開発は こちらをクリック

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-☆2 数字当てゲームを作ろう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

Pythonの学習の区切りを表し、記事一覧へ戻ることを促す画像

じゃんけんゲームを作ろう|if・while・例外処理・乱数で組み立てる

コンソールで動くじゃんけんゲームを作成します。

プレイヤーが手を選んでコンピュータと対戦し、結果(勝ち・負け・引き分け)を表示します。

入力の誤りに対応し、希望があれば何度でもプレイできるようにして、条件分岐・例外処理・繰り返し処理を総復習しましょう。

要件と仕様|乱数・入力・判定・再戦ループ

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

  • random モジュールをインポートし、各ラウンドごとにコンピュータの手をランダムに決定すること。
  • プレイヤーは 数値入力で手を選ぶ方式(0: グー / 1: チョキ / 2: パー) とすること。
  • 入力は input() で受け取り整数に変換し、数値でない場合は try/exceptValueError)で再入力を促すこと。
  • 0/1/2 以外の数値は範囲外として扱い、ループで再入力させること。
  • 有効な入力が得られたら、双方の手を表示し、条件分岐で勝敗を判定(引き分けを含む)して結果を出力すること。
  • 1ゲーム終了後に続行/終了を確認し、選択に応じて while ループで繰り返すこと(終了時はメッセージを出して終了)。

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

じゃんけんゲームを始めます!(グー:0, チョキ:1, パー:2)
あなたの選択(0/1/2): 1
あなたの手: チョキ
コンピュータの手: パー       
あなたの勝ちです!
もう一度遊びますか?(y/n): 

ヒント|難しいと感じる人だけ見よう

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

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

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

1:ゲーム開始と入力バリデーションの土台:モジュール準備→開始案内→二重ループで安全な入力受付を作る
 ・乱数を扱う標準モジュールを先頭でインポートする。
 ・最初にゲーム開始の案内文を表示して、入力の形式を明確にする。
 ・「ゲーム全体を繰り返す」ための外側の無限ループを用意する。
 ・入力チェック用に内側のループを作り、正しい値が来るまで抜けない構成にする。
 ・文字列入力を整数に直すときの失敗は例外処理で拾い、短いエラーメッセージで再入力を促す。
 ・数字であっても、許可された値(0/1/2)以外は範囲外として再入力に戻す。

2:手の決定と表示:乱数で相手の手を作り、数値を名前に変換して両者を見せる
 ・コンピュータの手は 0〜2 の整数を乱数で作る。
 ・数値→名前の変換は ifelifelse を使い、3通りを漏れなく網羅する。
 ・「プレイヤーの手」「コンピュータの手」をそれぞれ別の変数に入れておくと後続処理が書きやすい。
 ・表示はラベル付きで、どちらの手か一目でわかるメッセージにする。

3:勝敗判定:引き分け→勝ちの3条件→それ以外は負け、の順で結果を決める
 ・まずは同じ手かどうかを確認して、引き分けを最優先で処理する。
 ・プレイヤーが勝つパターンは3通りあることを整理してから条件を書き出す。
 ・複数の条件を一つにまとめるときは、論理演算を使って「どれか一つでも当てはまれば勝ち」にする。
 ・勝ちにも引き分けにも当てはまらなかった場合は、最後に負けとして処理する。
 ・条件が長くなるときは、読み手が理解しやすい並び順(手の対応関係)で並べるとミスが減る。

4:続行確認とループ終了:プレイ継続の意思をたずね、必要ならゲーム全体の繰り返しを止める
 ・続行確認の入力は小文字化してから判定すると表記ゆれに強い。
 ・条件は「y なら継続、それ以外は終了」のシンプルな形にする。
 ・終了時はわかりやすいメッセージを出したあと、外側のループを break で抜ける。
 ・継続の場合は特別な処理をせず、そのまま次の周回に進ませればよい。

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

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

import random

print("じゃんけんゲームを始めます!(0: グー, 1: チョキ, 2: パー)")

while True:
    # 入力バリデーション(数値・範囲チェック)
    while True:
        try:
            '''(穴埋め)プレイヤーの入力を整数として受け取る行を書く'''
            if player_choice == 0 or player_choice == 1 or player_choice == 2:
                '''(穴埋め)正しい入力なら内側ループを抜ける break を書く'''
            else:
                print("0, 1, 2 のいずれかを入力してください。")
        except ValueError:
            print("数字で入力してください。")

    # コンピュータの手をランダムに決定
    '''(穴埋め)コンピュータの手を 0〜2 の乱数で決める行を書く'''

    # 数値 → 手の名前
    '''(穴埋め)player_choice を "グー/チョキ/パー" に変換する if/elif/else ブロックを書く'''

    '''(穴埋め)computer_choice を "グー/チョキ/パー" に変換する if/elif/else ブロックを書く'''

    # 双方の手を表示
    print("あなたの手:", player_hand)
    print("コンピュータの手:", computer_hand)

    # 勝敗の判定
    if player_choice == computer_choice:
        print("引き分けです!")
    '''(穴埋め)プレイヤーが勝つ3条件を or でつないだ elif 行を書く(改行継続を含めてもよい)'''
        print("あなたの勝ちです!")
    else:
        print("あなたの負けです!")

    # 続行確認
    '''(穴埋め)続行可否を入力させて小文字化する行を書く'''
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

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

Pythonでゲームアプリを作ろう!

当サイトではテキストベースのゲームコードを多数紹介していますが、それだけでなく 画面上で遊べるゲームアプリ の作り方を紹介たコースも用意してあります。

Pythonの実践力強化にもなりますので、ぜひ挑戦して下さい^^

あわせて読みたい
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!

解答と解説|じゃんけんゲームのサンプルコード

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

解答例|じゃんけんゲームプログラム

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

Q
正解コード
import random

print("じゃんけんゲームを始めます!(0: グー, 1: チョキ, 2: パー)")

while True:
    # 入力バリデーション(数値・範囲チェック)
    while True:
        try:
            player_choice = int(input("あなたの選択(0/1/2): "))
            if player_choice == 0 or player_choice == 1 or player_choice == 2:
                break
            else:
                print("0, 1, 2 のいずれかを入力してください。")
        except ValueError:
            print("数字で入力してください。")

    # コンピュータの手をランダムに決定
    computer_choice = random.randint(0, 2)

    # 数値 → 手の名前
    if player_choice == 0:
        player_hand = "グー"
    elif player_choice == 1:
        player_hand = "チョキ"
    else:
        player_hand = "パー"

    if computer_choice == 0:
        computer_hand = "グー"
    elif computer_choice == 1:
        computer_hand = "チョキ"
    else:
        computer_hand = "パー"

    # 双方の手を表示
    print("あなたの手:", player_hand)
    print("コンピュータの手:", computer_hand)

    # 勝敗の判定
    if player_choice == computer_choice:
        print("引き分けです!")
    elif (player_choice == 0 and computer_choice == 1) or \
         (player_choice == 1 and computer_choice == 2) or \
         (player_choice == 2 and computer_choice == 0):
        print("あなたの勝ちです!")
    else:
        print("あなたの負けです!")

    # 続行確認
    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

解答例の解説|じゃんけんゲームの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

ゲーム開始と入力バリデーションの土台

import random

print("じゃんけんゲームを始めます!(0: グー, 1: チョキ, 2: パー)")

while True:
    # 入力バリデーション(数値・範囲チェック)
    while True:
        try:
            player_choice = int(input("あなたの選択(0/1/2): "))
            if player_choice == 0 or player_choice == 1 or player_choice == 2:
                break
            else:
                print("0, 1, 2 のいずれかを入力してください。")
        except ValueError:
            print("数字で入力してください。")

このパートでは、ゲームを動かす準備と「安全に入力を受け付ける仕組み」を整えます。
まず乱数を使うための標準モジュールを読み込み、ゲーム開始のメッセージを表示します。
次に、何度でも遊べるようにゲーム全体を囲む繰り返しを用意します。
その中で、プレイヤーの手を正しく入力してもらうための確認用ループをもう一つ作ります。
ここでは、入力が数字でない場合は例外処理で受け止め、数字であっても決められた範囲にない場合はやり直しを依頼します。
正しい入力が入ったときだけ次の処理へ進める、という流れを組み立てています。

手の決定と表示

    # コンピュータの手をランダムに決定
    computer_choice = random.randint(0, 2)

    # 数値 → 手の名前(リストを使わず if/elif で対応)
    if player_choice == 0:
        player_hand = "グー"
    elif player_choice == 1:
        player_hand = "チョキ"
    else:
        player_hand = "パー"

    if computer_choice == 0:
        computer_hand = "グー"
    elif computer_choice == 1:
        computer_hand = "チョキ"
    else:
        computer_hand = "パー"

    # 双方の手を表示
    print("あなたの手:", player_hand)
    print("コンピュータの手:", computer_hand)

このパートでは、まずコンピュータの手を乱数で決めます。
次に、プレイヤーとコンピュータの手を「0/1/2」という数値から「グー/チョキ/パー」という文字列へ変換します。
今回はまだリストを使わない前提なので、条件分岐を段階的に重ねて対応します。
変換ができたら、両者の手をわかりやすい文言で画面に表示し、次の勝敗判定へつなげます。

勝敗判定

    # 勝敗の判定
    if player_choice == computer_choice:
        print("引き分けです!")
    elif (player_choice == 0 and computer_choice == 1) or \
         (player_choice == 1 and computer_choice == 2) or \
         (player_choice == 2 and computer_choice == 0):
        print("あなたの勝ちです!")
    else:
        print("あなたの負けです!")

ここでは、プレイヤーとコンピュータの手を比べて結果を出します。
まず同じ手かどうかを最初に確認し、同じなら引き分けにします。
次に、プレイヤーが勝つパターンを3つに分けて考えます(グーはチョキに勝つ、チョキはパーに勝つ、パーはグーに勝つ)。
この3つのどれかに当てはまれば勝ち、それ以外は負けという流れです。
判定の順番を「引き分け → 勝ち → それ以外」と固定することで、条件が重ならず読みやすいコードになります。

続行確認とループ終了

    # 続行確認
    again = input("もう一度遊びますか?(y/n): ").lower()
    if again != 'y':
        print("ゲームを終了します。ありがとうございました!")
        break

このパートでは、1回の勝負が終わったあとにプレイヤーへ「もう一度遊ぶか」を確認します。
入力は大小の表記ゆれを避けるために小文字へそろえ、続行の合図(ここでは y)であれば次のラウンドへ進みます。
続行の合図でない入力が来た場合は、終了メッセージを表示して、ゲーム全体を包んでいる繰り返しを終了します。
これにより、ユーザーが好きなタイミングでゲームを終えられる、使い勝手の良い流れになります。

Pythonのゲームコード一覧は こちらをクリック
Pythonでのゲームアプリ開発は こちらをクリック

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-☆2 数字当てゲームを作ろう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

Pythonの学習の区切りを表し、記事一覧へ戻ることを促す画像
記事URLをコピーしました