为什么这个变量不按预期计算?

时间:2014-08-12 02:51:00

标签: python-3.x

作为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!')

2 个答案:

答案 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:

这是elifif specialism == True。因此,除非您希望允许除TrueFalse以外的某些第三个值表示“1不执行任何操作”,否则此测试是什么?

由于我不知道你的思维过程是什么,我不能说这些测试是否无用,或者它们是否重要但写错了(可能解释了你的部分问题)。但希望你能理解这些测试应该做些什么。


最后,作为旁注:您通常不希望将任何内容与TrueFalse进行比较。只需撰写if specialism:if not specialism:即可。唯一的例外是,当您明确要将TrueFalse视为与其他真实或虚假价值不同时(这种情况非常罕见;更常见的是您要特别对待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!')