我正在制作一个硬币翻转游戏,询问用户“头部或尾部”,并且在用户选择其中之一后,它将回复说“正确”或“错误”。当我运行我的代码时,如果我不断重复头部或尾部,它的工作完全正常。但是,如果我像头,头,尾巴一样切换它。它不再问我“头或尾”这个问题了。奇怪的是,有时在切换之后它会问,但最终会停止。这是我的代码:
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
在最后的头之后,我说它没有说是正确或错误,有时甚至在我运行它时也没有显示它。
答案 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
调用移到条件部分之外。由于它对所有分支都是相同的,因此不需要重复。我还使用elif
和else
将条件部分绑定在一起,确保其中只有一个可以运行任何迭代(每次循环)。关于重复,你的两个条件执行完全相同的操作!你已经走了一条捷径,并没有真正计算出硬币落在哪一边 - 只是用它的成功几率。让我们解决这个问题。
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
。这些是独立的,除了内部的只有外部条件成立才能运行的事实。各种控制流语句(以:
结尾)可以这种方式嵌套。