在Python 3.4中有一个Function变量变量?

时间:2014-08-10 16:55:15

标签: python class variables object python-3.4

我正在制作一个简单的基于文本的游戏,我遇到了一些我不知道该怎么做的事情。在我的游戏中,当你在游戏中前进时,你会获得健康,力量,防守,xp和等级。每当有战斗时我都会这样做,我不需要将它全部重新输入到代码中,通过专门为战斗制作一个功能。因此,当我想要一场战斗发生时,我只需输入battle1()即可发生战斗序列。唯一的问题是stat变量经常变化,而且在我设置的代码中,所以如果你使用药水并受到攻击并且你的生命值高于你角色的最大生命值(从一个级别到另一个级别),它将会设置为你可以拥有的最大健康状态(例如,当玩家拥有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()。 谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

将责任移交给玩家,例如:

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