For loop not";“提神”;python
我正在用Python运行一个石头剪纸蜥蜴斯波克游戏。我想让它和不同的机器人玩5轮。我遇到的问题是,当我尝试在主函数中循环回合时,即使机器人随机选择移动,也只会打印出5次相同的匹配 for循环:For loop not";“提神”;python,python,loops,Python,Loops,我正在用Python运行一个石头剪纸蜥蜴斯波克游戏。我想让它和不同的机器人玩5轮。我遇到的问题是,当我尝试在主函数中循环回合时,即使机器人随机选择移动,也只会打印出5次相同的匹配 for循环: for x in range(0, 5): p1move = p1.play() p2move = p2.play() print(p1move.compareTo(p2move)) 播放方法: class Human(Player): if decisionint ==
for x in range(0, 5):
p1move = p1.play()
p2move = p2.play()
print(p1move.compareTo(p2move))
播放方法:
class Human(Player):
if decisionint == 1:
def play(hum1):
hum1 = Rock
return hum1
机器人的示例:
class RandomBot(Player):
num = randint(1, 5)
if num == 1:
def play(rando1):
rando1 = Rock
return rando1
else:
if num == 2:
def play(rando2):
rando2 = Paper
return rando2
岩石类别:
class Rock(Element):
def compareTo(_name):
if _name == Lizard:
global p1wins
p1wins += 1
print("Rock crushes Lizard, Win")
主方法询问您希望这两名玩家是谁,然后将第一个选项设置为p1
,第二个选项设置为p2
如果你需要更多的代码,请告诉我。我认为这应该足够了,但我并不乐观。
谢谢当您调用play方法时,您将Rock指定给实例名,然后返回它,但基本上相当于:
class Human(Player):
if decisionint == 1:
def play(self):
return Rock
如果您希望它发生变化,以便能够正确地对其建模,那么每次都需要返回一个随机选择的元素
e、 g.在代码顶部附近:
import random
CHOICES = (Rock, Paper, Scissors, Lizard, Spock)
在您的play
方法中:
return random.choice(CHOICES)
虽然我喜欢你在这里使用对象,但我认为你可以在继承方面做得更多,并进一步滥用DRY。试试这个:
import random
class Selection(object):
def __init__(self, value, wins_against, name=None):
self.value = value
self.wins_against = wins_against
self.name = name
def compare(self,other):
if other.value == self.value: return 0
elif other.value in self.wins_against: return 1
else: return -1
Rock = Selection(0, (2,3), "Rock") # beats scissors+lizard
Paper = Selection(1, (0,4), "Paper") # beats rock+spock
Scissors = Selection(2, (1,3), "Scissors") # beats paper+lizard
Lizard = Selection(3, (1,4), "Lizard") # beats paper+spock
Spock = Selection(4, (0,2), "Spock") # beats rock+scissors
class Player(object):
def __init__(self,name=None):
self.choice = None
if name is None: self.name = "Computer"
else: self.name = name
def choose(self):
self.choice = random.choice([Rock,Paper,Scissors,Lizard,Spock])
def compare(self,other):
"""1 = win, 0 = tie, -1 = lose"""
return self.choice.compare(other.choice)
class Human(Player):
def choose(self):
self.choice = None
while self.choice is None:
print("""1. Rock
2. Paper
3. Scissors
4. Lizard
5. Spock""")
in_ = input(">> ")
try:
self.choice = {"1":Rock,"2":Paper,"3":Scissors,"4":Lizard,"5":Spock}[in_]
except KeyError:
pass
def play(player1,player2):
for player in (player1,player2):
player.choose()
print("{} vs {}".format(player1.choice.name,player2.choice.name))
result = player1.compare(player2)
if result:
print("{0.name} wins!".format(
player1 if result > 0 else player2))
else:
print("Tie game!")
print("\n\n")
Player1 = Human("Joe Schmoe")
Player2 = Player() # bot
for _ in range(5):
play(Player1,Player2)
显然p2在整个循环中是相同的,它的播放方法是恒定的(尽管在实例化时随机生成),因此所有5个输出都是相同的是有意义的,您需要调用
random.seed()
否则,如果它是\uuuu init\uuuu
中的实例属性,而不是类属性,则每次都会得到相同的randint
。事实上,你所有的类都有同样的问题。不,@Cyber,randint每次都会生成一个新的随机int。或者至少对我来说没有调用random.seed()@d_rez90对不起,你是对的,我把C++的rand()
函数混在一起了,这是需要播种的。你第一个工作完美无瑕的函数,是编辑效率更高/只是编程更好,还是第一个更好?@koky_Lukey这意味着代码重复更少,因为你的人类和机器人玩家都需要,对吧?我还试图强调好的风格,因为选择列表是一个常量,可以在模块级别上使用。