我的代码似乎只让玩家2获胜。我不确定需要更改什么

时间:2019-07-03 18:46:30

标签: python python-3.x

我有一位人类玩家和一位随机玩家。 人类玩家是输入,随机玩家只是在随机移动。我互相对抗,玩家2总是获胜。

我不确定缺少什么。我已经尝试了多种方法。我曾尝试编辑Beats功能,但是我需要它来做功课。他们在入门代码中给了我们。

我认为这与玩家有关。

这是代码的链接:https://codeshare.io/aY9KPM

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题。 Brandon Wang has identified one,您已经忘记在beats方法的elif块中调用play_round。但这只会导致人类赢得所有联系,而不是绝对赢得所有比赛。玩家1永远无法取胜的原因是,人们的输入总是被忽略。

其原因在于HumanPlayer类的这一部分:

    while True:
        if playermove.lower() not in moves:
            print("Sorry invalid imput")
            playermove = input("Please Pick: Rock, Paper, or Scissors ")
        else:
            break
            return (playermove)

具体来说,问题是您在break语句之前可以return退出循环中,以返回人类玩家选择的举动。 return语句永远不会运行,因此该函数默认会返回None(因为它的代码在函数末尾运行,而没有返回任何其他内容)。

您只需删除break语句即可解决此问题。无论如何,当return语句退出函数时,循环将结束,因此无需单独break

或者您可以将测试条件(未知动作)放在while循环中,而不是放在循环内的if内,而在循环结束后return中:

playermove = input("Please Pick: Rock, Paper, or Scissors ").lower()
while playermove not in moves:
    print("Sorry invalid imput")
    playermove = input("Please Pick: Rock, Paper, or Scissors ").lower()
return playermove

请注意,在Python 3.8(目前处于测试版,尚未完全发布)中,您将能够使用新的input walrus运算符来避免:=行的重复中间表达式分配:

while (playermove := input("Please Pick: Rock, Paper, or Scissors ").lower()) not in moves:
    print("Sorry invalid imput")

请注意,我更改了lower调用,使其在获得输入后立即完成。除了看起来更好之外,这实际上还修复了您最终会发现的另一个错误,即错误输入的招式名称将被输入代码识别为有效,但将以其意外的格式返回到游戏代码,这将导致其他代码巧妙地打破。

您可能还希望收紧逻辑的其他部分,以更好地处理无效字符串。例如,如果您的beats函数进行了一些验证,您会发现None正在传递,而不仅仅是获得意外的赢家。

答案 1 :(得分:1)

第81行有错字:elif (move2, move1):elif将始终返回true。我假设您忘了调用beats函数。将其更改为elif beats(move2, move1):