【问题标题】:Elif statements not printingElif 语句不打印
【发布时间】:2023-08-26 16:06:01
【问题描述】:

我正在为学校编写基本的剪刀石头布代码,但我的 elif 语句没有运行。

def player1(x):
    while x != 'rock' and x != 'paper' and x != 'scissors':
        print("This is not a valid object selection")
        x = input("Player 1? ")

def player2(x):
    while x != 'rock' and x != 'paper' and x != 'scissors':
        print("This is not a valid object selection")
        x = input("Player 2? ")

def winner():
    player1(input("Player 1? "))
    player2(input("Player 2? "))
    if player1 == 'rock' and player2 == 'rock':
        print('Tie')
    elif player1 == 'paper' and player2 == 'paper':
        print('Tie')
    elif player1 == 'rock' and player2 == 'paper':
        print('Player 2 wins')
    elif player1 == 'paper' and player2 == 'rock':
        print('Player 1 wins')
    elif player1 == 'rock' and player2 == 'scissors':
        print('Player 1 wins')
    elif player1 == 'scissors' and player2 == 'rock':
        print('Player 2 wins')
    elif player1 == 'paper' and player2 == 'scissors':
        print('Player 2 wins')
    elif player1 == 'scissors' and player2 == 'paper':
        print('Player 1 wins')
    elif player1 == 'scissors' and player2 == 'scissors':
        print('Tie')

winner()

当我运行此代码时,它会询问“玩家 1?”不接受石头、纸或剪刀以外的任何东西。然后它继续为 player2 做同样的事情。然而,这是代码结束的地方,它不会运行我的 elif 语句并打印哪个玩家获胜。

编辑:已解决。感谢您帮助初学者。我完全忘记了返回字符串并将它们分配给变量。

【问题讨论】:

  • 等一下,player1player2 不是变量,它们是函数引用……而您是在将它们与字符串进行比较?如果您想在winner 中使用它,我还想将x 返回给被调用者。

标签: python


【解决方案1】:

player1 中分配给 x 没有任何作用。一旦函数返回,分配给 x 的值就会被删除。这意味着您正在丢弃您的输入!然后您将 function player1 与可能与您的输入匹配或不匹配的 string 进行比较。

调试建议:每当您遇到控制流问题时,打印出控制变量。在这里,如果你打印 player1,你会看到一些令人惊讶的东西。

【讨论】:

    【解决方案2】:

    您的比较:

    elif player1 == "rock" and player2 == "rock":
    # etc
    

    总是会失败,因为 player1 和 player2 都是函数。

    相反,您需要从函数返回并将它们分配给变量。让我们把验证剪掉一分钟,然后稍微减少一点。

    def choose(prompt):
        return input(prompt)
    
    def winner(a, b):
        if a == 'rock':
            if b == 'rock': return None
            elif b == 'paper': return 2
            elif b == 'scissors': return 1
        elif a == 'paper':
            # etc
    
    def play_game():
        p1_choice = choose("Player 1: ")
        p2_choice = choose("Player 2: ")
        return winner(p1_choice, p2_choice)
    

    请注意,让这些 elif 链看起来更好看的技巧是将它们放入字典中并改为索引字典。

    RESULT_DICT = {"rock": {"rock": None,
                            "paper": 2,
                            "scissors": 1},
                   "paper": {"rock": 1,
                             "paper": None,
                             "scissors": 2},
                   "scissors": {"rock": 2,
                                "paper": 1,
                                "scissors": None}}
    
    def winner(a, b):
        return RESULT_DICT[a][b]
    

    【讨论】:

    • 我可能会 return None if a == b else RESULT_DICT[a][b]... 然后你可以删除该字典的 33%。
    • @TemporalWolf 是的,我也是,然后将所有选择和所有结果滚动到类成员 Enums 中,并以这种方式进行输入验证。但这既不是这里也不是那里。
    • return None if a == b else ((2 if b == "Paper" else 1) if a == "Rock" else ((2 if b == "Scissors" else 1) if a == "Paper" else (2 if b == "Rock" else 1))) 不需要字典。我会看到自己的。
    • 我觉得我们的工作方向相反:gist.github.com/anonymous/47f9d388e53de3124e5c5f2d5a9cc1ab
    • @TemporalWolf ick,那 200 个字符的行物理伤害了我。大声笑