【问题标题】:Why does my player object update score but doesn't keep track of whether it's alive or not?为什么我的玩家对象更新分数但不跟踪它是否还活着?
【发布时间】:2019-10-04 18:11:48
【问题描述】:

这是播放器类。

class Character():
    def __init__(self, name, territory):
        self.waterScore = 1
        self.airScore = 1
        self.landScore = 1
        self.tribe = ""
        if territory == 1: #Water tribe
            self.airScore = 0
            self.landScore = 1
            self.waterScore = 2
            self.tribe = "Water"
        if territory == 2: #Air tribe
            self.landScore = 0
            self.waterScore = 1
            self.airScore = 2
            self.tribe = "Air"
        if territory == 3: #Land tribe
            self.waterScore = 0
            self.airScore = 1
            self.landScore = 2
            self.tribe = "Land"
        self.name = name
        self.tribeScore = 0
        if self.tribe == "Land":
            self.tribeScore = self.landScore
        elif self.tribe == "Water":
            self.tribeScore = self.waterScore
        elif self.tribe == "Air":
            self.tribeScore = self.airScore

class Player(Character):
    def __init__(self, territory):
        super().__init__("Player", territory)
        self.dead = False
        if self.dead:
            print("You have died.")
            time.sleep(2)
            print("So long...")
            time.sleep(2)
            sys.exit(0)
    def setTribeScore(self): #This is the problem area
        if self.tribe == "Water":
            self.tribeScore = self.waterScore #These three are working
        elif self.tribe == "Air":
          self.tribeScore = self.airScore
        elif self.tribe == "Land":
          self.tribeScore = self.landScore
        if self.landScore <= -2 or self.airScore <= -2 or self.landScore <= -2: #this one isn't doing anything
            self.dead = True

这里是调用“setTribeScore()”的地方:

"""
An enemy and the player are passed into the following function, as well as which tribe skill is at stake. The function checks whether the winner or the loser is the player in order to set their tribe score.
"""
def winFight(winner, loser, stake):
    x = getattr(winner, stake)
    setattr(winner, stake, x + 1) #the attack that the winner used gets increased
    y = getattr(loser, stake)
    setattr(loser, stake, y - 1)
    if not isinstance(winner, Player):
        del winner
        loser.setTribeScore()
        print("You lost! Your attributes are {} for land, {} for water, and {} for air.".format(getattr(loser, "landScore"), getattr(loser, "waterScore"), getattr(loser, "airScore")))
    elif not isinstance(loser, Player):
        del loser
        winner.setTribeScore()
        print("You won! Your attributes are {} for land, {} for water, and {} for air.".format(getattr(winner, "landScore"), getattr(winner, "waterScore"), getattr(winner, "airScore")))

当我运行我的游戏循环时,玩家永远不会死亡,即使部落分数低于 -1。然而,部落分数确实更新,正如打印调试显示的那样,所以我知道函数本身正在做某事。可能是什么问题?

【问题讨论】:

  • 我不确定你的代码是如何工作的,因为你在__init____init__ 中有一个无条件的sys.exit(0)
  • 有那个用于调试;谢谢。

标签: python methods constructor updating


【解决方案1】:

Player.__init__ 中的这些代码行:

if self.dead:
    print("You have died.")
    time.sleep(2)
    print("So long...")
    time.sleep(2)

您希望它在什么时候执行?我在这里得到的是,从你的提问看来,当你将self.dead 设置为True 时(当landScoreairScorewaterScore 小于或等于 -2)。

事实并非如此。 Player.__init__ 中的 if 语句的主体只会在创建 Player 对象时执行(毕竟它在 __init__ 方法中) - 只有当 self.deadTrue 时才会执行,你已经默认硬编码为False

【讨论】:

  • setTribeScore()self.dead 属性更改为True
  • 是的。问题是,当您执行self.dead = True 时,这实际上就是您所做的一切 - 在Player.__init__ 方法中没有发生任何神奇的绑定,并且在self.dead 变量设置为True 时触发该if 语句.稍后我会用一个建议更新我的答案。
  • 那我该怎么做才能让那行代码执行呢?
  • 您介意分享更多代码吗?特别是关于游戏循环和角色轮流、攻击等。如果你能多解释一下游戏,我可能会提出其他构建代码的方法。
  • 我会简单地将Player.__init__ 中的 if 语句移动到fight(player, enemy, choice) 之后的游戏循环中。这样你就可以检查玩家是否每回合都被打败了。
猜你喜欢
  • 2021-10-17
  • 1970-01-01
  • 2023-03-22
  • 2012-02-23
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多