Skip to content

Instantly share code, notes, and snippets.

@raeq
Last active January 20, 2022 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raeq/a50b25754ff1f087d4d7e3587d50aad6 to your computer and use it in GitHub Desktop.
Save raeq/a50b25754ff1f087d4d7e3587d50aad6 to your computer and use it in GitHub Desktop.
import random
from collections import Counter
from enum import Enum, IntEnum, unique
@unique
class Outcome(Enum):
COMPUTER = 2
TIED = 0
PLAYER = 1
@unique
class Choices(IntEnum):
ROCK = 1
PAPER = 2
SCISSORS = 3
class Hand:
count = 0
sequence: int
def __init__(self, player_guess: str, computer_guess: str):
if player_guess.upper() not in [choice.name for choice in Choices]:
raise ValueError(f"The value {player_guess!r} is invalid.")
self.player_guess = player_guess.upper()
self.computer_guess = computer_guess
self.outcome = Outcome((Choices[self.player_guess].value - Choices[self.computer_guess].value) % len(Choices))
self.message = "Tied."
if self.outcome == Outcome.COMPUTER:
self.message = "Computer wins."
elif self.outcome == Outcome.PLAYER:
self.message = "Player wins."
self.sequence = Hand.count
Hand.count += 1
def __str__(self):
return f"sequence={self.sequence}, " \
f"player_guess={self.player_guess!r}, " \
f"computer_guess={self.computer_guess!r}, " \
f"outcome={self.outcome!r}, "
def __repr__(self):
return f"{self.__class__.__name__}" \
f"(player_guess={self.player_guess!r}, " \
f"computer_guess={self.computer_guess!r})"
BESTOF = 5
game_history = []
guess_options = [choice.name for choice in Choices]
while not any(
(count == BESTOF // 2 + 1
for key, count in
(Counter([hand.outcome for hand in game_history]).items())
if key != Outcome.TIED
)
):
computers_guess = random.choice(guess_options)
players_guess = random.choice(guess_options) # input("Make your guess: ") #
try:
game_history.append(Hand(players_guess, computers_guess))
print(f"[{len(game_history)}]: You chose {players_guess!r}, the computer chose {computers_guess!r} - "
f"{game_history[-1].message}")
except ValueError as e:
print(e)
print(f"\n=======\nGame ends after {len(game_history)} hands. ")
print(f"There were {sum([True for hand in game_history if hand.outcome == Outcome.TIED])} ties, "
f"computer won {sum([True for hand in game_history if hand.outcome == Outcome.COMPUTER])} hands, "
f"you won {sum([True for hand in game_history if hand.outcome == Outcome.PLAYER])} hands.\n"
f"Result: {game_history[-1].message} ")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment