“元组”对象不支持项目分配,基于测试的RPG

时间:2013-07-19 22:38:32

标签: python

作为同一个角色扮演游戏的一个独立部分,我遇到攻击敌人的问题。函数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)
]

我如何让玩家以我拥有的东西攻击敌人?

2 个答案:

答案 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