【问题标题】:Having a Function change variable in Python 3.4?在 Python 3.4 中有一个函数更改变量?
【发布时间】:2014-10-03 13:16:27
【问题描述】:

我正在开发一个简单的基于文本的游戏,但遇到了一些我不知道该怎么做的事情。在我的游戏中,随着游戏的进行,你会获得健康、力量、防御、经验和等级。我做到了,所以每当发生战斗时,我都不必通过专门为战斗创建一个函数将其全部重新输入代码中。所以当我想要一场战斗发生时,我只需输入battle1() 就可以让战斗序列发生。唯一的问题是统计变量变化如此频繁,并且在我设置的代码中,如果您使用药水并受到攻击并且您的健康状况超过角色的最大健康状况(因级别而异),它将设置为您可以拥有的最大生命值(例如,玩家在拥有 15 生命值时使用药水,并且他们的最大生命值是 15,它只会保持在 15 生命值,而不是增加到 17)。这是我的代码:

class player:
    def __init__ (self, name, health, strength, defense):
        self.__health = health
        self.__strength = strength
        self.__defense = defense
        self.__name = name
    def getName(self):
        return self.__name

    def getHealth(self):
        return self.__health

    def getStrength(self):
        return self.__strength

    def getDefense(self):
        return self.__defense

    def getPotion(self):
        return self.__potion

    def subHealth(self, num):
        self.__health -= num
        return self.__health

    def setHealth(self, h):
        self.__health = h


def main():

    name1 = input("What would you like your name to be?")
    print("Hello,", name1, "you are on a quest to save otis from the evil Dongus. You must slay him, or Otis will poop.")
    player1 = player(name1, 10, 2, 1)
    enemy = player("Rat", 15, 0, 0)
    print("Your stats are, health:", player1.getHealth(), "strength:", player1.getStrength(), "and defense:", player1.getDefense())
    print("Fight.")
    attack =input("Type 1 to attack.")

    if attack == "1":

        enemy.subHealth(player1.getStrength()-enemy.getDefense())
        **if enemy.getHealth()>15:
            enemy.setHealth(15)**
        print(enemy.getName()+"'s health is",enemy.getHealth())
        player1.subHealth(enemy.getStrength()-player1.getDefense())
        **if player1.getHealth()>10:
            player1.setHealth(10)**

main()

加粗的部分是我所说的代码部分。那么,有什么办法可以做到这一点,例如,当你达到 5 级时,你的最大生命值设置为 15,而不是 10?请记住,在战斗中你的敌人会伤害你,所以你不能只做 player1.getHealth()。 谢谢!

【问题讨论】:

  • 不是答案,但你不需要那些get和set方法,你可以直接访问属性。
  • @Robbie:直接使用变量即可。将其命名为health 而不是__health,然后使用player1.health 而不是player1.getHealth()player1.health = foo 而不是player1.setHealth(foo)
  • @Robbie:此外,即使您确实需要私有变量(在这种情况下不需要),您也不想使用双下划线。双下划线仅适用于您需要从子类中隐藏的方法(因此它们可以定义具有相同名称的方法而不会意外覆盖您的方法)。您可能想阅读PEP 8,Python 风格指南,其中解释了所有这些以及更多内容。
  • 好吧,很抱歉我不小心删除了我的评论..
  • 顺便说一句,我不知道为什么有人对你投了反对票,因为我认为这是一个合理的问题(新手不会让你变得愚蠢或懒惰,只会让你成为新手) .但是您绝对可以通过删除所有不相关的代码(请参阅MCVE)并更具体地了解您坚持的部分来改进它。

标签: python class variables object python-3.4


【解决方案1】:

那么,有什么办法可以做到这一点,例如,当你 5 级时,你的最大生命值设置为 15,而不是 10?

是的。除了玩家的“当前健康”之外,您还需要为玩家存储“最大健康”:

if player1.getHealth() > player.getMaxHealth()
    player1.setHealth(player.getMaxHealth())

正如 Padraic 在评论中解释的那样,在 Python 中不需要像这样的 getter 和 setter,而且它通常被认为是不好的风格。所以最好这样写:

if player1.health > player1.max_health:
    player1.health = player1.max_health

您可以使用min 更简洁地编写此代码:

player1.health = min(player1.health, player1.max_health)

此外,如果您可以即时计算最大生命值(可能是10 + level?),您可以为此编写一个函数,并在需要时调用该函数,而不是将其存储为额外属性。

关于 Python 的一个巧妙之处在于,您可以从一个属性开始,然后使用 @property 将其更改为计算值,而无需将其转换为函数:

@property
def max_health(self):
    return 10 + self.level

【讨论】:

  • 好的,几乎所有这些都是有道理的。 min() 函数不是选择两个值中的最小值吗?当值相同时会发生什么?
  • 返回最小值。如果有多个最小值也没关系。
  • @Robbie:这确实是您可以比您要求的更快地测试的那种东西。只需打开您的解释器并输入print(min(2, 2)),看看您会得到什么。
  • @Abarnert 我试过了,只是不明白为什么会这样。
  • 另外我收到如下错误:“Basics/Game.py”,第 100 行,在battle1 中的enemy.Health = min(enemy.Health(),enemy.enemymaxHealth()) 类型错误: 'int' 对象不可调用”。有什么想法吗?
【解决方案2】:

只需将责任转移给玩家,例如:

def changeHealth (self, delta):
    self.__health += delta

    maxHealth = 10 if self.__level < 5 else 15
    if self.__health > maxHealth:
        self.__health = maxHealth
    elif self.__health < 0
        self.__health = 0

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多