Python:宠物小精灵战斗(类,功能)

时间:2012-07-29 03:54:10

标签: python class function

我刚刚开始学习python,我希望你们能帮助我更好地理解事物。如果你曾为游戏玩家玩过口袋妖怪游戏,你会更加了解我想做什么。我开始了一个文本冒险,在那里你做了简单的事情,但现在我正处于口袋妖怪对战的地步。所以这就是我想要实现的目标。

  • 宠物小精灵战斗开始
  • 你攻击目标
  • 目标失去了HP并重新开始攻击
  • 第一个到0马力输掉

当然所有这些都打印出来了。

到目前为止,这就是我的战斗目标,我不确定我现在的准确程度。我真的很想看看我有多接近这样做。

class Pokemon(object):  
    sName = "pidgy"
    nAttack = 5
    nHealth = 10
    nEvasion = 1


    def __init__(self, name, atk, hp, evd):
        self.sName = name
        self.nAttack = atk
        self.nHealth = hp
        self.nEvasion = evd


    def fight(target, self):
        target.nHealth - self.nAttack



def battle():
    print "A wild  appeared" 
    #pikachu = Pokemon("Pikafaggot", 18, 80, 21)
    pidgy = Pokemon("Pidgy", 18, 80, 21)
    pidgy.fight(pikachu)
    #pikachu.fight(pidgy)   

完整代码: http://pastebin.com/ikmRuE5z

我也在寻找有关如何管理变量的建议;我似乎在顶部有一个变量清单,我认为这不是一个好的做法,它们应该去哪里?

3 个答案:

答案 0 :(得分:3)

如果我要将fight作为实例方法(我不确定我会这样做),我可能会编写类似这样的代码:

class Pokemon(object):
    def __init__(self,name,hp,damage):
        self.name = name     #pokemon name
        self.hp = hp         #hit-points of this particular pokemon
        self.damage = damage #amount of damage this pokemon does every attack

    def fight(self,other):
        if(self.hp > 0):
            print("%s did %d damage to %s"%(self.name,self.damage,other.name))
            print("%s has %d hp left"%(other.name,other.hp))

            other.hp -= self.damage
            return other.fight(self)  #Now the other pokemon fights back!
        else:
            print("%s wins! (%d hp left)"%(other.name,other.hp))
            return other,self  #return a tuple (winner,loser)

pikachu=Pokemon('pikachu', 100, 10)
pidgy=Pokemon('pidgy', 200, 12)
winner,loser = pidgy.fight(pikachu)

当然,这有点无聊,因为伤害的数量不依赖于口袋妖怪的类型而且不以任何方式随机化......但希望它说明了这一点。

至于你的班级结构:

class Foo(object):
    attr1=1
    attr2=2
    def __init__(self,attr1,attr2):
        self.attr1 = attr1
        self.attr2 = attr2

如果你保证在__init__中覆盖它们,那么声明类属性对我来说真的没有意义。只是使用实例属性,你应该没事(即):

class Foo(object):
    def __init__(self,attr1,attr2):
        self.attr1 = attr1
        self.attr2 = attr2v

答案 1 :(得分:2)

  1. 您不需要顶部的变量。您只需要在 init ()方法中使用它们。
  2. 战斗方法应该返回一个值:

    def fight(self, target): 
        target.nHealth -= self.nAttack
        return target
    
  3. 你可能还想检查是否有人输掉了这场战斗:

    def checkWin(myPoke, target):
        # Return 1 if myPoke wins, 0 if target wins, -1 if no winner yet.
        winner = -1
        if myPoke.nHealth == 0:
            winner = 0
        elif target.nHealth == 0:
            winner = 1
        return winner
    
  4. 希望我帮助过。

答案 2 :(得分:2)

我只会对一些明显的方面发表评论,因为完整的代码审核超出了本网站的范围(尝试codereview.stackexchange.com

您的fight()方法未保存减法结果,因此不会更改任何内容。你需要做这样的事情:

def fight(target, self):
    target.nHealth -= self.nAttack
    # check if target is dead now?

我甚至建议不要直接对目标进行修改。如果您可以在目标上调用attack(power)并让它确定造成多少伤害,可能会更好。然后,您可以检查目标是否已经死亡。最终我会认为你会有一些“骰子”对象来决定你的结果。

至于全局......只是停止使用它们。除非你有充分的理由,否则拥有它们是一个坏习惯。具有将结果返回给调用者的函数,然后您可以使用:

def func(foo):
    return 'bar'

但是你可以有一个常量模块。这些是一堆在应用程序生命周期内不会改变的值。它们只是提供共同价值的变量。您可以创建constants.py并使用以下内容:

UP = "up"
DOWN = "down"
DEAD = 0
...

...在你的其他模块中:

from constants import *