Python

【Python】ジャンケンを実装してみよう!

この記事では、Pythonでジャンケンを実装してみます。

ジャンケンは、

  • クラス
  • 辞書
  • if文
  • while文
  • 例外処理
  • randomモジュール
  • timeモジュール

などを使うことで実装することができます。

クラスで実装する必要はありませんが、のちに機能を追加するときに楽なのでクラスで実装することにしました。

それでは、ジャンケンを実装していきましょう!

ジャンケンについて考える

まずはジャンケンについて少し整理しておきましょう!

じゃんけんは以下のように行われます。

  1. 手を決める
  2. 勝敗判定
  3. リザルト表示

これらを実装することでジャンケンを表現できます。

ディレクトリ・ファイルの作成

今回作業するディレクトリとファイルを作ります。

デスクトップにtest_jankenディレクトリを作成し、その中にmain.pyjanken.pyを作成してください。

以下のような感じですね。

それでは次はコードを書いていきましょう!

janken.py

janken.pyにJankenクラスを作成していきます。

以下のコードをjanken.pyに記述してください。

janken.py

import random
import time

# じゃんけんクラス
class Janken:
    pass

今回、randomモジュールとtimeモジュールを使うのでインポートしておきます。

空のJankenクラスを定義したので、このクラスに機能(メソッド)を追加していきましょう!

手を決める

出す手を外部から受け取る_choise_hand()メソッドを作成します。

変数名やメソッド名の先頭に「_(アンダーバー)」を付けることで外部から呼び出さない(呼び出してほしくない)変数やメソッドであることを表しています。

input関数

コード内から値を受け取るにはinput関数を使います。

グー、チョキ、パーと入力するのは面倒なので数字で受け取るようにしましょう!
ちなみに、input関数は値を文字列で受け取るのでint()で整数に変換しています。

hand = int(input('グー(0), チョキ(1), パー(2): '))

エラーが起きてしまう…

しかし、これでは整数に変換できない値範囲外の値が渡されたときにエラーになってしまいます。

なので、「無限ループ」と「例外処理」を用いて期待される値が入力されるまでループさせます。その際に辞書を用意して0,1,2からグーチョキパーを取得できるようにします。

# じゃんけんクラス
class Janken:

    # コンストラクタ
    def __init__(self):
        # 手を格納した辞書
        self._hand_dict = {0: 'グー', 1: 'チョキ', 2: 'パー'}  

    # 手を受け取る
    def _choice_hand(self):
        # 無限ループ
        while 1:
            # 例外処理
            try:
                # 外部から受け取った値をintに変換し、_hand_dictからグーチョキパーのどれかを受け取る
                # intに変換できない場合と_hand_dictから値を取得できない場合にエラーが発生
                hand = self._hand_dict[int(input('グー(0), チョキ(1), パー(2): '))]
                # 上の行でエラーが発生しなければ下のbreakが処理される
                break

            # try内でエラーが起きたら処理される
            except:
                print('0~2の整数を入力してください')
        return hand

これで期待した値が入力されるまでループします。

勝敗判定

次に勝敗を判定するresultメソッドを作成します。

勝敗判定をするにはif文を使います。
引数で自分と相手の手を受け取り、その組み合わせによって返す値を変更します。

# 勝敗判定(0:あいこ, 1: 勝ち, -1: 負け)
def _result(self, player_hand, cpu_hand):
    # あいこ
    if player_hand == cpu_hand:
        return 0
    # それ以外
    else:
        if player_hand == 'グー':
            if cpu_hand == 'チョキ':
                return 1
            else:
                return -1
        elif player_hand == 'チョキ':
            if cpu_hand == 'グー':
                return -1
            else:
                return 1
        else:
            if cpu_hand == 'グー':
                return 1
            else:
                return -1

0をあいこ、1を勝ち、-1を負けとして戻り値を返しています。

リザルト表示

結果を出力する_print_resultメソッドを作成します。

# リザルト出力
def _print_result(self, result):
    if result == 0:
        print('あいこで...')
    elif result == 1:
        print('あなたの勝ちです!')
    else:
        print('あなたの負けです...')

勝負結果によって出力する文字を変更するだけのコードです。

実行する

ジャンケンを実行するrunメソッドを作成します。

このメソッドを外部から呼び出すことでジャンケンできるようにします。

# ゲーム開始
def run(self):

    # 結果を受け取る変数
    result = 0
    # あいこの場合にループさせる
    while result == 0:

        # 手を受け取る
        player_hand = self._choice_hand()
        cpu_hand = self._hand_dict[random.randint(0, 2)]

        # 出した手を出力
        print(f'あなたは{player_hand}を出しました!')
        time.sleep(1)
        print(f'CPUは{cpu_hand}を出しました!')

        # 勝敗判定
        result = self._result(player_hand, cpu_hand)

        time.sleep(1)
        # 結果を出力
        self._print_result(result)

分解して見てみましょう!

あいこはループ

# 結果を受け取る変数
result = 0
# あいこの場合にループさせる
while result == 0:
    ・
    ・
    ・

あいこだった場合はもう一回ジャンケンするのでresult変数によってループさせます。

手を受け取る

# 手を受け取る
player_hand = self._choice_hand()
cpu_hand = self._hand_dict[random.randint(0, 2)]

player_handに_choice_handメソッドで受けとった手を渡します。

CPUには、randomモジュールのrandint関数を使って0~2の整数をランダムに生成し、手を取得します。

出した手を出力

# 出した手を出力
print(f'あなたは{player_hand}を出しました!')
time.sleep(1)
print(f'CPUは{cpu_hand}を出しました!')

高速で表示されてしまうと味気ないので、timeモジュールのsleep関数で1秒待ってから相手の手を表示させてます。

勝敗判定

# 勝敗判定
result = self._result(player_hand, cpu_hand)

勝敗判定をresultに渡します。

結果の出力

time.sleep(1)
# 結果を出力
self._print_result(result)

1秒待って結果を出力します。

Jankenクラス

最終的にJankenクラスは以下のようになりました。

import random
import time

# じゃんけんクラス
class Janken:

    def __init__(self):
        self._hand_dict = {0: 'グー', 1: 'チョキ', 2: 'パー'}  

    # ゲーム開始
    def run(self):
        result = 0
        while result == 0:
            player_hand = self._choice_hand()
            cpu_hand = self._hand_dict[random.randint(0, 2)]
            print(f'あなたは{player_hand}を出しました!')
            time.sleep(1)
            print(f'CPUは{cpu_hand}を出しました!')

            result = self._result(player_hand, cpu_hand)
            time.sleep(1)
            self._print_result(result)
    
    # 手を受け取る
    def _choice_hand(self):
        while 1:
            try:
                hand = self._hand_dict[int(input('グー(0), チョキ(1), パー(2): '))]
                break
            except:
                print('0~2の整数を入力してください')
        return hand


     # 勝敗判定(0:あいこ, 1: 勝ち, -1: 負け)
    def _result(self, player_hand, cpu_hand):
        # あいこ
        if player_hand == cpu_hand:
            return 0
        # それ以外
        else:
            if player_hand == 'グー':
                if cpu_hand == 'チョキ':
                    return 1
                else:
                    return -1
            elif player_hand == 'チョキ':
                if cpu_hand == 'グー':
                    return -1
                else:
                    return 1
            else:
                if cpu_hand == 'グー':
                    return 1
                else:
                    return -1
    
    # リザルト出力
    def _print_result(self, result):
        if result == 0:
            print('あいこで...')
        elif result == 1:
            print(f'あなたの勝ちです!')
        else:
            print(f'あなたの負けです...')

main.py

それでは、main.pyからJankenを呼び出しましょう!

# Jankenクラスのインポート
from janken import Janken

if __name__ == "__main__":
    # インスタンス化
    j = Janken()
    # ジャンケン実行
    j.run()

実行

準備が整ったのでmain.pyをターミナルから実行してみましょう!

test_jankenに移動

$ cd Desktop/test_janken/

main.pyを実行

$ python main.py 
グー(0), チョキ(1), パー(2): 1
あなたはチョキを出しました!
CPUはチョキを出しました!
あいこで...
グー(0), チョキ(1), パー(2): 1
あなたはチョキを出しました!
CPUはグーを出しました!
あなたの負けです...

これでじゃんけんが実行できました。お疲れ様です!

まとめ

この記事では、Pythonでじゃんけんを実装してみました!
今回実装したものはとてもシンプルなので、いろいろ機能を追加してみてください。

例えば、

  • プレイヤーの名前を受け取って名前で表示する
  • 連戦できるようにする
  • 勝敗数を記録する

などいろいろ追加できます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職「DMM WEBCAMP COMMIT」
なんと転職成功率98%!
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!