作为Python 3.4中的一个开始项目,我试图编写一些模拟滚动骰子的代码并对结果应用一些简单的规则,但是我遇到了困难。
滚动10面骰子,在此示例中,该功能通过6个10面骰子的参数滚动。该函数也传递一个目标数,在本例中为6.该函数也采用一个布尔值。
对于每个等于或等于目标数量的个体骰子,都会得到成功。
如果任何1被推出,他们会“取消”成功。
我发现这相当直接,但是在应用以下规则时,我变得虚伪;
如果将布尔值True传递给函数,则任何10的滚动计数都会成功,但可能会再次滚动。 1在任何其他“正常”成功之前取消10。
最初我编写的代码似乎有效,但重新推出的10代并没有正确地增加成功。
我已经多次通过调试器而且我看不出我做错了什么,虽然我确信它必须位于我成功的地方=成功+ 1个陈述。
非常感谢任何帮助或建议。
import random
def rollDice(numberOfDice, difficulty = 6, specialism = False):
diceRoll = []
rolledOnes = 0
rolledTens = 0
successes = 0
for i in range (numberOfDice):
diceRoll.append(random.randint(1,10))
rolledOnes = diceRoll.count(1)
rolledTens = diceRoll.count(10)
for i in range (numberOfDice):
if diceRoll[i] >= difficulty:
successes = successes +1
if specialism == True:
if rolledOnes > 0:
successes = successes - rolledOnes
rolledTens = rolledTens - rolledOnes
if rolledTens > 0:
for i in range (rolledTens):
reRoll = random.randint(1,10)
if reRoll <= difficulty < 10:
successes = successes + 1
while reRoll == 10:
if reRoll == 10:
successes = successes + 1
reRoll = random.randint(1,10)
else:
for i in range (rolledTens):
reRoll = random.randint(1,10)
while reRoll == 10:
if reRoll >= difficulty:
successes = successes + 1
reRoll = random.randint(1,10)
elif specialism == False:
if rolledOnes > 0:
successes = successes - rolledOnes
return successes
print ('You have', rollDice(6, 6, True), 'Successes!')
答案 0 :(得分:1)
很难确定,但我认为你的问题是在10岁但没有1的情况下发生的,因为你这样做:
for i in range (rolledTens):
reRoll = random.randint(1,10)
while reRoll == 10:
if reRoll >= difficulty:
successes = successes + 1
reRoll = random.randint(1,10)
所以,如果你重新打电话,比如9,那是>= difficulty
,但由于它不是== 10
,你永远不会去检查,所以你永远不会添加到successes
。
因此,如果前一个案例(有些案例)的代码是正确的,那么这个代码 - 显然应该做同样的事情 - 是不正确的。
这就是为什么你永远不想两次编写相同的代码。除了一个之外,在每个地方都很容易做到。如果您想要相同的效果,请尝试在所有位置运行相同的代码。例如,在这里,你可以这样做:
if rolledOnes > 0:
successes = successes - rolledOnes
rolledTens = rolledTens - rolledOnes
# everything else should be the same whether there were any ones or not
if rolledTens > 0:
for i in range (rolledTens):
reRoll = random.randint(1,10)
if reRoll <= difficulty < 10:
successes = successes + 1
while reRoll == 10:
if reRoll == 10:
successes = successes + 1
reRoll = random.randint(1,10)
与此同时,你似乎做了大量额外的工作,没有做任何事情。例如:
if rolledTens > 0:
for i in range (rolledTens):
那里有什么考验?如果rolledTens
为0或为否定,for i in range(rolledTens)
会发生什么?
while reRoll == 10:
if reRoll == 10:
当我们刚刚进入由reRoll == 10
控制的循环时,while reRoll == 10
怎么可能不成立?
while reRoll == 10:
if reRoll >= difficulty:
同样,在这个循环的顶部,reRoll >= difficulty
怎么可能不是真的?
elif specialism == False:
这是elif
到if specialism == True
。因此,除非您希望允许除True
或False
以外的某些第三个值表示“1不执行任何操作”,否则此测试是什么?
由于我不知道你的思维过程是什么,我不能说这些测试是否无用,或者它们是否重要但写错了(可能解释了你的部分问题)。但希望你能理解这些测试应该做些什么。
最后,作为旁注:您通常不希望将任何内容与True
或False
进行比较。只需撰写if specialism:
或if not specialism:
即可。唯一的例外是,当您明确要将True
或False
视为与其他真实或虚假价值不同时(这种情况非常罕见;更常见的是您要特别对待is None
,然后对待每一个其他虚假价值相同......)
答案 1 :(得分:1)
感谢上述答案和评论,以下内容现已按预期运作。
import random
def rollDice(numberOfDice, difficulty = 6, specialism = False):
diceRoll = []
rolledOnes = 0
rolledTens = 0
successes = 0
for i in range (numberOfDice):
diceRoll.append(random.randint(1,10))
rolledOnes = diceRoll.count(1)
rolledTens = diceRoll.count(10)
for i in range (numberOfDice):
if diceRoll[i] >= difficulty:
successes = successes +1
if specialism:
if rolledOnes > 0:
successes = successes - rolledOnes
rolledTens = rolledTens - rolledOnes
if rolledTens > 0:
for i in range (rolledTens):
reRoll = random.randint(1,10)
while reRoll == 10:
successes = successes + 1
reRoll = random.randint(1,10)
if reRoll >= difficulty < 10:
successes = successes + 1
else:
if rolledOnes > 0:
successes = successes - rolledOnes
else:
return successes
#MAIN
print ('You have', rollDice(7), 'Successes!')