Pythonでジャンケンゲームの作り方を分かりやすく解説する

スポンサーリンク

今回は、Python言語で独自のRock Paper Scissorsゲームを作成するための手順を説明します。

スポンサーリンク

ロック・ペーパー・シザーズについて

ジャンケンは、2人で同時に行うゲームで、ジャンケンではさみをつぶし、はさみで紙を切り、紙ではさみをするものです。

ルールに基づき、勝者が決定されます。

あなたが人気のテレビシリーズ、ビッグバン-セオリーに精通している場合は、ジャンケントカゲ-Spockと呼ばれるゲームの別のバージョンを知っているかもしれません。

以下のインフォグラフィックが参考になるかもしれません。

# The mapping between moves and numbers
game_map = {0:"rock", 1:"paper", 2:"scissors", 3:"lizard", 4:"Spock"}
 
# Win-lose matrix for traditional game
rps_table = [[-1, 1, 0], [1, -1, 2], [0, 2, -1]]
 
# Win-lose matrix for new version of the game
rpsls_table = [[-1, 1, 0, 0, 4],[1, -1, 2, 3, 1], [0, 2, -1, 2, 4], [0, 3, 2, -1, 3], [4, 1, 4, 3, -1]]

矢印の向きで勝敗が決まります。

矢印は、その特定の対戦で、そのエンティティの優位性を意味し、出て行く。

ゲームプレイデモ

PythonでRock Paper Scissorsを作成する

今日作成するゲームは、両方のバージョンのジャンケンをサポートします。

誰もが新しいバージョンのゲームをやりたがるとは限らないので、ファン層を分けるためのゲームメニューが必要です。

メニューは以下のようなものです。

# The GAME LOOP
while True:
 
    # The Game Menu
    print()
    print("Let's Play!!!")
    print("Which version of Rock-Paper-Scissors?")
    print("Enter 1 to play Rock-Paper-Scissors")
    print("Enter 2 to play Rock-Paper-Scissors-Lizard-Spock")
    print("Enter 3 to quit")
    print()
 
    # Try block to handle the player choice
    try:
        choice = int(input("Enter your choice = "))
    except ValueError:
        clear()
        print("Wrong Choice")  
        continue
 
    # Play the traditional version of the game
    if choice == 1:
        rps()
 
    # Play the new version of the game
    elif choice == 2:
        rpsls()
 
    # Quit the GAME LOOP   
    elif choice == 3:
        break
 
    # Other wrong input
    else:
        clear()
        print("Wrong choice. Read instructions carefully.")

データ構造の作成


ゲームを完全に機能させるために必要な特定のデータ構造が2つあります。

# Set of instructions for Rock-Paper-Scissors
def rps_instructions():
 
    print()
    print("Instructions for Rock-Paper-Scissors : ")
    print()
    print("Rock crushes Scissors")
    print("Scissors cuts Paper")
    print("Paper covers Rock")
    print()
 
# Set of instructions for Rock-Paper-Scissors-Lizard-Spock
def rpsls_instructions():
 
    print()
    print("Instructions for Rock-Paper-Scissors-Lizard-Spock : ")
    print()
    print("Scissors cuts Paper")
    print("Paper covers Rock")
    print("Rock crushes Lizard")
    print("Lizard poisons Spock")
    print("Spock smashes Scissors")
    print("Scissors decapitates Lizard")
    print("Lizard eats Paper")
    print("Paper disproves Spock")
    print("Spock vaporizes Rock")
    print("Rock crushes Scissors")
    print()

ゲームの動きをマッピングする

勝者と敗者を決定するために、可能な手と数字の間にある種のマッピングが必要です。

この目的のためにpythonの辞書を使用します。

勝敗マトリックス

Python でじゃんけんの勝敗を確認する最も簡単な方法は、各プレイヤーの入力に対応するセルを参照することです。

以下は、伝統的なゲームの行列です。

# Player Input
inp = input("Enter your move : ")
 
if inp.lower() == "help":
    clear()
    rps_instructions()
    continue
elif inp.lower() == "exit":
    clear()
    break  
elif inp.lower() == "rock":
    player_move = 0
elif inp.lower() == "paper":
    player_move = 1    
elif inp.lower() == "scissors":
    player_move = 2
else:
    clear()
    print("Wrong Input!!")
    rps_instructions() 
    continue

行列の非負の値は、対応する入力の勝者を表します。

この行列を理解するために、例を挙げてみましょう。

あるゲームにおいて、プレイヤー1がはさみ(インデックス=2)を選び、プレイヤー2が紙(インデックス=1)を選んだとします。

行列のセル(2, 1)と(1, 2)は、ScissorsとPaperが一致したことを示す。

はさみは紙を切るので、これらのセルにははさみのインデックスが含まれる。

‘-1’` を含むセルは引き分けを表します。

以下は、新バージョンの行列です。

# Get the computer move randomly
comp_move = random.randint(0, 2)
 
# Print the computer move
print("Computer chooses ", game_map[comp_move].upper())

以上のデータ構造によって、私たちのゲーム「じゃんけんぽん」を作るのに必要なゲームロジックが完成した。

残るは、プレイヤーの入力とコンピュータの動きの管理です。

ゲームループの構築

Pythonでロック・ペーパー・シザーズを行う上で最も重要な部分の一つが、ゲーム・ループです。

このゲームの文脈では、ゲームループはプレイヤー間のマッチの文字列を維持する役割を担っています。

# Find the winner of the match
winner = rps_table[player_move][comp_move]
 
# Declare the winner
if winner == player_move:
    print(name, "WINS!!!")
elif winner == comp_move:
    print("COMPUTER WINS!!!")
else:
    print("TIE GAME")
print()
time.sleep(2)
clear()

rps()’‘rpsls()’` 関数は、それぞれのバージョンの一連のゲームを処理するために、内部にゲームループを持っています。

clear()' 関数は、出力が混雑するのを防ぐために端末をクリアする役割を担っている。

PythonによるRock Paper Scissorsのゲーム命令

プレイヤーが手を出す前に、プログラマはゲーマーに一連の指示を与えることが義務です。


ゲームに指示を与えるための関数を2つ作成する必要があります。

import random
import os
import time
 
def clear():
    os.system("clear")
 
# Set of instructions for Rock-Paper-Scissors
def rps_instructions():
 
    print()
    print("Instructions for Rock-Paper-Scissors : ")
    print()
    print("Rock crushes Scissors")
    print("Scissors cuts Paper")
    print("Paper covers Rock")
    print()
 
# Set of instructions for Rock-Paper-Scissors-Lizard-Spock
def rpsls_instructions():
 
    print()
    print("Instructions for Rock-Paper-Scissors-Lizard-Spock : ")
    print()
    print("Scissors cuts Paper")
    print("Paper covers Rock")
    print("Rock crushes Lizard")
    print("Lizard poisons Spock")
    print("Spock smashes Scissors")
    print("Scissors decapitates Lizard")
    print("Lizard eats Paper")
    print("Paper disproves Spock")
    print("Spock vaporizes Rock")
    print("Rock crushes Scissors")
    print()
 
def rps():
     
    global rps_table
    global game_map
    global name
 
    # Game Loop for each game of Rock-Paper-Scissors
    while True:
 
        print("--------------------------------------")
        print(" Menu")
        print("--------------------------------------")
        print("Enter "help" for instructions")
        print("Enter "Rock","Paper","Scissors" to play")
        print("Enter "exit" to quit")
        print("--------------------------------------")
 
        print()
 
        # Player Input
        inp = input("Enter your move : ")
 
        if inp.lower() == "help":
            clear()
            rps_instructions()
            continue
        elif inp.lower() == "exit":
            clear()
            break  
        elif inp.lower() == "rock":
            player_move = 0
        elif inp.lower() == "paper":
            player_move = 1    
        elif inp.lower() == "scissors":
            player_move = 2
        else:
            clear()
            print("Wrong Input!!")
            rps_instructions() 
            continue
 
        print("Computer making a move....")
 
        print()
        time.sleep(2)
 
        # Get the computer move randomly
        comp_move = random.randint(0, 2)
 
        # Print the computer move
        print("Computer chooses ", game_map[comp_move].upper())
 
        # Find the winner of the match
        winner = rps_table[player_move][comp_move]
 
        # Declare the winner
        if winner == player_move:
            print(name, "WINS!!!")
        elif winner == comp_move:
            print("COMPUTER WINS!!!")
        else:
            print("TIE GAME")
 
        print()
        time.sleep(2)
        clear()
 
def rpsls():
     
    global rpsls_table
    global game_map
    global name
 
    # Game Loop for each game of Rock-Paper-Scissors-Lizard-Spock
    while True:
        print("--------------------------------------")
        print(" Menu")
        print("--------------------------------------")
        print("Enter "help" for instructions")
        print("Enter "Rock","Paper","Scissors","Lizard","Spock" to play")
        print("Enter "exit" to quit")
        print("--------------------------------------")
         
        print()
 
        # Player Input
        inp = input("Enter your move : ")
 
        if inp.lower() == "help":
            clear()
            rpsls_instructions()
            continue
        elif inp.lower() == "exit":
            clear()
            break  
        elif inp.lower() == "rock":
            player_move = 0
        elif inp.lower() == "paper":
            player_move = 1    
        elif inp.lower() == "scissors":
            player_move = 2
        elif inp.lower() == "lizard":
            player_move = 3
        elif inp.lower() == "spock":
            player_move = 4
        else:
            clear()
            print("Wrong Input!!")
            rps_instructions() 
            continue
 
 
        print("Computer making a move....")
 
        comp_move = random.randint(0, 4)
        print()
        time.sleep(2)
 
        print("Computer chooses ", game_map[comp_move].upper())
 
        winner = rpsls_table[player_move][comp_move]
        print()
        if winner == player_move:
            print(name, "WINS!!!")
        elif winner == comp_move:
            print("COMPUTER WINS!!!")
        else:
            print("TIE GAME")      
        print()
        time.sleep(2)
        clear()
 
# The main function
if __name__ == '__main__':
 
    # The mapping between moves and numbers
    game_map = {0:"rock", 1:"paper", 2:"scissors", 3:"lizard", 4:"Spock"}
 
    # Win-lose matrix for traditional game
    rps_table = [[-1, 1, 0], [1, -1, 2], [0, 2, -1]]
 
    # Win-lose matrix for new version of the game
    rpsls_table = [[-1, 1, 0, 0, 4],[1, -1, 2, 3, 1], [0, 2, -1, 2, 4], [0, 3, 2, -1, 3], [4, 1, 4, 3, -1]]
 
     
    name = input("Enter your name: ")
 
    # The GAME LOOP
    while True:
 
        # The Game Menu
        print()
        print("Let's Play!!!")
        print("Which version of Rock-Paper-Scissors?")
        print("Enter 1 to play Rock-Paper-Scissors")
        print("Enter 2 to play Rock-Paper-Scissors-Lizard-Spock")
        print("Enter 3 to quit")
        print()
 
        # Try block to handle the player choice
        try:
            choice = int(input("Enter your choice = "))
        except ValueError:
            clear()
            print("Wrong Choice")  
            continue
 
        # Play the traditional version of the game
        if choice == 1:
            rps()
 
        # Play the new version of the game
        elif choice == 2:
            rpsls()
 
        # Quit the GAME LOOP   
        elif choice == 3:
            break
 
        # Other wrong input
        else:
            clear()
            print("Wrong choice. Read instructions carefully.")
 
                            

指示を表示した後、プレイヤーに入力を求める。

プレイヤー入力の処理

私たちのゲームはプレイヤー対コンピュータのシナリオをサポートしているので、Pythonでジャンケンの0ゲームごとに1つの手を処理する必要があります。

入力メニュー


プレイヤーにゲームを操作している感覚を与える必要があります。

そのためには、「助けを求める」、「可能な手」、「ゲームを終了する」というオプションを提供する必要があります。

以下の入力メニューがこれにあたる。

Rpsls
Rock-Paper-Scissors-Lizard-Spock

対局者の動き

プレイヤー入力の処理では、文字列入力を数値対応に変換することに主眼が置かれています。

Pythonの伝統的なゲームであるじゃんけんでは、以下のような入力の手を受け付けます。

Game Menu
Game Menu

if-elif-else文を使って、条件付きでチェックを行うことができる。

コンピューター移動の管理

不偏のコンピュータの動きを管理するために、Pythonの 'random' ライブラリの助けを借りる必要があります。

可能な選択肢の中からランダムな手を選択します。

Rps Table
Win-Lose Matrix

randomライブラリの 'randint()' 関数を使用して、コンピュータのランダムな動きを選択します。

勝敗の決定と宣言

勝敗表を使って、簡単に勝者を決めることができる。

Rpsls Table
Win-Lose Matrix

Pythonスクリプトの実行を一時停止するには、'sleep()'関数を使用します。

上の例では、2秒間待機しています。

以上、じゃんけんゲームを実行するPythonスクリプトの説明でした。

Pythonで作るロック・ペーパー・シザーズの完全なコード

以下は、Pythonで作成したジャンケンゲームの完全なコードです。

Input Menu
Input Menu

まとめ

プログラマーがゲームロジックとデザインの基本を知っていれば、ゲームを作ることは決して難しいことではありません。

この記事で、簡単な端末ベースのゲームを開発するための上記の原則を、読者に知ってもらえたなら幸いです。

動作するコードは、私のGithubアカウントにもあります。

お読みいただきありがとうございました。

何か疑問があれば、コメント欄でお気軽にお尋ねください。

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