Rock Paper Scissors

number_of_rounds = 50
player1 = 'Steven'
player2 = 'Edward'
choices = {
'Steven':['Rock','Paper','Scissors'],
'Bart':['Rock'],
'Edward':['Scissors','Scissors','Paper'],
'Freddie':['Paper','Paper','Rock','Paper','Paper','Rock']}
# create a dataframe of rock beats scissors etc.
import pandas as pd
winlose = pd.DataFrame(columns=['Rock','Paper','Scissors'])
winlose['Rock'] = ['Tie','Win','Loss']
winlose['Paper'] = ['Loss','Tie','Win']
winlose['Scissors'] = ['Win','Loss','Tie']
winlose.index = ['Rock','Paper','Scissors']
from random import choices as c
p1wins = 0
p2wins = 0
ties = 0
p1c = ''
p2c = ''
results = pd.DataFrame(columns=['Tie']) # so that 'Tie' is listed below the others in the chart
for x in range(number_of_rounds+1):
results = results.append({player1+' Choice':p1c, player2+' Choice':p2c, 'Tie':ties, player2:p2wins, player1:p1wins}, ignore_index=True)
p1c = c(choices[player1])[0]
p2c = c(choices[player2])[0]
result = winlose.at[p1c, p2c]
if result == 'Win':
p1wins += 1
if result == 'Loss':
p2wins +=1
if result == 'Tie':
ties += 1
# convert wide dataframe to tidy
results['Round'] = results.index
tidy_results = results.drop(columns=[player1+' Choice', player2+' Choice']).melt('Round', var_name='Player', value_name='Wins')
import plotly.express as px
fig = px.bar(tidy_results, y='Player', x='Wins', orientation='h', animation_frame='Round', color='Player')
fig.update_layout(xaxis_range=[0,tidy_results['Wins'].max()+1], showlegend=False)
fig.update_layout(title='Rock Paper Scissors Tournament to '+str(number_of_rounds))
#fig.write_html('rps.html')
fig.show()
results
We can also count how many times a player chose each of the options:
results['Edward Choice'].value_counts()
Or display the round choices for all of the players:
for column in results.columns:
if 'Choice' in column:
print(results[column].value_counts())
print('---')
winlose
To check if Player 1 wins by choosing Rock when Player 2 chooses Paper, we can use the following code.
winlose.at['Rock','Paper']
Challenges
Try editing the first code cell to have different matches, for example Bart versus Freddie.
If you are feeling even more adventurous, try adjusting the code to have them play Rock Paper Scissors Lizard Spock.
