好吧所以我正在制作一个基于文本的RPG游戏,但我有一个python类的问题,我不知道如何解决我已经尝试查找这个问题,但一直无法找到任何帖子属于这个也许我正在查找错误的东西?我不知道。无论如何,这是我的问题 我把这个类放在名为subfiles
的文件夹中名为unit.py的文件中class Enemy(object):
def __init__(self,name,hp,atk):
self.name = name
self.hp = hp
self.atk = atk
在我的主文件中我有这个
from subfiles.unit import *
wolf = Enemy("Wolf", 100, 10)
cow = Enemy("Cow", 50, 0)
NMElist = [wolf,cow]
def gennme():
global NME
##Choose a enemy to fight
NME = random.choice(NMElist)
def attack():
NME.hp -= 10
print NME.hp
attack()
当我运行攻击定义时,它会从wolf.hp中减去它,但这并不是我想要实现的目标,因为下一次战斗对抗狼来说它已经死了所以如何我可以拥有狼=敌人(“狼”,100,10)只是设定的默认值,战斗结束后狼被杀死,下次我打狼,它从默认值加载。我希望我在这里有意义,我确信有一个简单的方法可以实现这一点,它只是回避我或许我对类如何工作的理解是有缺陷的?无论如何我期待你的回答和建议 哦,顺便说一句,这同样适用于牛和狼。
答案 0 :(得分:0)
是的,也许是在一个人被杀之后创造一个新狼的做法。但你没有活着的旗帜,它还活着吗?
如果hp为0,你可以让敌人对聋人hp嗤之以鼻。以某种方式让你检查狼是否被杀死。一种方法:
class Enemy(object):
def __init__(self,name,hp,atk):
self.name = name
self._hp = hp
self.atk = atk
self._deafult_hp = hp
@property
def hp(self):
return self._hp
@hp.setter
def hp(self, value):
if not self._hp:
self._hp = self._deafult_hp
self._hp = value
现在在战斗中你可以检查狼是否为0,并且在下一场战斗中狼将hp到100马力或者你选择的任何东西。 ^^
答案 1 :(得分:0)
每次遇到新的Enemy时,您都可以创建单独的Enemy实例。您可以通过将实际实例包装在可调用的项目中来推迟创建它们:
NMElist = [lambda : Enemy("Wolf", 100, 10),
lambda : Enemy("Cow", 50, 0)]
这是敌人factory的简单示例。要获得一个新的随机敌人,你需要调用返回的函数来生成一头新的牛或狼:
NME = random.choice(NMElist)()
注意最后的括号()
执行random.choice
返回的随机敌人工厂以创建实际对象。您可以添加的另一个层是使用继承创建Wolf
和Cow
敌人的子类,使用super
python内置来初始化正确的值:
class Enemy(object):
def __init__(self,name,hp,atk):
self.name = name
self.hp = hp
self.atk = atk
class Wolf(Enemy):
def __init__(self):
super(Wolf, self).__init__("Wolf", 100, 10)
class Cow(Enemy):
def __init__(self):
super(Cow, self).__init__("Cow", 50, 0)
然后NMElist可以包含为遇到的每个敌人实例化的类
NMElist = [Wolf,Cow]
def gennme():
global NME
##Choose a enemy to fight
NME = random.choice(NMElist)()
答案 2 :(得分:0)
您的随机函数将在NMElist中包含的已存在的uniq对象中选择(具有以前的状态)
在gennme功能中对狼和牛进行诠释可能会解决这个问题。
from subfiles.unit import *
def gennme():
global NME
##Choose a enemy to fight
wolf = Enemy("Wolf", 100, 10)
cow = Enemy("Cow", 50, 0)
nme_list = [wolf,cow]
NME = random.choice(nme_list)
def attack():
NME.hp -= 10
print NME.hp
attack()
这远非最好的实施,但它可以让你更好地理解你的错误。
答案 3 :(得分:0)
我喜欢亚瑟的答案,但另一种做同样事情的方法是:
NMElist = [("Wolf", 100, 10),("Cow", 50, 0)]
然后,在gennme()
函数中,随机选择一个并将其中的值传递给Enemy类:
enemySelection = random.choice(NMElist)
NME = Enemy(*enemySelection)
基本上,如果要将Enemy()
类的实现与与Enemy属性关联的值隔离,这种方法会很好。使用*
,您可以将列表项值一起作为参数传递给Enemy类。通过在此时实例化敌人,当再次调用gennme()
函数时,您将确保生成另一个新鲜的。
人们快速回答SO。我花了一些时间来解决这个问题:)