我正在尝试使用英国规则来模拟壁球比赛的得分。 这些是:
我的代码是:
import random
def eng_game(a,b):
A = 'bob'
B = 'susie'
players = [A, B]
server = random.choice(players)
print server
points_bob = 0
points_susie= 0
prob_A_wins = 0.4
prob_B_wins = 0.6
while points_bob or points_susie < 9:
probability = random.random()
print probability
if probability < prob_A_wins and server == A:
points_bob += 1
elif probability < prob_A_wins and server == B:
server == A
print server
if probability > prob_A_wins and server == B:
points_susie += 1
elif probability > prob_A_wins and server == A:
server == B
print server
print points_bob
print points_susie
此代码返回苏西赢得9-0,在某些情况下,服务器应该交换到鲍勃赢得该点,但这不会发生。该服务与Susie保持一致,她赢得了这一点。
答案 0 :(得分:4)
我认为问题是陈述server == A
和server == B
应该是server = A
和server = B
,以便进行分配而不是比较。
我看到的另一个边缘案例错误是如果概率最终结果为0.4,那么您的程序就会像虚拟服务从未发生过一样。
我会将你的循环改为:
while points_bob < 9 and points_susie < 9:
probability = random.random()
print probability
if probability <= prob_A_wins and server == A:
points_bob += 1
elif probability <= prob_A_wins and server == B:
server = A
print server
if probability > prob_A_wins and server == B:
points_susie += 1
elif probability > prob_A_wins and server == A:
server = B
print server
print points_bob
print points_susie
答案 1 :(得分:1)
我怀疑你的循环条件
while points_bob or points_susie < 9:
没有按你的想法行事。当被解释为布尔值时,如果它们为零,则数字为False
,否则为True
,这意味着这将实际检查(points_bob != 0) or (points_susie < 9)
。这只会是False
(即,循环只会停止),当Susie至少有9分并且Bob没有积分时 - 如果Bob获得任何积分,游戏将永远持续下去。
要解决此问题,您应该切换到and
条件。只有当两名球员的得分都低于9分时才会继续这样做,换句话说,只要有人达到9分,它就会停止。因此,您的循环条件应为
while points_bob < 9 and points_susie < 9:
如果你想将获胜条件改为10分,那么你需要将玩家的分数与变量而不是常数进行比较,然后根据需要改变变量:
winning_score = 9
while points_bob < winning_score and points_susie < winning_score:
# ...
# Accumulate your points etc.
# ...
# Now need to reach ten points to win.
winning_score = 10