-4

同じ RPG の別の部分として、敵の攻撃に問題があります。関数 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])

attack 関数は Player クラスの一部であり、do_damage は Player クラスで呼び出される Character クラスの一部です。

参考までに、enemy_dict リストは次のとおりです。

enemy_dict = [
    ("sprite", 5),
    ("thief", 10)
]

私が持っているもので、プレイヤーが敵を攻撃できるようにするにはどうすればよいですか?

4

2 に答える 2

2

enemy_dictリストからいずれかを取得し、それを引数としてプレイヤー キャラクターに渡し、それを に__init__割り当てていると仮定しますself.enemy。問題は、そのタプルの 2 番目の値 (敵の HP だと思います) を変更しようとしていることです。タプル内の値には何も代入できません。タプルは不変です。

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

したがって、 a 、 a laのlist代わりに aを使用する必要があります。tupleenemy_dict = [["sprite", 5], ...]

ただし、投稿では他の気になる言葉を使用しています。

Enemy は、 self.enemy が割り当てられているクラスです (私は推測します)

「だと思います」とはどういう意味ですか? このクラスを書いていませんか?また、コンストラクターでこのクラスの属性に何も割り当てないenemyため、明らかにクラスに割り当てself.enemyていませんEnemy

さらに、あなたが電話をかけようと.keys().values()enemy_dictいるのはリストです。それらのメソッドはありません。の場合は、とにかく敵の名前に のdictようなものを割り当てようとし、同様に健康にも割り当てようとします。['sprite', 'thief'][5, 10]

また、のenemy_dict引数として渡していません。このクラスを自分で作成した場合は、次のように変更する必要があります。Enemy__init__

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
}

それからあなたは言うことで健康を得ることができますenemy_dict[name]. ただし、名前を選択する必要があります。 と言って、有効な名前を選択していることを確認できますif name in enemy_dict.keys()。と言えるようになりan_enemy = Enemy(name, enemy_dict[name])ました。

「ランダムな出会い」を実装したい場合は、randomモジュールを使用するのと同じくらい簡単です。すでに使用しているrandom.choiceので、これはそれほど難しいことではありません。enemy_dict.keys()辞書を使用している場合は、代わりに使用してください。

self.enemy = random.choice(enemy_dict.keys())

上記のコードは、enemy属性をそのディクショナリのキーである名前にします。もちろん、健康を得るために、それはenemy_dict[self.enemy].

enemy_dictでヘルスを変更すると、その敵のヘルスに対するすべてのオブジェクトの認識に影響することに注意してください。enemy_dictが一意のエンティティを表している場合は問題ありませんが、複数の が必要な場合は、をルックアップ テーブルのタイプとして"sprite"使用しenemy_dictて、そこからランダムなタイプの敵を戦わせることができます。このようなものを使用することをお勧めします。 :

self.enemy_name = random.choice(enemy_dict.keys())
self.enemy_health = enemy_dict[self.enemy_name]

次に、enemy_healthプレイヤー キャラクターのクラス内から変更します。

于 2013-07-19T23:54:51.740 に答える
0

クラスの宣言はEnemy私には意味がありません。これは、 の 1 つのインスタンスにEnemyすべての敵の名前とヘルスが定義されていることを意味するためです。私はこのように書いたでしょう:

class Enemy(Character):
    def __init__(self, name, health):
        self.name = name
        self.health = health

しかし、今でも、あなたが書いたコードは、私が理解しているものとは一致しません:self.do_damage()パラメータで呼び出しますenemy=self.enemy[1]。このメソッドによるとdo_damage、このオブジェクトはenemy[0]敵の名前であるリストであり、enemy[1]彼の健康です。私はそれぞれ書いたでしょenemy.nameenemy.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ます:

def attack(self):
    if self.state != 'fight':
        print"%s swings wildly at nothing." % self.name
    else:
        # we suppose that self.enemy is an instance of the Enemy class
        # initialized somewhere else
        if self.do_damage(self.enemy):
            print "%s slaughters %s!" % (self.name, self.enemy.name)
            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.do_damage(self):
        print "%s was disemboweled by %s!" % (self.name, self.enemy.name)
于 2013-07-19T23:56:11.390 に答える