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()