コンテンツにスキップ

ロックペーパーシザーズのPythonを使用した説明

[

Pythonチュートリアル:ロックペーパーシザーズ

ロックペーパーシザーズとは?

以前にロックペーパーシザーズをプレイしたことがあるかもしれません。おそらく、誰が夕食の支払いをするか、またはチームの選手を選ぶために使用したことがあるかもしれません。

もしもこれが初めての場合は、ロックペーパーシザーズは2人以上のプレイヤーのための手のゲームです。参加者は「ロック、ペーパー、シザーズ」と言って、同時に自分の手をロック(拳)、ペーパー(手のひらを下に向けた状態)、またはシザーズ(2つの指を伸ばした状態)の形にします。ルールは非常にシンプルです:

  • ロックはシザーズを破ります。
  • ペーパーはロックを包みます。
  • シザーズはペーパーを切ります。

ルールが分かったので、それをPythonのコードにどのように変換できるか考えてみましょう。

Pythonで1回のロックペーパーシザーズをプレイする

import random

素晴らしい!これでゲーム内のさまざまなツールをrandom内で使用することができます。では、どうすればいいでしょうか?ユーザーが自分の行動を選べるようにするためには、まずユーザーからの入力を受け取る方法が必要です。

ユーザーからの入力を受け取る

Pythonでは、ユーザーからの入力を受け取ることは非常に簡単です。ここでは、ユーザーにアクションを選択してもらい、その選択を変数に割り当てることが目標です。

user_action = input("Enter a choice (rock, paper, scissors): ")

これにより、ユーザーに選択肢を入力するように促し、後で使用するためにその選択を変数に保存します。ユーザーがアクションを選択したら、コンピューターは自分の行動を決定する必要があります。

コンピューターが選択する

競争力のあるロックペーパーシザーズのゲームでは、戦略が必要です。しかし、それをモデル化する代わりに、以下のような方法でコンピューターの行動をランダムに決定することができます。

possible_actions = ["rock", "paper", "scissors"]
computer_action = random.choice(possible_actions)

コンピューターの選択肢は、ランダムに選択される可能性があります。これにより、ゲームでプレイヤーとコンピューターの行動がランダムに決まるようになります。

勝者を決定する

次に行うことは、勝者を決定することです。ロックペーパーシザーズのルールに従って、勝者を決定する簡単な方法があります。

def determine_winner(user_action, computer_action):
if user_action == computer_action:
return "It's a tie!"
elif user_action == "rock":
if computer_action == "scissors":
return "You win!"
else:
return "Computer wins!"
elif user_action == "paper":
if computer_action == "rock":
return "You win!"
else:
return "Computer wins!"
elif user_action == "scissors":
if computer_action == "paper":
return "You win!"
else:
return "Computer wins!"

このコードでは、ユーザーのアクションとコンピューターのアクションを比較し、ルールに従って勝者を判定しています。

以上のコードを組み合わせると、1回のロックペーパーシザーズゲームをプレイすることができます。

import random
possible_actions = ["rock", "paper", "scissors"]
user_action = input("Enter a choice (rock, paper, scissors): ")
computer_action = random.choice(possible_actions)
print(f"\nYou chose {user_action}, computer chose {computer_action}.\n")
print(determine_winner(user_action, computer_action))

これで、ユーザーが自分のアクションを選び、コンピューターがランダムにアクションを選び、勝者を決定するゲームができました。

複数のゲームを連続してプレイする

これまでは、1回のロックペーパーシザーズゲームのコードを見てきました。しかし、ゲームをもっと楽しむためには、複数のゲームを連続してプレイできるようにしたいですよね。

以下のコードは、ユーザーがゲームをプレイするかどうかを選ぶことができるようにする方法を示しています。

import random
possible_actions = ["rock", "paper", "scissors"]
user_continue = "y"
while user_continue == "y":
user_action = input("Enter a choice (rock, paper, scissors): ")
computer_action = random.choice(possible_actions)
print(f"\nYou chose {user_action}, computer chose {computer_action}.\n")
print(determine_winner(user_action, computer_action))
user_continue = input("Enter 'y' to play again: ")

このコードでは、user_continue変数を使ってユーザーにゲームを続けるかどうかを尋ねます。ユーザーが「y」と入力する限り、ゲームが続きます。ユーザーが別のキーを入力すると、ゲームが終了します。

これで、複数のロックペーパーシザーズゲームを連続してプレイすることができます。

enum.IntEnumを使用してアクションを記述する

次に、Enumという機能を使用して、ロックペーパーシザーズのアクションを記述する方法を見てみましょう。

import random
from enum import IntEnum
class Action(IntEnum):
ROCK = 0
PAPER = 1
SCISSORS = 2
names = ["rock", "paper", "scissors"]
user_action = Action[names.index(input("Enter a choice (rock, paper, scissors): "))]
computer_action = Action(random.randint(0, 2))
print(f"\nYou chose {user_action.name}, computer chose {computer_action.name}.\n")
print(determine_winner(user_action.name, computer_action.name))

このコードでは、EnumIntEnumを使ってアクションを列挙しています。ユーザーが入力したアクションをActionのメンバーにマップする方法も示しています。

これにより、アクションをEnumを使って管理し、より洗練されたコードを作成することができます。

プログラムのフローチャート

コードが複雑になると、フローチャートを使ってプログラムの流れを視覚化することが助けになります。

以下のフローチャートは、ロックペーパーシザーズのプログラムの流れを示しています。

このフローチャートは、ユーザーにアクションを選択させ、コンピューターがランダムにアクションを選択し、勝者を決定します。ブール値を使ってゲームが続行するかどうかを確認し、繰り返し実行することもできます。

フローチャートを使用すると、プログラムのコード全体を把握しやすくなります。

コードを関数に分割する

コードが増えてくると、コードを関数に分割することが重要になります。これにより、複数の箇所で同じコードを再利用することができます。

以下のコードでは、ゲームの各部分を関数に分割しています。

import random
from enum import IntEnum
class Action(IntEnum):
ROCK = 0
PAPER = 1
SCISSORS = 2
def take_user_input():
names = ["rock", "paper", "scissors"]
user_action = Action[names.index(input("Enter a choice (rock, paper, scissors): "))]
return user_action
def make_computer_choose():
computer_action = Action(random.randint(0, 2))
return computer_action
def determine_winner(user_action, computer_action):
if user_action == computer_action:
return "It's a tie!"
elif user_action == Action.ROCK:
if computer_action == Action.SCISSORS:
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.PAPER:
if computer_action == Action.ROCK:
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.SCISSORS:
if computer_action == Action.PAPER:
return "You win!"
else:
return "Computer wins!"
user_continue = "y"
while user_continue == "y":
user_action = take_user_input()
computer_action = make_computer_choose()
print(f"\nYou chose {user_action.name}, computer chose {computer_action.name}.\n")
print(determine_winner(user_action, computer_action))
user_continue = input("Enter 'y' to play again: ")

このコードでは、ゲームの各部分が関数に分割されています。これにより、コードを再利用しやすくなり、プログラム全体の理解も容易になりました。

ロックペーパーシザーズ…トカゲ…スポック

ロックペーパーシザーズゲームをもっと複雑にしたい場合は、ロックペーパーシザーズ…トカゲ…スポックをプレイすることもできます。

以下のコードは、ロックペーパーシザーズ…トカゲ…スポックのルールを追加したものです。

import random
from enum import IntEnum
class Action(IntEnum):
ROCK = 0
PAPER = 1
SCISSORS = 2
LIZARD = 3
SPOCK = 4
def take_user_input():
names = ["rock", "paper", "scissors", "lizard", "spock"]
user_action = Action[names.index(input("Enter a choice (rock, paper, scissors, lizard, spock): "))]
return user_action
def make_computer_choose():
computer_action = Action(random.randint(0, 4))
return computer_action
def determine_winner(user_action, computer_action):
if user_action == computer_action:
return "It's a tie!"
elif user_action == Action.ROCK:
if computer_action in (Action.SCISSORS, Action.LIZARD):
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.PAPER:
if computer_action in (Action.ROCK, Action.SPOCK):
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.SCISSORS:
if computer_action in (Action.PAPER, Action.LIZARD):
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.LIZARD:
if computer_action in (Action.PAPER, Action.SPOCK):
return "You win!"
else:
return "Computer wins!"
elif user_action == Action.SPOCK:
if computer_action in (Action.ROCK, Action.SCISSORS):
return "You win!"
else:
return "Computer wins!"
user_continue = "y"
while user_continue == "y":
user_action = take_user_input()
computer_action = make_computer_choose()
print(f"\nYou chose {user_action.name}, computer chose {computer_action.name}.\n")
print(determine_winner(user_action, computer_action))
user_continue = input("Enter 'y' to play again: ")

このコードでは、ロックペーパーシザーズ…トカゲ…スポックのルールに基づいて勝者を決定しています。ルールは複雑になるため、より多くのコードが必要になりますが、コードの分割と関数の使用によって読みやすく維持することができます。

まとめ

このチュートリアルでは、Pythonを使用して自分自身のロックペーパーシザーズゲームを作成する方法を学びました。ユーザーの入力を受け取り、コンピューターにランダムなアクションを選択させ、勝者を決定する方法を見てきました。コードを関数に分割したり、Enumを使用したりすることで、コードをきれいにまとめる方法も学びました。

ゲームプログラミングは、実世界で使用される多くのツールを学ぶことができるだけでなく、結果をテストするためにゲームをプレイすることもできるので、プログラミングを学ぶのに最適な方法です。ロックペーパーシザーズは、Pythonゲームプログラミングの旅を始めるのに理想的なゲームです。