输入更改时脚本停止打印输出

时间:2018-02-11 13:25:46

标签: python

我正在制作一个硬币翻转游戏,询问用户“头部或尾部”,并且在用户选择其中之一后,它将回复说“正确”或“错误”。当我运行我的代码时,如果我不断重复头部或尾部,它的工作完全正常。但是,如果我像头,头,尾巴一样切换它。它不再问我“头或尾”这个问题了。奇怪的是,有时在切换之后它会问,但最终会停止。这是我的代码:

import random
coin=["CORRECT!", "WRONG!"]

hot=raw_input("Heads or Tails? \n")

while hot == "heads":
    if hot=="heads":
        for i in range(1):
            print random.choice(coin)
            hot=raw_input("Heads or Tails? \n")

while hot =="tails":
    if hot=="tails":
        for i in range(1):
            print random.choice(coin)
            hot=raw_input("Heads or Tails? \n")

然后这就是我在运行时所讨论的问题

Heads or Tails? 
heads
CORRECT!
Heads or Tails? 
tails
CORRECT!
Heads or Tails? 
tails
WRONG!
Heads or Tails? 
heads

在最后的头之后,我说它没有说是正确或错误,有时甚至在我运行它时也没有显示它。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下方法实现相同的目标:

hot = raw_input('Heads or Tails?\n')

while hot != 'quit':

    if hot == random.choice(['heads', 'tails']):
        print 'Correct!'
        hot = raw_input('Heads or Tails?\n')
    else:
        print 'Wrong!'
        hot = raw_input('Heads or Tails?\n')

这允许用户继续翻转硬币直到用户输入“退出”。

答案 1 :(得分:0)

在您停止响应“tails”后,您的程序停止并不奇怪。这是因为基本的控制流程。您在程序中使用了五种类型的控制流程。

首先,除非另有说明,否则控制将从一个语句流向下一个语句。因此import random首先发生,然后发送coin,依此类推。

其次,您使用了raw_input()random.choice()等函数调用。这些子程序运行其他子程序,因为它们return都在你的主程序中,所以我们不需要在这里深入考虑。

第三个是两个while循环结构。只要条件满足,它们就会包含一些重复的代码段;至关重要的是,当它不是时,它们结束。所以当你回应“头”以外的东西时,第一个循环实际上就结束了。

第四,每个循环中都有一个if statement。如果条件满足,则运行其内容,就像while一样,但不重复。由于您使用的条件与周围的while完全相同,因此这些检查是多余的;如果条件不满足,我们不会执行该程序的这一部分。

第五,你使用了for声明;这些make循环,如while,但处理某些iterable的每个条目。在这种情况下,这没有任何意义,因为range(1)中只有一个条目而您实际上从未使用它。与if一样,它是多余的。

解密了这些,我们看到控制流从“头”循环移动到“尾巴”循环然后简单地结束,程序用完了。为了使程序保持运行,我们必须有一个 not 结束的循环,例如:

while True:
    if hot=="heads":
        for i in range(1):
            print random.choice(coin)
            hot=raw_input("Heads or Tails? \n")

    if hot=="tails":
        for i in range(1):
            print random.choice(coin)
            hot=raw_input("Heads or Tails? \n")

这个循环表现出另一个问题,即没有任何东西检查输入的答案是头还是尾。因此,如果我们给出另一个答案,它将无法运行 nothing 。您可以通过确保我们在每次迭代中要求猜测来解决此问题,并且为了一些额外的天赋,甚至可以使用else回复无效猜测:

while True:
    hot=raw_input("Heads or Tails? \n")
    if hot=="heads":
        for i in range(1):
            print random.choice(coin)
    elif hot=="tails":
        for i in range(1):
            print random.choice(coin)
    else:
        print "I don't know what side of a coin that is."

请注意,我已将raw_input调用移到条件部分之外。由于它对所有分支都是相同的,因此不需要重复。我还使用elifelse将条件部分绑定在一起,确保其中只有一个可以运行任何迭代(每次循环)。关于重复,你的两个条件执行完全相同的操作!你已经走了一条捷径,并没有真正计算出硬币落在哪一边 - 只是用它的成功几率。让我们解决这个问题。

sides = ("heads", "tails")

while True:
    hot = raw_input("Heads or Tails? \n")
    if hot in sides:
        toss = random.choice(sides)
        if hot == toss:
            print "Correct"
        else:
            print "Incorrect"
    else:
        print "I don't know what side of a coin that is."

请注意,这次不同级别有两个if语句,每个语句都有自己的else。这些是独立的,除了内部的只有外部条件成立才能运行的事实。各种控制流语句(以:结尾)可以这种方式嵌套。