我刚刚开始学习python,我希望你们能帮助我更好地理解事物。如果你曾为游戏玩家玩过口袋妖怪游戏,你会更加了解我想做什么。我开始了一个文本冒险,在那里你做了简单的事情,但现在我正处于口袋妖怪对战的地步。所以这就是我想要实现的目标。
当然所有这些都打印出来了。
到目前为止,这就是我的战斗目标,我不确定我现在的准确程度。我真的很想看看我有多接近这样做。
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
我也在寻找有关如何管理变量的建议;我似乎在顶部有一个变量清单,我认为这不是一个好的做法,它们应该去哪里?
答案 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)
战斗方法应该返回一个值:
def fight(self, target):
target.nHealth -= self.nAttack
return target
你可能还想检查是否有人输掉了这场战斗:
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
希望我帮助过。
答案 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 *