『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

Pythonでじゃんけん

Pythonでじゃんけん

人間のプレイヤーとコンピュータが じゃんけん をして勝敗を表示するプログラムを作ってみましょう。プレイヤーの出す手は「グー, チョキ, パー」の 3 通りです。それぞれの手に対してコンピュータの出す手も「グー, チョキ, パー」の 3 通りなので、その組み合わせは全部で 3 × 3 = 9 通りあります。とはいえ、9 通りの分枝を記述するのは大変なので少し工夫します。そのために、じゃんけんの手のそれぞれに、
 
 グー: 0 点, チョキ: 1 点, パー: 2 点
 
という数字を割り当てて、次のような判定スコアを定義します。
 
 じゃんけん判定スコア = [プレイヤーの手 - コンピュータの手 + 3] Mod 3
 
ここで、a Mod b は a を b で割ったときの余りを得る演算を意味します。Python では % が Mod に相当する演算子です。たとえば、プレイヤーがパー、コンピュータがグーを出したとすると、判定スコアは
 
 (2 – 1 + 3) Mod 3 = 1
 
となります。同じように、すべての手の組み合わせについて判定スコアを計算すると、下の表のようになります。

プレイヤーの手 コンピュータの手 スコア 勝敗
グー グー 0 引き分け
グー チョキ 2 勝ち
グー パー 1 負け
チョキ グー 1 負け
チョキ チョキ 0 引き分け
チョキ パー 2 勝ち
パー グー 2 勝ち
パー チョキ 1 負け
パー パー 0 引き分け

表を見ると、判定スコアが 0 のときは引き分け、1 のときはプレイヤーの負け、2 のときはプレイヤーの勝ちとなっていることがわかります。判定スコアを使うと、条件分枝 は 3 通りで済みます。Python での実装は次のようになります。

import random

# じゃんけん判定関数
def judge():

    # じゃんけんの手のリスト
    hand = ["グー", "チョキ", "パー"]

    # プレイヤーの手を入力
    x = input("手を選んでください\n0:グー, 1:チョキ, 2:パー\n\n")

    x = int(x)

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

    # 双方の出した手を表示
    print("\nあなたの手:{}".format(hand[x]))
    print("コンピュータの手:{}\n".format(hand[y]))

    score = (x - y + 3) % 3
    if score == 0:
        j = "引き分けです"
    elif score == 1:
        j = "あなたの負けです"
    else:
        j = "あなたの勝ちです"
    print(j)

# 勝敗を表示
judge()

'''実行結果の例
手を選んでください
0:グー, 1:チョキ, 2:パー

1

あなたの手:チョキ
コンピュータの手:パー

あなたの勝ちです
'''

コードを実行すると手の入力が促されるので、数値で選択してください。コンピュータの手はランダムに選ばれて、お互いの出した手と勝敗が表示されます。

コメント

  1. あとりえこばと より:

    【技術英語の豆知識】じゃんけんを英語で rock-paper-scissors といいます。
    rock は石、paper は紙、scissors はハサミです。

    地域によって、rock の代わりに stone (石) を使うこともあるようです。
    「じゃんけんぽん」の掛け声も “Rock, Paper, Scissors” です。

    う~ん。「じゃんけんぽん」のリズムに慣れた日本人としては、ちょっと長いなあと思ってしまいますね。世界中に “Janken, Pon!” を流行らせてみてはどうでしょうか。これから海外に行く予定の方、どうかお願いします (←人任せかよ)。とはいえ、ゲームの内容を言い表すなら英語のほうが自然ですよね。どうして日本人は「じゃんけん」と呼ぶのでしょうか。知っている方がいたらぜひ教えてください。ちなみに、関西ではじゃんけんをインジャンといいますが、インジャンの語源もよくわかりません。

  2. はじめてです より:

    ずぶの初心者です。
    このまま実行したら、最後のjudge(x, y)で
    NameError: name ‘x’ is not defined
    が出てしまいました。。。xとyに初期値を与えるとできましたがそれでいいのやら??

    • あとりえこばと より:

      申し訳ありません。こちらのミスです。
      x,yは関数内部で使う変数なので、judge()関数に引数は必要ないです。
      2箇所あるjudge(x,y)をjudge()に書き直せば、コードは動くはずです。
      記事のほうも訂正しておきました。
      ご迷惑をおかけしました。m(_ _)m