我正在尝试模拟n场比赛的掷骰子。代码似乎对我有意义,但我从来没有得到正确的结果。例如,如果我输入n = 5即五场比赛,则胜负总和大于5。
以下是它应该如何工作:如果初始滚动为2,3或12,则玩家输掉。如果掷骰是7或11,则玩家获胜。任何其他初始滚动都会导致玩家再次滚动。他继续滚动,直到他掷出7或初始掷骰的价值。如果他在滚动7之前重新滚动初始值,那就是胜利。首先滚动7是一种损失。
from random import randrange
def roll():
dice = randrange(1,7) + randrange (1,7)
return dice
def sim_games(n):
wins = losses = 0
for i in range(n):
if game():
wins = wins + 1
if not game():
losses = losses + 1
return wins, losses
#simulate one game
def game():
dice = roll()
if dice == 2 or dice == 3 or dice == 12:
return False
elif dice == 7 or dice == 11:
return True
else:
dice1 = roll()
while dice1 != 7 or dice1 != dice:
if dice1 == 7:
return False
elif dice1 == dice:
return True
else:
dice1 = roll()
def main():
n = eval(input("How many games of craps would you like to play? "))
w, l = sim_games(n)
print("wins:", w,"losses:", l)
答案 0 :(得分:5)
问题在于
if game():
wins = wins + 1
if not game():
losses = losses + 1
相反,它应该是
if game():
wins = wins + 1
else:
losses = losses + 1
在您的代码中,您正在模拟两个游戏而不是一个游戏(通过调用game()
两次)。这给出了四种可能的结果,而不是两种(赢/输),给出了不一致的总体结果。
答案 1 :(得分:3)
在此代码中
for i in range(n):
if game():
wins = wins + 1
if not game():
losses = losses + 1
你打电话给game()
两次,所以你在那里玩了两场比赛。你想要的是一个else块:
for i in range(n):
if game():
wins = wins + 1
else:
losses = losses + 1
顺便说一句,您可以使用in
简化逻辑:
def game():
dice = roll()
if dice in (2,3,12):
return False
if dice in (7,11):
return True
# keep rolling
while True:
new_roll = roll()
# re-rolled the initial value => win
if new_roll==dice:
return True
# rolled a 7 => loss
if new_roll == 7:
return False
# neither won or lost, the while loop continues ..
代码完全就是你给出的描述。
答案 2 :(得分:1)
不要这样做
for i in range(n):
if game():
wins = wins + 1
if not game():
losses = losses + 1
它完全没有用。
答案 3 :(得分:0)
此代码存在许多问题。最重要的是,你在每个循环中调用game()两次。您需要调用一次并存储结果,然后根据它进行切换。
答案 4 :(得分:0)
OO重写:
import random
try:
rng = xrange # Python 2.x
inp = raw_input
except NameError:
rng = range # Python 3.x
inp = input
def makeNSidedDie(n):
_ri = random.randint
return lambda: _ri(1,n)
class Craps(object):
def __init__(self):
super(Craps,self).__init__()
self.die = makeNSidedDie(6)
self.firstRes = (0, 0, self.lose, self.lose, 0, 0, 0, self.win, 0, 0, 0, self.win, self.lose)
self.reset()
def reset(self):
self.wins = 0
self.losses = 0
def win(self):
self.wins += 1
return True
def lose(self):
self.losses += 1
return False
def roll(self):
return self.die() + self.die()
def play(self):
first = self.roll()
res = self.firstRes[first]
if res:
return res()
else:
while True:
second = self.roll()
if second==7:
return self.lose()
elif second==first:
return self.win()
def times(self, n):
wins = sum(self.play() for i in rng(n))
return wins, n-wins
def main():
c = Craps()
while True:
n = int(inp("How many rounds of craps would you like to play? (0 to quit) "))
if n:
print("Won {0}, lost {1}".format(*(c.times(n))))
else:
break
print("Total: {0} wins, {1} losses".format(c.wins, c.losses))
if __name__=="__main__":
main()