为什么我的第二个输入循环回到开始循环?

时间:2018-03-16 18:45:36

标签: python python-3.x dice

所以我正在尝试创建代码,该代码接受num_rolls的用户输入,然后多次滚动两个骰子。

记录显示6个和7个的显示数量。然后它打印出每个卷和数字是什么。我正在让代码继续要求滚动输入,直到他选择1退出循环并随后打印统计数据。

我遇到的问题是在询问第二个输入请求后,它只是继续执行代码。

如何让它重新开始并以while循环开始?我的第二个输入是在错误的位置还是我需要创建一个额外的循环?

代码如下:

import random

num_sixes = 0
num_sevens = 0
num_rolls = int(input('Enter number of rolls:\n'))

while num_rolls >= 1:
    for i in range(1,num_rolls + 1):
        die1 = random.randint(1,6)
        die2 = random.randint(1,6)
        roll_total = die1 + die2

        #Count number of 6 and 7 rolled
        if roll_total == 6:
            num_sixes = num_sixes + 1
        if roll_total == 7:
            num_sevens = num_sevens + 1
        if i in range(1,num_rolls+1):
             print('Roll %d is %d (%d + %d)' % (i, roll_total, die1, die2))
    num_rolls = int(input('Enter number of rolls:\n'))

    print('\nDice roll statistics:')
    print('6s:', num_sixes)
    print('7s:', num_sevens)
else:
    print('Invalid number of r2olls. Try again.')

1 个答案:

答案 0 :(得分:1)

  

我正在让代码继续要求输入forrolls,直到他选择1退出循环并在之后打印统计信息。

  1. 如果您想在num_rolls等于1时退出循环,则需要测试while num_rolls > 1而不是while num_rolls >= 1

  2. 如果您只想在程序结束时打印骰子的结果,那么您应该删除

    print('\nDice roll statistics:')
    print('6s:', num_sixes)
    print('7s:', num_sevens)
    

    while循环开始,将其放在程序的最后。

  3. 您是否了解else循环末尾的while子句的作用?我很确定行为产生的不是你想要的。如果要验证用户的输入是否有效,则需要与主while循环分开进行。

    由于您没有指定用户输入应该验证的 ,我将把该任务留给您。实际上,这很简单。有关详细信息,请参阅Asking the user for input until they give a valid response。最重要的一点是,你需要一个单独的循环。

  4. 以下是您进行上述修改的代码:

    import random
    
    num_sixes = 0
    num_sevens = 0
    num_rolls = int(input('Enter number of rolls:\n'))
    
    while num_rolls > 1:
        for i in range(1,num_rolls + 1):
            die1 = random.randint(1,6)
            die2 = random.randint(1,6)
            roll_total = die1 + die2
    
            #Count number of 6 and 7 rolled
            if roll_total == 6:
                num_sixes = num_sixes + 1
            if roll_total == 7:
                num_sevens = num_sevens + 1
            if i in range(1,num_rolls+1):
                 print('Roll %d is %d (%d + %d)' % (i, roll_total, die1, die2))
        num_rolls = int(input('Enter number of rolls:\n'))
    
    print('\nDice roll statistics:')
    print('6s:', num_sixes)
    print('7s:', num_sevens)
    

    测试上述代码时,会产生输出:

    Enter number of rolls:
     2
    Roll 1 is 5 (2 + 3)
    Roll 2 is 7 (1 + 6)
    Enter number of rolls:
     4
    Roll 1 is 6 (3 + 3)
    Roll 2 is 7 (5 + 2)
    Roll 3 is 12 (6 + 6)
    Roll 4 is 8 (6 + 2)
    Enter number of rolls:
     6
    Roll 1 is 7 (6 + 1)
    Roll 2 is 5 (3 + 2)
    Roll 3 is 10 (5 + 5)
    Roll 4 is 6 (1 + 5)
    Roll 5 is 11 (5 + 6)
    Roll 6 is 9 (3 + 6)
    Enter number of rolls:
     1
    
    Dice roll statistics:
    6s: 2
    7s: 3
    
      

    那么如何才能让用户无法输入负数或字母?

    如果要验证用户输入是否为正数,则可以使用 1 下面的代码:

    def get_num_rolls():
        nrolls = input('Enter number of rolls:\n')
        while not nrolls.isdigit():
            nrolls = input('Enter number of rolls:\n')
        return int(nrolls)
    

    然后,您可以在需要获取用户输入的地方调用上述函数:

    import random
    
    
    def get_num_rolls():
        nrolls = input('Enter number of rolls:\n')
        while not nrolls.isdigit():
            nrolls = input('Enter number of rolls:\n')
        return int(nrolls)
    
    
    num_sixes = 0
    num_sevens = 0
    num_rolls = get_num_rolls()
    
    
    while num_rolls > 1:
        ...
        num_rolls = get_num_rolls()
    ...
    

    1 上面的解决方案通过利用str.isdigit为负数返回false的事实做了一些作弊,但它应该适用于您的案例。