Python 巨蟒-剪刀,纸和石头游戏

Python 巨蟒-剪刀,纸和石头游戏,python,random,input,user-input,Python,Random,Input,User Input,所以,我用python制作这个游戏。问题是,剪刀、布和石头可以有不同的组合,比如。。石头和布,石头和剪刀,等等。那么,我如何在不使用大量elif语句的情况下实现这一点呢 import random random_choice = ["Scissors", "Paper", "Rock"][random.randint(0, 2)] player_input = raw_input("What's your choice (Scissors, Paper, or Rock)") if playe

所以,我用python制作这个游戏。问题是,剪刀、布和石头可以有不同的组合,比如。。石头和布,石头和剪刀,等等。那么,我如何在不使用大量elif语句的情况下实现这一点呢

import random
random_choice = ["Scissors", "Paper", "Rock"][random.randint(0, 2)]

player_input = raw_input("What's your choice (Scissors, Paper, or Rock)")
if player_input not in ["Scissors", "Paper", "Rock"]:
      print("Not valid choice")
      raw_input()
      exit()

if player_input == random_choice:
      print("You both choose %s" % random_choice)
elif player_input == "Rock" and random_choice == "Scissors":
      print("You picked Rock and the bot picked Scissors, you win!")
      raw_input()
#And so on making heaps of elif's for all the combinations there can be.

那么,我们如何制作这个游戏,而不必执行太多的elif语句或键入更少的代码呢。当然,必须有更好的编程顺序来处理这些类型的事情吗?

做一个可能结果的地图怎么样:

a_beats_b = {('Scissors', 'Paper'): True,
             ('Scissors', 'Rock'):  False,
             ...
(请注意,键必须是元组)。然后使用以下方法进行查找:

player_wins = a_beats_b[(player_input, random_choice)]

您需要处理相同选择的情况(就像您已经做的那样)。

如果您想避免出现
elif
树,您可以使用一个集合来存储所有获胜的组合:

import random

# random.choice is a convenient method
possible_choices = ["Scissors", "Paper", "Rock"]
random_choice = random.choice(possible_choices)

# set notation, valid since Python 2.7+ and 3.1+ (thanks Nick T)
winning = {("Scissors", "Paper"), ("Paper", "Rock"), ("Rock", "Scissors")}

player_input = raw_input("What's your choice (Scissors, Paper, or Rock)")
if player_input not in possible_choices:
      print("Not valid choice.")
      raw_input()

if player_input == random_choice:
      print("You both choose %s" % random_choice)
elif (player_input, random_choice) in winning:
      print("You picked %s and the bot picked %s, you win!" % (player_input, random_choice))
else:
      print("You picked %s and the bot picked %s, you lose!" % (player_input, random_choice))

raw_input()

如果player\u输入中没有“剪刀”或“纸”或“石头”
无法达到您的预期效果。您对恶意用户输入的第一个防范措施将立即返回“剪刀”,您可能希望
player\u输入不在['剪刀',…]
。我还将它包装在一个循环中,这样当用户不断地给你垃圾输入时,你就会不断地问你想要什么(现在,如果
if
是正确的),你只会问两次。我以前回答过,但只是发现问题被删除了,但现在想知道它是否直接来自于编程任务否,我只是想知道,当大公司在一个游戏中有很多组合时,他们会如何处理这些事情。@user3818650他们通常会将输入转换为数字——并根据数字计算出获胜的输入——或者他们会使用表或类似的数据结构来帮助计算组合。我怀疑他们会手工编写所有可能的组合和可能的测试。谢谢,但是你能解释一下集合的作用吗?小注:Python 2.7+和3.1+支持集合文本,所以我可能更喜欢
{('scissor','Paper'),…}
而不是
集合([(…),…])
@user3818650是一个无序的散列对象集合。把它想象成一本没有值的字典(在
之后的位)。它们可能是与运算符中的
一起使用的最合适的数据类型,因为它们有一个恒定的查找时间。@user3818650 a(实际上)是一个集合,它存储元素,没有特定的顺序和重复,允许快速“包含”操作。在现实环境中,使用itertools导入组合中的
可能是有意义的
winner=[组合中的梳子对梳子([“剪刀”、“纸”、“石头”],2)]