我有一位人类玩家和一位随机玩家。 人类玩家是输入,随机玩家只是在随机移动。我互相对抗,玩家2总是获胜。
我不确定缺少什么。我已经尝试了多种方法。我曾尝试编辑Beats功能,但是我需要它来做功课。他们在入门代码中给了我们。
我认为这与玩家有关。
这是代码的链接:https://codeshare.io/aY9KPM
答案 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):