I edited my previous question because I came up with the code I think is correct.
The logic behind this should be:
while the set is not over and it’s not a tie 10:10: player A starts serving and does it twice regardless he wins points or not, then player B takes serve and does it twice also. It continues until the set is over, except there is a tie 10:10 when servers change each point scored.
Can anyone check if the code is flawless? thank you.
def simOneSet(probA, probB):
serving = "A"
scoreA = scoreB = 0
while not setOver(scoreA, scoreB):
if scoreA != 10 and scoreB != 10:
if serving == "A":
for i in range(2):
if random() < probA:
scoreA += 1
else:
scoreB += 1
serving = "B"
else:
for i in range(2):
if random() < probB:
scoreB +=1
else:
scoreA += 1
serving = "A"
# when there is a tie 10:10
else:
if serving == "A":
if random() < probA:
scoreA += 1
serving = "B"
else:
scoreB += 1
serving = "B"
else:
if random() < probB:
scoreB += 1
serving = "B"
else:
scoreA += 1
serving = "A"
return scoreA, scoreB
I would use a dict to “switch” between players:
Then, if
servingequals'A', thenother[serving]would equal'B', and ifservingequals'B', thenother[serving]would equal'A'.You could also use a collections.Counter to keep track of the score:
Also notice how in this piece of code
there are two blocks which are basically the same idea repeated twice. That’s a sign that the code can be tightened-up by using a function. For example, we could define a function
servewhich when given a probabilityproband a player (AorB) returns the player who wins:then the above code would become
Thus, you can compactify your code quite a bit this way: