Python我如何让石头剪纸运行多轮?

2024-09-29 00:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:谢谢你的帮助

所以我在一个初级班,没有太多经验,我遇到了这个问题: 我试图让比赛重复五次,我想发生的是

Player inputs choice

Game spits out result

Move onto round 2

Ask for choice again

Game spits out result... etc

但最终发生的是

Player inputs choice

Game spits out result

Move onto round 2

Program asks for choice (I think)

The if/elif is completely disregarded after round 1 as in whatever I input spits no result

Can hit enter five times before program ends

我在这里的挑战是在尽可能简洁的同时做到这一点,因为我可以做到,但最终的程序会非常长,非常难看

无论如何,要问一个特定的问题,是否有可能像这样重复使用同一个变量五次?为什么在第一轮之后完全忽略了if/else

import random

cpu_choice = ["rock","paper","scissors","dynamite"]

for i in range(5):

    choice = input().lower().strip("!.?")
    cpu_choice = random.choice(cpu_choice)

    if "rock" in choice:
        if cpu_choice == "rock":
            print("It's a tie!")
        elif cpu_choice == "scissors":
            print("Dang, I lost!")
        elif cpu_choice == "paper" or cpu_choice == "dynamite":
            print("Haha! I won!")

    elif "paper" in choice:
        if cpu_choice == "rock":
            print("Dang, I lost!")
        elif cpu_choice == "paper":
            print("It's a tie!")
        elif cpu_choice == "scissors" or cpu_choice == "dynamite":
            print("Haha! I won!")

    elif "scissors" in choice:
        if cpu_choice == "rock":
            print("Haha! I won!")
        elif cpu_choice == "scissors":
            print("It's a tie!")
        elif cpu_choice == "paper" or cpu_choice == "dynamite":
            print("Dang, I lost!")

    elif "dynamite" in choice:
        if cpu_choice == "scissors":
            print("Dang, I lost!")
        elif cpu_choice == "dynamite":
            print("It's a tie!")
        elif cpu_choice == "paper" or cpu_choice == "rock":
            print("Haha! I won!")
    else:
        print("Please use rock, paper, scissors, or dynamite!")
    
    ```

Tags: orinifitresultcpupaperprint
3条回答

代码的问题是这一行: cpu_choice = random.choice(cpu_choice)。从列表中选择一个对象,然后将其保存在cpu_选项中

换句话说,在第一轮之后,您无法访问cpu_选项本身,因为您在上一轮中覆盖了它。诀窍很简单;更改变量名:

import random

cpu_choice2 = ["rock","paper","scissors","dynamite"]

for i in range(5):

    choice = input().lower().strip("!.?")
    cpu_choice = random.choice(cpu_choice2)

    if "rock" in choice:
        if cpu_choice == "rock":
            print("It's a tie!")
        elif cpu_choice == "scissors":
            print("Dang, I lost!")
        elif cpu_choice == "paper" or cpu_choice == "dynamite":
            print("Haha! I won!")

我刚刚在您的cpu列表名称中添加了一个2

我最初发布了一个答案。几分钟后,有4个答案,都说了同样的话。我曾想过删除我的答案,或者干脆留下它,但我认为最好通过提供一个增强的答案来为提问者和社区提供更多的东西

正如其他答案所指出的那样,您的问题在于使用cpu_choice变量有两个目的,这破坏了程序的逻辑。你可以从其他答案中获得更多细节

当你成为一名更好的程序员时,你会学到一件事,那就是认识到你什么时候有可以消除的重复。我们称之为“干燥”或“不要重复自己”原则。这是代码的一个明显特征…有四个几乎相同的代码块,唯一的区别是某些字符串常量的特定值

在这种情况下,您将了解到您想要参数化重复的代码,以便只需要该代码的一个副本。这不仅可以节省屏幕上的时间和空间,还可以生成更易于维护的代码。如果您想更改处理用户输入值与计算机选择值比较的逻辑,您必须在四个位置进行更改。如果您将代码缩减为一个块,那么您只需进行一次更改

下面是一个版本的代码,它根据DRY原则将四个代码块减少为一个。它还有一些其他的增强功能。它会提示用户,以便他们知道要输入什么。它将根据用户需要进行任意多轮游戏,用户可以按Return退出游戏,而无需输入任何字母:

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!")

以下是示例运行的情况:

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? >

我希望这能通过教你干燥原理来帮助你

您将cpu_选项用于两种不同的事情。第一次,它是cpu拥有的潜在选择列表。但随后,您将其重新定义为cpu实际选择的结果。这意味着(假设cpu在第一次迭代中选择了rock),在第二次迭代中,您有“cpu_choice=random.choice(“rock”)”,因为python将字符串视为列表,所以它将输出“r”、“o”、“c”或“k”。您不会因此收到错误消息,因为您的内部if语句中没有else语句

只需将第二行重命名为潜在的_选项,就可以了

相关问题 更多 >