作为同一个角色扮演游戏的一个独立部分,我遇到攻击敌人的问题。函数do_damage从enemy_dict列表中获取名称/值(运行状况)并计算损坏。
def do_damage(self, enemy):
damage = min(
max(randint(0, self.health) - randint(0, self.enemy[1]), 0), self.enemy[1])
self.enemy[1] = self.enemy[1] - damage
if damage == 0:
print "The %s evades %s's attack." % (self.enemy[0], self.name)
else:
print "%s hurts the %s! -%dhp" % (self.name, self.enemy[0], damage)
return enemy[1] <= 0
self.enemy的分配如下:
self.enemy = random.choice(enemy_dict)
作为探索功能的一部分,当被召唤时,它提供了一个遇到敌人的机会。
攻击函数在被玩家调用时会调用do_damage函数。
def attack(self):
if self.state != 'fight':
print"%s swings wildly at nothing." % self.name
else:
if self.do_damage(self.enemy[1]):
print "%s slaughters %s!" % (self.name, self.enemy[0])
self.enemy = None
self.state = 'normal'
eloot = randint(0,25)
self.loot = self.loot + eloot
qxp = randint(0,30)
self.xp = qxp + self.xp
print "You find %d gold on the corpse." %(eloot)
stimp = randint(0,4)
if stimp == 0:
self.stim = self.stim + 1
print "You find a potion!"
else:
self.enemy_attacks()
def enemy_attacks(self):
if self.enemy[0].do_damage(self): print "%s was disemboweled by %s!" % (self.name, self.enemy[0])
攻击函数是Player类的一部分,而do_damage是Character类的一部分,在Player类中调用。
作为参考,这里是enemy_dict列表:
enemy_dict = [
("sprite", 5),
("thief", 10)
]
我如何让玩家以我拥有的东西攻击敌人?
答案 0 :(得分:2)
我将假设您正在从enemy_dict
列表中选择其中一项内容,并将其作为参数传递给您的玩家角色__init__
并将其分配给{{1} }}。问题是你试图改变该元组中的第二个值(我假设是敌人的HP)。你不能为元组内的值赋值 - 元组是不可变的。
self.enemy
因此,您需要使用>>> t = (1,2,3)
>>> t[1] = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
代替list
,而不是tuple
。
你在帖子中使用了其他一些令人担忧的语言。
Enemy是一个班级,其中指定了自我(我假设)
“我假设?”是什么意思?你没写这门课吗?另外,您没有在构造函数中为此类的enemy_dict = [["sprite", 5], ...]
属性指定任何内容,因此您显然没有在enemy
类中分配self.enemy
。
此外,您正试图在Enemy
上拨打.keys()
和.values()
这是一个列表。它没有那些方法。如果它是enemy_dict
,你会试图将dict
之类的东西分配给敌人的名字,同样['sprite', 'thief']
也分配给健康。
您也没有将[5, 10]
作为参数传递给enemy_dict
的{{1}}。如果您自己编写本课程,则应将其更改为:
Enemy
并称之为:__init__
。这假设您不会更改{<1}},而真正应该这样做。我可以建议:
def __init__(self, name, health):
self.name = name
self.health = values
然后你可以通过说an_enemy = Enemy(enemy_dict[0][0], enemy_dict[0][1])
来获得健康。但是,您必须选择一个名称 - 您可以通过说enemy_dict
来确保选择有效的名称。您现在可以说enemy_dict = {
"sprite": 5,
"thief": 10
}
。
如果你想实现“随机遭遇”,就像使用random
模块一样简单。您已经使用enemy_dict[name]
- 所以这不应该太难。如果您使用的是字典,请使用if name in enemy_dict.keys()
。
an_enemy = Enemy(name, enemy_dict[name])
上面的代码使random.choice
属性成为名称,这是该词典的关键。当然,为了获得健康,它是enemy_dict.keys()
。
您应该注意,如果您修改self.enemy = random.choice(enemy_dict.keys())
中的健康状况,那将影响每个对象对该敌人健康状况的感知。如果您的enemy
代表唯一实体,那很好 - 但如果您想拥有多个enemy_dict[self.enemy]
,则可以使用enemy_dict
作为一种查找表,从中获取随机类型战斗的敌人,你最好使用这样的东西:
enemy_dict
然后,在玩家角色的班级中修改"sprite"
。
答案 1 :(得分:0)
Enemy
类的声明对我没有意义,因为它意味着Enemy
的一个实例中包含了所有敌人的名字和健康。我会这样写的:
class Enemy(Character):
def __init__(self, name, health):
self.name = name
self.health = health
但即使是现在,您编写的代码也不符合我的理解:您使用参数self.do_damage()
调用enemy=self.enemy[1]
。根据{{1}}方法,此对象是一个列表,其中do_damage
是敌人的名字,enemy[0]
是他的健康状况。我会分别写enemy[1]
和enemy.name
:
enemy.health
我会以不同的方式致电def do_damage(self, enemy):
damage = min(max(randint(0, self.health) - randint(0, self.enemy.health), 0), self.enemy.health)
self.enemy.health = self.enemy.health - damage
if damage == 0:
print "The %s evades %s's attack." % (self.enemy.name, self.name)
else:
print "%s hurts the %s! -%dhp" % (self.name, self.enemy.name, damage)
return enemy.health <= 0
:
do_damage