<p>我最初发布了一个答案。几分钟后,有4个答案,都说了同样的话。我曾想过删除我的答案,或者干脆留下它,但我认为最好通过提供一个增强的答案来为提问者和社区提供更多的东西</p>
<p>正如其他答案所指出的那样,您的问题在于使用<code>cpu_choice</code>变量有两个目的,这破坏了程序的逻辑。你可以从其他答案中获得更多细节</p>
<p>当你成为一名更好的程序员时,你会学到一件事,那就是认识到你什么时候有可以消除的重复。我们称之为“干燥”或“不要重复自己”原则。这是代码的一个明显特征…有四个几乎相同的代码块,唯一的区别是某些字符串常量的特定值</p>
<p>在这种情况下,您将了解到您想要参数化重复的代码,以便只需要该代码的一个副本。这不仅可以节省屏幕上的时间和空间,还可以生成更易于维护的代码。如果您想更改处理用户输入值与计算机选择值比较的逻辑,您必须在四个位置进行更改。如果您将代码缩减为一个块,那么您只需进行一次更改</p>
<p>下面是一个版本的代码,它根据DRY原则将四个代码块减少为一个。它还有一些其他的增强功能。它会提示用户,以便他们知道要输入什么。它将根据用户需要进行任意多轮游戏,用户可以按Return退出游戏,而无需输入任何字母:</p>
<pre><code>import random
# Valid choices, each with a list of what that choice can beat
choices = {"rock":["scissors"],"paper":["rock"],"scissors":["paper" "dynamite"],"dynamite":["scissors"]}
while True:
print("rock, paper, scissors or dynamite? >", end="")
user_choice = input().lower().strip("!.?")
cpu_choice = random.choice(list(choices.keys()))
if not user_choice:
# End the program on an empty input
break
elif user_choice not in choices:
# Complain about an invalid choice
print("That's not a valid input value!")
else:
# Show what the computer picked
print("I picked " + cpu_choice)
# Do the appropriate thing based on the two choices
if user_choice == cpu_choice:
# The two choices were the same
print("It's a tie!")
elif cpu_choice in choices[user_choice]:
# The computer's choice is not in the list of things that the user's choice beats
print("Haha! I won!")
else:
# The computer's choice is in the list of things that the user's choice beats
# beats, so it must have won
print("Dang, I lost!")
</code></pre>
<p>以下是示例运行的情况:</p>
<pre><code>rock, paper, scissors or dynamite? >rock
I picked paper
Dang, I lost!
rock, paper, scissors or dynamite? >rock
I picked scissors
Haha! I won!
rock, paper, scissors or dynamite? >paper
I picked paper
It's a tie!
rock, paper, scissors or dynamite? >blah
That's not a valid input value!
rock, paper, scissors or dynamite? >rock
I picked dynamite
Dang, I lost!
rock, paper, scissors or dynamite? >
</code></pre>
<p>我希望这能通过教你干燥原理来帮助你</p>