Python Forum
My version of Rock Paper Scissors
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
My version of Rock Paper Scissors
#11
I can't think of anything.
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#12
FYI, I figured it out. It runs fine if I run it from the command prompt in Windows or a terminal window in Linux. My mistake is that I was running it directly in IDLE.

Cool program! Very sophisticated by Rock, Paper, Scissors standards.
Reply
#13
I've added speech to the game. A little slower but, I think it's kinda cool.
Requires espeak to be installed.
pip install espeak

#! /usr/bin/env python3

# Do the imports
import random as rnd
import os
from time import sleep as os_sleep
from subprocess import call

# Check if the os is *nix or windows
# if it's windows import colorama and initiate
if os.name == 'nt':
    import colorama
    colorama.init()
else:
    pass

# Define some basic ansi colors
red = '\033[31m'
yellow = '\033[33m'
cyan = '\033[36m'
blue = '\033[34m'
magenta = '\033[35m'
green = '\033[32m'


bright_red = '\033[91m'
bright_yellow = '\033[33;1m'
bright_cyan = '\033[36;1m'
bright_blue = '\033[34;1m'
bright_magenta = '\033[35;1m'
bright_green = '\033[32;1m'

# Other ansi sequences
underline = '\033[4m'
bold = '\033[1m'

# Resets all ansi to system default
reset = '\033[0m'


class Game:
    def __init__(self):
        # Set some default options
        self.player_wins = 0
        self.computer_wins = 0
        self.ties = 0
        self.games_played = 0

        self.player_name = ''

        # Define our choices
        self.options = ['rock', 'paper', 'scissors']

        # Clears the screen so we do not have cluttered text
        self.clear()
        # Display the game title
        print(f'{underline}{bright_blue}Rock Paper Scissors{reset}\n')

        # Start the game loop
        call(['espeak', 'What is your name?'])
        while True:
            try:
                # Check if we have a player name. If not ask for one.
                if not self.player_name:
                    self.player_name = input("What's your name?: ").lower()
                    # This throws an error if player does not enter a name.
                    if not self.player_name:
                        self.clear()
                        call(['espeak', 'Please enter a name.'])
                        print(f'{bright_red}Error!{reset}: {bright_yellow}Please enter a player name.{reset}')
                        continue
                    # Welcome the player to the game and do a countdown to game start
                    else:
                        self.clear()
                        print(f'Hello {bright_cyan}{self.player_name.title()}{reset}! Welcome to the {bright_blue}Rock Paper Scissors{reset} Game!')
                        call(['espeak', f'Hello {self.player_name}! Welcome to rock paper and scissors!'])
                        # i = 10
                        # while i > 0:
                        #     print(f'Hello {bright_cyan}{self.player_name.title()}{reset}! Welcome to the {bright_blue}Rock Paper Scissors{reset} Game!')
                        #     print(f'Game starting in {bright_yellow}{i}{reset}')
                        #     i -= 1
                        #     os_sleep(1)
                        #     self.clear()
                # Everything is ok up to this point. Start the game
                print(f'\n{yellow}Type "q" or "quit" without quotes to exit game.{reset}\n')
                print(f'{bright_blue}Choices: {", ".join(self.options).title()}{reset}')

                self.player_choice = input(f'Player Choice: ').lower()

                # Player enter q or qiut to exit the game
                if self.player_choice == 'q' or self.player_choice == 'quit':
                    self.clear()

                    # Check for the overall winner
                    if self.player_wins > self.computer_wins:
                        total = self.convert(self.player_wins, self.computer_wins, self.ties)
                        print(f'{bright_cyan}{self.player_name.title()}{reset} is the overall winner.')
                        print(f'{bright_cyan}{self.player_name.title()}{reset} won {total} of the games played.')
                        call(['espeak', f'{self.player_name} is the overall winner. {self.player_name} won {total} of played games.'])

                    elif self.computer_wins > self.player_wins:
                        total = self.convert(self.computer_wins, self.player_wins, self.ties)
                        print(f'{bright_magenta}Computer{reset} is the overall winner.')
                        print(f'{bright_magenta}Computer{reset} won {total} of the games played.')
                        call(['espeak', f'Computer is the over all winner. Computer won {total} of played games.'])

                    else:
                        print(f'No player is the overall winner.')
                        call(['espeak', 'There is no overall winner.'])

                    print(f'{bright_green}Games Played{reset}: {self.games_played}\n')

                    print(f'{bright_yellow}Thanks for playing{reset} {bright_cyan}{self.player_name.title()}{bright_yellow}!{reset}')
                    call(['espeak', f'Thanks for playing {self.player_name}.'])
                    os.sys.exit()

                # Setup some errors if wrong input is entered
                if self.player_choice.replace('.', '').isdigit():
                    self.clear()
                    print(f'{bright_red}Error!: {bright_yellow}Numbers are not allowed.{reset}')
                    call(['espeak', 'Numbers are not allowed'])
                    continue
                elif self.player_choice not in self.options:
                    self.clear()
                    print(f'{bright_red}Error!: {bright_yellow}Please use only the given choices.{reset}')
                    call(['espeak', 'Please use only the given choices.'])

                # No errors continue to play
                else:
                    self.clear()
                    print(self.play())

            # Throw an exception if any unknown errors
            except ValueError as error:
                print(f'{bright_red}Error!{reset}: {yellow}{error}{reset}')

            # Show scores
            print()
            self.score()

    # This function is used to clear the screen of cluttered text
    def clear(self):
        # Check if the os is windows or not
        if os.name == 'nt':
            _ = os.system('cls')
        else:
            _ = os.system('clear')

    def play(self):
        # Get the computer's choice
        computer = self.computer()

        self.games_played += 1

        # Print out what each has chosen
        print(f'\n{bright_cyan}{self.player_name.title()}{reset} Chose: {self.player_choice.title()}')
        print(f'{bright_magenta}Computer{reset} Chose: {computer.title()}\n')

        txt1 = 'Rock Crushes Scissors'
        txt2 = 'Paper Covers Rock'
        txt3 = 'Scissors Cuts Paper'

        # Check to see who won and return
        if self.player_choice == 'rock' and computer == 'scissors':
            winner = f'{bright_cyan}{self.player_name.title()}{reset} won! {txt1}.'
            call(['espeak', f'{txt1}. {self.player_name} wins.'])
            self.player_wins += 1
        elif self.player_choice == 'paper' and computer == 'rock':
            winner = f'{bright_cyan}{self.player_name.title()}{reset} won! {txt2}.'
            call(['espeak', f'{txt2}. {self.player_name} wins.'])
            self.player_wins += 1
        elif self.player_choice == 'scissors' and computer == 'paper':
            winner = f'{bright_cyan}{self.player_name.title()}{reset} won! {txt3}.'
            call(['espeak', f'{txt3}. {self.player_name} wins.'])
            self.player_wins += 1

        elif computer == 'rock' and self.player_choice == 'scissors':
            winner = f'{bright_magenta}Computer{reset} won! {txt1}'
            call(['espeak', f'{txt1}. Computer wins.'])
            self.computer_wins += 1
        elif computer == 'paper' and self.player_choice == 'rock':
            winner = f'{bright_magenta}Computer{reset} won! {txt2}'
            call(['espeak', f'{txt2}. Computer wins.'])
            self.computer_wins += 1
        elif computer == 'scissors' and self.player_choice == 'paper':
            call(['espeak', f'{txt3}. Computer wins.'])
            winner = f'{bright_magenta}Computer{reset} won! {txt3}'
            self.computer_wins += 1
        else:
            winner = f'{bright_cyan}{self.player_name.title()}{reset} and {bright_magenta}Computer{reset} have tied.\nThere is no winner.'
            call(['espeak', f'{self.player_name} and computer have tied.'])
            self.ties += 1
        return winner

    # Get a random choice for the computer and return
    def computer(self):
        self.computer_choice = rnd.choice(self.options)
        return self.computer_choice

    # Displays the score/wins
    def score(self):
        print(f'{cyan}Score{reset}:')
        print(f'{bright_cyan}{self.player_name.title()}{reset}: {self.player_wins} | {bright_magenta}Computer{reset}: {self.computer_wins} | {bright_yellow}Ties{reset}: {self.ties}')
        print()

    # Convert wins into percentages
    def convert(self, num1, num2, num3):
        total = num1 / (num1 + num2 + num3)
        return format(total, '.0%')


def main():
    Game()

if __name__ == '__main__':
    main()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Another Rock, Paper, Scissors Yoriz 4 3,138 Jun-30-2020, 07:56 PM
Last Post: Yoriz
  The tkinter version of Rock Paper Scissors menator01 3 3,149 Jun-28-2020, 07:15 AM
Last Post: ndc85430
  PyQt5 Version of Rock, Paper, & Scissors menator01 8 3,625 Jun-06-2020, 12:15 PM
Last Post: pyzyx3qwerty
  Rock, Paper, Scissors foksikrasa 11 4,258 May-28-2020, 05:58 PM
Last Post: BitPythoner
  Rock Paper Scissor GAME inamullah9 3 3,237 Aug-11-2019, 12:17 PM
Last Post: ichabod801
  A CLI based Rock,Paper or Scissor game. Ablazesphere 7 4,434 Oct-28-2018, 07:25 AM
Last Post: Ablazesphere
  A basic Rock-paper-scissors game by me... Unlimiter 0 2,464 Dec-25-2017, 03:41 PM
Last Post: Unlimiter
  Basic Rock, Paper, Scissors CinnamonBeard 1 3,531 Dec-19-2017, 02:32 PM
Last Post: sparkz_alot

Forum Jump:

User Panel Messages

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