2

我刚开始学习python,我希望你们能帮助我更好地理解事情。如果你曾经为 gameboy 玩过 pokemon 游戏,你会更了解我想要做什么。我从一个文字冒险开始,你做一些简单的事情,但现在我正处于口袋妖怪互相争斗的地步。所以这就是我想要实现的目标。

  • 宝可梦大战开始
  • 你攻击目标
  • 目标失去HP并反击
  • 第一个到 0 hp 损失

当然,所有这些都是打印出来的。

这就是我目前所拥有的战斗,我不确定我现在有多准确。只是真的想看看我离正确地做这件事有多近。

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

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

4

3 回答 3

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
于 2012-07-29T04:11:45.220 回答
2
  1. 您不需要顶部的变量。您只需要在init () 方法中使用它们。
  2. Fight 方法应该返回一个值:

    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
    

希望我有所帮助。

于 2012-07-29T04:08:12.113 回答
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 *
于 2012-07-29T04:10:40.007 回答