# racquetball.py
# This program simulates the game of racquetball between two players
# called "A" and "B". The ability of each player is indicated by a
# probability (between 0 and 1) that the player wins the point when
# serving. Player A always has the first move.
# (Derived from: Python Programming an Introduction to Computer Science)
# by: Scott Gordon
from random import random
def main():
print_intro()
prob_a, prob_b, n = get_inputs()
wins_a, wins_b = sim_n_games(n, prob_a, prob_b)
print_summary(wins_a, wins_b)
def print_intro():
print('''This program simulates a game of racquetball between two
players called "A" and "B". The ability of each player is
indicated by a probability (a number between 0 and 1) that
the player wins the point when serving. Player A always has
the first move.
''')
def get_inputs():
a = float(input("What is the probability player A wins the serve? "))
b = float(input("What is the probability player B wins the serve? "))
n = int(input("How many games to simulate? "))
return a, b, n
def sim_n_games(n, prob_a, prob_b):
wins_a = wins_b = 0
for i in range(n):
score_a, score_b = sim_one_game(prob_a, prob_b)
if score_a > score_b:
wins_a = wins_a + 1
else:
wins_b = wins_b + 1
return wins_a, wins_b
def sim_one_game(prob_a, prob_b):
serving = "A"
score_a = 0
score_b = 0
while not game_over(score_a, score_b):
if serving == "A":
if random() < prob_a:
score_a += 1
else:
serving = "B"
else:
if random() < prob_b:
score_b += 1
else:
serving = "A"
return score_a, score_b
def game_over(a, b):
# Return True if game is over False otherwise
return a == 15 or b == 15
def print_summary(wins_a, wins_b):
n = wins_a + wins_b
print('\nGames simulated:', n)
print(f'Wins for A: {wins_a} {wins_a/n:0.1%}')
print(f'Wins for B: {wins_b} {wins_b/n:0.1%}')
if __name__ == '__main__':
main()
Photo by Thomas Park on Unsplash
Top comments (0)