【问题标题】:Python: Pokemon battle (classes, functions)Python:口袋妖怪之战(类、函数)
【发布时间】:2012-07-29 03:54:10
【问题描述】:

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

  • 宝可梦大战开始
  • 你攻击目标
  • 目标失去生命并反击
  • 第一个到 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

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

【问题讨论】:

  • 您的具体问题是什么?如果您问为什么您的 fight 方法不起作用,那是因为您没有保存减法的结果。
  • 我的问题是如何,这应该如何让它正常工作。但是,是的,我将如何通过结果?返回?
  • 我不太确定如何回答这个问题,因为它更像是一个广泛的代码审查。您应该尝试在这里要求进行代码审查:codereview.stackexchange.com ...但是是的,您不应该如此大量地使用全局变量。操作应该将结果返回给调用者。
  • 谢谢。但是为了缩小问题的范围,我将如何正确返回值并且我是否正确使用类?另外,我可以将这些变量放在哪里,以免它们被推到顶部?

标签: python class function


【解决方案1】:

如果我将 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

【讨论】:

  • 谢谢,您确实帮助我更清楚了这一点。现在,简单的战斗正是我需要知道的,稍后我将添加类型、伤害倍增器、动作,以及整个口袋妖怪的东西。我需要开始使用游戏状态和一大堆类。在这个单一页面不会变得过于拥挤之前,我还应该使用多个文件。一个开始菜单......有很多事情要做,哈哈。再次感谢!非常感谢您的帮助。
【解决方案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
    

希望我能帮上忙。

【讨论】:

  • 哎呀,你打败了我。我可能会建议在fight 中不需要返回。调用者显然知道目标,因为它的参数
  • 完成后我会非常乐意展示它,这只是我给自己的一个任务来帮助学习它。我什至不确定我能走多远,但我的目标是把游戏玩成泥文字冒险。
【解决方案3】:

我只评论几个明显的方面,因为完整的代码审查超出了本网站的范围(试试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 *

【讨论】:

  • 是的,我应该将它们放在函数中,并停止在全球范围内要求它们。如果我继续这样做,我以后会有很大的混乱需要清理。谢谢
猜你喜欢
  • 2020-09-18
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多