Python Forum
Rock paper scissors in python with "algorithm"
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rock paper scissors in python with "algorithm"
#19
Trying to stay within the restraints of the original code I would write the code like this:
import random
from enum import IntEnum

class GameResults(IntEnum):
    Win = 0
    Lose = 1
    Draw = 2


class GameAction(IntEnum):
    Piedra = 0
    Papel = 1
    Tijeras = 2

    def __str__(self):
        """Return str more suited for program."""
        return f"{self.name}[{self.value}]"


winning_results = {
    (GameAction.Piedra, GameAction.Tijeras) : "Piedra smashes tijeras",
    (GameAction.Papel, GameAction.Piedra) : "Papel covers piedra",
    (GameAction.Tijeras, GameAction.Papel) : "Tijeras cuts Papel",
}


def get_user_action():
    """Get user selection"""
    prompt = f"""\nPick {", ".join([str(action) for action in GameAction])}: """
    while True:
        try:
            action = input(prompt)
            return GameAction(int(action))
        except ValueError:
            print(f"{action} is not a valid choice")


def get_computer_action():
    """Get computer selection"""
    return random.choice(list(GameAction))


def assess_game(user_action, computer_action):
    if user_action == computer_action:
        return GameResults.Draw, ""
    if (user_action, computer_action) in winning_results:
        return GameResults.Win, winning_results[(user_action, computer_action)]
    return GameResults.Lose, winning_results[(computer_action, user_action)]


def main():
    """Play a game of rock, paper, scissors"""
    while True:
        user_action = get_user_action()
        computer_action = get_computer_action()
        result, rule = assess_game(user_action, computer_action)
        if result == GameResults.Draw:
            print("Player and computer pick {}.  Draw".format(user_action.name))
        elif result == GameResults.Win:
            print("Player picks {}, computer picks {}.  {}.  Player wins!".format(
                user_action.name, computer_action.name, rule))
        else:
            print("Player picks {}, computer picks {}.  {}.  Computer wins.".format(
                user_action.name, computer_action.name, rule))

        if input("\nAnother round? (y/n): ").upper() != "Y":
            break


if __name__ == "__main__":
    main()
I don't think the enumerated types add value, but they aren't too onerous.

Adding in the history based AI is just a few new lines.
import random
from enum import IntEnum

class GameResults(IntEnum):
    Win = 0
    Lose = 1
    Draw = 2


class GameAction(IntEnum):
    Piedra = 0
    Papel = 1
    Tijeras = 2

    def __str__(self):
        """Return str more suited for program."""
        return f"{self.name}[{self.value}]"


winning_results = {
    (GameAction.Piedra, GameAction.Tijeras) : "Piedra smashes tijeras",
    (GameAction.Papel, GameAction.Piedra) : "Papel covers piedra",
    (GameAction.Tijeras, GameAction.Papel) : "Tijeras cuts Papel",
}


def get_user_action():
    """Get user selection"""
    prompt = f"""\nPick {", ".join([str(action) for action in GameAction])}: """
    while True:
        try:
            action = input(prompt)
            return GameAction(int(action))
        except ValueError:
            print(f"{action} is not a valid choice")


def get_computer_action(history=[]):
    """Get computer selection.  Use history to predict what user will do"""
    user_action = random.choice(history + list(GameAction))
    computer_actions = [action for action in list(GameAction) if (action, user_action) in winning_results]
    return random.choice(computer_actions)


def assess_game(user_action, computer_action):
    if user_action == computer_action:
        return GameResults.Draw, ""
    if (user_action, computer_action) in winning_results:
        return GameResults.Win, winning_results[(user_action, computer_action)]
    return GameResults.Lose, winning_results[(computer_action, user_action)]


def main():
    """Play a game of rock, paper, scissors"""
    history = []
    while True:
        user_action = get_user_action()
        computer_action = get_computer_action(history)
        result, rule = assess_game(user_action, computer_action)
        if result == GameResults.Draw:
            print("Player and computer pick {}.  Draw".format(user_action.name))
        elif result == GameResults.Win:
            print("Player picks {}, computer picks {}.  {}.  Player wins!".format(
                user_action.name, computer_action.name, rule))
        else:
            print("Player picks {}, computer picks {}.  {}.  Computer wins.".format(
                user_action.name, computer_action.name, rule))

        if input("\nAnother round? (y/n): ").upper() != "Y":
            break

        history.append(user_action)


if __name__ == "__main__":
    main()
Adding lizard and Spock is easy with the right infrastructure.
import random
from enum import IntEnum

class GameResults(IntEnum):
    Win = 0
    Lose = 1
    Draw = 2


class GameAction(IntEnum):
    Piedra = 0
    Papel = 1
    Tijeras = 2
    Lagarto = 3
    Spock = 4

    def __str__(self):
        """Return str more suited for program."""
        return f"{self.name}[{self.value}]"


winning_results = {
    (GameAction.Tijeras, GameAction.Papel) : "Tijeras cuts Papel",
    (GameAction.Papel, GameAction.Piedra) : "Papel covers piedra",
    (GameAction.Piedra, GameAction.Lagarto) : "Piedra crushes lagarto",
    (GameAction.Lagarto, GameAction.Spock) : "Lagarto poisons Spock",
    (GameAction.Spock, GameAction.Tijeras) : "Spock smashes tijeras",
    (GameAction.Tijeras, GameAction.Lagarto) : "Tijeras decapitates lagarto",
    (GameAction.Lagarto, GameAction.Papel) : "Lagarto eats papel",
    (GameAction.Papel, GameAction.Spock) : "Papel disproves Spock",
    (GameAction.Spock, GameAction.Piedra) : "Spock vaporizes piedra",
    (): "\nand as it always has\n",
    (GameAction.Piedra, GameAction.Tijeras) : "Piedra smashes tijeras",


def get_user_action():
    """Get user selection"""
    prompt = f"""\nPick {", ".join([str(action) for action in GameAction])}: """
    while True:
        try:
            action = input(prompt)
            return GameAction(int(action))
        except ValueError:
            print(f"{action} is not a valid choice")


def get_computer_action(history=[]):
    """Get computer selection.  Use history to predict what user will do."""
    user_action = random.choice(history + list(GameAction))
    computer_actions = [action for action in list(GameAction) if (action, user_action) in winning_results]
    return random.choice(computer_actions)


def assess_game(user_action, computer_action):
    if user_action == computer_action:
        return GameResults.Draw, ""
    if (user_action, computer_action) in winning_results:
        return GameResults.Win, winning_results[(user_action, computer_action)]
    return GameResults.Lose, winning_results[(computer_action, user_action)]


def main():
    """Play a game of rock, paper, scissors"""
    print("\n".join(["\nRules of the game:\n"] + [rule for rule in winning_results.values()]))
    history = []
    while True:
        user_action = get_user_action()
        computer_action = get_computer_action(history)
        result, rule = assess_game(user_action, computer_action)
        if result == GameResults.Draw:
            print("Player and computer pick {}.  Draw".format(user_action.name))
        elif result == GameResults.Win:
            print("Player picks {}, computer picks {}.  {}.  Player wins!".format(
                user_action.name, computer_action.name, rule))
        else:
            print("Player picks {}, computer picks {}.  {}.  Computer wins.".format(
                user_action.name, computer_action.name, rule))

        if input("\nAnother round? (y/n): ").upper() != "Y":
            break

        history.append(user_action)


if __name__ == "__main__":
    main()
Agat0 likes this post
Reply


Messages In This Thread
RE: Rock paper scissors in python with "algorithm" - by deanhystad - Feb-28-2022, 07:09 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Algorithm for extracting comments from Python source code Pavel1982 6 802 Feb-28-2024, 09:52 PM
Last Post: Pavel1982
  Rock Paper Scissors Project in Python ankitdixit 8 5,046 Feb-23-2024, 03:14 PM
Last Post: DPaul
  Trying to create a visual rock paper scissors game urmom33 1 1,124 Dec-03-2022, 09:12 PM
Last Post: deanhystad
  Problem restricting user input in my rock paper scissors game ashergreen 6 4,769 Mar-25-2021, 03:54 AM
Last Post: deanhystad
  Odd behavior with Rock Paper Scissor game DustinKlent 2 2,033 Aug-27-2020, 03:55 PM
Last Post: DustinKlent
  Trying to implement Best of 3 logic in rock paper scissors game ShAhCh 5 3,523 May-11-2020, 04:31 PM
Last Post: ShAhCh
  Rock Paper Scissors with dictionaries ewgreht 2 3,997 May-01-2020, 03:19 PM
Last Post: deanhystad
  Rock, Paper, Scissors.. Help..hidden bug xxunknownxx 4 2,779 Mar-19-2020, 02:46 AM
Last Post: jefsummers
  POS receipt print cannot make paper cut using python AP_Development 1 2,849 Dec-12-2019, 08:48 AM
Last Post: buran
  Problem with Basic Rock Paper Scissors code BirinderSingh 3 2,583 Sep-13-2019, 03:28 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020