## DEV Community is a community of 869,592 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Soumyajyoti Biswas

Posted on

# Playing rock, paper and scissors using python on a terminal

## Summary

I have always enjoyed an occasional game of Rock, paper and scissors with my friends. What better way to demonstrate the use of randomness generator in python. We could have just done a simple head and tails, but why not this. Walk with me and see how we can create a simple Rock, paper, scissors game that we can play on the terminal.

LINK TO GITHUB VIDEO - HOW THE GAME WORKS ON A TERMINAL

## Code

### Let's talk logic

Rock beats scissors, scissors beats paper, and paper beats rock. When playing against an opponent, the possibilities are that either you and your opponent will pick the same or will pick two different elements. If you both pick the same element it will be considered a draw, and if you and your opponent pick different elements, one will win, and the other will lose the round.

The following table demostrates who would win if both pick different elements.

TABLE
Payer 1 Player 2 Who wins?
---------- ---------- -----------
Rock Paper Player 2
Rock Scissors Player 1
Paper Scissors Player 2
Paper Rock Player 1
Scissors Rock Player 2
Scissors Paper Player 1

While keeping scores, each player gets a point every time they win a round. One point is assigned to a draw column every time it is a draw, which means both players picked the same element. At the end of five rounds, the total score for both players is calculated and the winner is declared. If they both score same, it is a tie.

In our case we will play against the computer. To simplify things, instead of entering 'Rock', 'Paper' and 'Scissors' as characters, which eventually we (I) would mispell, I choose to assign numbers to the elements. 'Rock' == 1, 'Paper' == 2 and 'Scissors' == 3.

To quickly check who wins, we can validate the difference between the value of the element picked by the computer vs the value of the element picked by us. For the computer to win, the difference between its value and ours will either be '-2' or '1'.

### Of all things random

Making the computer choose randomly from a list of choices. The dictionary provided to the computer is {'Rock':1, 'Paper':2, 'Scissors':3}. The values from the dict is used as a list input to a random generator. We use the random module to do this. We use random.choice to let the computer choose one value from a list of values.

>>> import random
>>> print(machine_choices)
{'Rock': 1, 'Paper': 2, 'Scissors': 3}
>>> def get_machine_choice():
...     return(random.choice(list(machine_choices.values())))
...
>>> get_machine_choice()
1
>>> get_machine_choice()
3
>>> get_machine_choice()
2
>>> get_machine_choice()
2
>>> get_machine_choice()
2
>>> get_machine_choice()
1

### Validating user provided input

#### User provided name validation

Store the user provided name in a global variable. If the name is empty assign a default name Bob.

def validate_user_input_name():
global user_input_name # Declaring the name provided by the user to modify the global variable.
user_input_name = input("\nEnter your name: ") # Take user input for name
if len(user_input_name.strip()) == 0: # If a space / carriage return is provided instead of a name, default to a name, in our case, Bob. We love Bob.
user_input_name = 'Bob'

# OUTPUT

>> def validate_user_input_name():
...     global user_input_name # Declaring the name provided by the user to modify the global variable.
...     user_input_name = input("\nEnter your name: ") # Take user input for name
...     if len(user_input_name.strip()) == 0: # If a space / carriage return is provided instead of a name, default to a name, in our case, Bob. We love Bob.
...         user_input_name = 'Bob'
...
>>> validate_user_input_name()
>>> print(user_input_name)
Sb
>>> validate_user_input_name()
>>> print(user_input_name)
Bob

#### User provided input validation

Return True if user provided input is either '1' or '2' or '3'. If it is anything else return False, including for empty spaces and carriage returns.

def validate_user_input():
global user_input # Declaring the user_input provided by the user to modify the global variable.
user_input = input("\nEnter either 'Rock':1, 'Paper':2 or 'Scissors':3: ")
if len((str(user_input)).strip()) == 0: # Removing all carriage returns / empty space cases
return False
elif int(user_input) not in list(machine_choices.values()): # Removing all invalid integer cases
return False
else:
user_input = int(user_input)
return True

>>> def validate_user_input():
...     global user_input
...     user_input = input("\nEnter either 'Rock':1, 'Paper':2 or 'Scissors':3: ")
...     if len((str(user_input)).strip()) == 0:
...         return False
...     elif int(user_input) not in list(machine_choices.values()):
...         return False
...     else:
...         user_input = int(user_input)
...         return True
...
>>> validate_user_input()
Enter either 'Rock':1, 'Paper':2 or 'Scissors':3: 1
True
>>> validate_user_input()
Enter either 'Rock':1, 'Paper':2 or 'Scissors':3: 11
False
>>> validate_user_input()
Enter either 'Rock':1, 'Paper':2 or 'Scissors':3:
False
>>> validate_user_input()
Enter either 'Rock':1, 'Paper':2 or 'Scissors':3:
False

## Bonus

The os module has uses the standard c function system() to help execute system level commands. For clearing the screen in a linux environment you will use the clear command or in case of a windows environment you will use cls command.

import os
x = import.system('clear') # Linux environments

x = import.system('cls') # Windows environments

### Displaying scores as via a DataFrame

Welcome to the world of pandas. You can install pandas using the following code

python3.10 -m pip install pandas

The scoreboard that we designed is using pandas.

>>> score_board = pandas.DataFrame(columns=["Player_1_score_card","Player_2_score_card",'Draws'],index=['Round 1','Round 2','Round 3','Round 4','Round 5'])
>>> score_board = score_board.fillna(0)
>>> score_board
Player_1_score_card  Player_2_score_card  Draws
Round 1                    0                    0      0
Round 2                    0                    0      0
Round 3                    0                    0      0
Round 4                    0                    0      0
Round 5                    0                    0      0

### Ascii art

###     ######   ######  #### ####       ###    ########  ########
## ##   ##    ## ##    ##  ##   ##       ## ##   ##     ##    ##
##   ##  ##       ##        ##   ##      ##   ##  ##     ##    ##
##     ##  ######  ##        ##   ##     ##     ## ########     ##
#########       ## ##        ##   ##     ######### ##   ##      ##
##     ## ##    ## ##    ##  ##   ##     ##     ## ##    ##     ##
##     ##  ######   ######  #### ####    ##     ## ##     ##    ##

If you do not know this or this website already, do pay them a visit. Its fun to add some ascii graphics to terminal code. Our friend "The Machinee" is from here it self.

## Putting it all together

Visit my GitHub page to check out the complete code to create a Rock, paper, scissors game that can be played on the terminal.