【じゃんけん実装例】演習で身に付けるpythonプログラミング【vol. 1】

【再掲】リクエスト:じゃんけんゲームの作成

コンピュータとじゃんけんをするプログラムを作成してください。

レベル1:コンピュータとのタイマン

コンピュータはひとりとして、プレイヤーの手を入力すると、コンピュータとのじゃんけんの結果が返ってくるようにしてください。
(想定外の入力はないものとします)

実装例

import numpy as np

# 定数定義
N_HAND = 3 # じゃんけんの手の種類
ROCK = 0
SCISSORS = 1
PAPER = 2

class Cpu(object):
    """ CPUを作成するクラス
    Attributes:
        hand (int): じゃんけんの手(グー(0)、チョキ(1)、パー(2))
    """
    def __init__(self):
        self.hand = np.random.randint(N_HAND)

    def get_hand(self):
        """
        じゃんけんの手を決める。
        Args:
            None        
        Returns:
            None 
        """
        self.hand = np.random.randint(N_HAND)

def judge_janken(my_hand, cpu_hand):
    """
    じゃんけんの勝敗結果を返す  
    Args:
        my_hand (int): プレイヤーの手
        cpu_hand (int): CPUの手
    Returns:
        result (int): 0:勝ち, 1:負け, 2:引き分け
    """
    if my_hand == cpu_hand:
        result = 2
    else:
        if my_hand == ROCK:
            if cpu_hand == SCISSORS:
                result = 0
            elif cpu_hand == PAPER:
                result = 1
        if my_hand == SCISSORS:
            if cpu_hand == PAPER:
                result = 0
            elif cpu_hand == ROCK:
                result = 1
        if my_hand == PAPER:
            if cpu_hand == ROCK:
                result = 0
            elif cpu_hand == SCISSORS:
                result = 1

    return result

def show_result(result):
    """ 勝敗結果を表示する
    Args:
        result (int): 0:勝ち, 1:負け, 2:引き分け
    """
    if result == 0:
        print("あなたの勝ちです")
    elif result == 1:
        print("あなたの負けです")
    elif result == 2:
        print("引き分けです") 

def game_start():
    """
    じゃんけんを開始するメイン関数
    """
    print("じゃんけんをします")
    n_player = 2

    # cpuインスタンスの作成
    cpus = Cpu()
    
    print("あなたの手は? (0:グー、1:チョキ、2:パー)")
    my_hand = int(input())

    result = judge_janken(my_hand, cpus.hand)

    print(f"CPUの手は{cpus.hand}です")
    show_result(result)

if __name__ == "__main__":
    game_start()

今回のポイント

  • 入力インタフェース
    • 80行目で標準入力を受け付けて数値に変換しています。
  • CPUクラスの作成
    • 9〜25行目のコードでCPUクラスを作成しています。
      これはCPUをオブジェクトにしておくと考えやすかったのと、CPUが増えた場合の処理が簡単になると見込んだためです。
  • 乱数の使用
    • 15行目、25行目でCPUの手は指定した整数範囲をランダムに返すrandom.randint()関数を使用しています。
  • DocString

終わりに

実装例を紹介しましたが、例と書いているようにあくまで一例です、
今回のコードはGitHubにも上げていきますのでみなさんのコードもぜひ共有してください。

コメント

タイトルとURLをコピーしました