For循环不“刷新”Python

2024-04-24 00:13:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个石头剪刀布蜥蜴在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 == 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")

main方法询问您希望这两个玩家是谁,然后将第一个选项设置为p1,第二个选项设置为p2

如果你需要更多的代码让我知道。我认为这应该足够了,但我不肯定。 谢谢


Tags: 游戏forplayreturnifdef机器人num
2条回答

虽然我喜欢你在这里使用对象,但我认为你可以在继承方面做得更多,并进一步滥用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)

调用play方法时,将Rock指定给instance name,然后返回它,但基本上相当于:

class Human(Player):
    if decisionint == 1:
       def play(self):
           return Rock

如果您想使其发生变化以便可以正确地对其进行建模,那么每次都需要返回一个随机选择的元素。你知道吗

例如,在代码顶部附近:

import random

CHOICES = (Rock, Paper, Scissors, Lizard, Spock)

play方法中:

return random.choice(CHOICES)

相关问题 更多 >