2016-08-09 10 views
1

私は練習問題としてテキストベースのゲームを書いています。私はいくつかのランダムなゴブリンを作成し、それらをCurrentEnemyリストに配置するGenerateEnemies関数を持っています。条件が満たされたらリスト内のオブジェクトのインスタンスを削除する方法はありますか?

攻撃機能を使用して、私はヒーローをCurrentEnemyリストのゴブリンに攻撃させ、HPを減少させることができます。

私がしたいことは、敵の健康状態が0以下になると死ぬことです。私は例外 "if self.HP < 0:del(self)"を入れても動作しません。

目的の動作を達成するための正しい構文は何ですか?また、オブジェクトが削除された場合、CurrentEnemy内のものはどうなりますか?オブジェクトが一度入っていたインデックスには何も変わっていないのでしょうか?

import random 
CurrentEnemy = [] 

class Monster(object): 

    def __init__(self, Name, HP, Damage): 
     self.Name = Name 
     self.HP = HP 
     self.Damage = Damage 

    **if self.HP < 0: 
     del(self)** 

class Hero(object): 
    def __init__(self, Name, HP, Damage): 
     self.Name = Name 
     self.HP = HP 
     self.Damage = Damage 

def GenerateEnemies(): 
    NumberEnemies = random.randint(0,5) 
    del CurrentEnemy[:] 

    i=0 
    while i < (NumberEnemies+1): 
     TempMonster = Monster("Goblin", random.randint(15,20), random.randint(1,3)) 
     CurrentEnemy.append(TempMonster) 
     i = i + 1 

    i=0 
    while i in range(0, len(CurrentEnemy)): 
     print("Goblin " + str(i) + " HP: " + str(CurrentEnemy[i].HP)) 
     print("Goblin " + str(i) + " Damage: " + str(CurrentEnemy[i].Damage)) 
     i = i + 1 


def GenerateHero(HeroName, HeroHP, HeroDamage): 
    return Hero(HeroName, HeroHP, HeroDamage) 

MyHero = GenerateHero("Bob", 100, 10) 

def Attack(Attacker, Defender): 
    Defender.HP = Defender.HP - Attacker.Damage 
+0

神のために 'snake_case'を使う – BusyAnt

+0

CamelCaseよりもsnake_caseが読みやすくなっていますか?それとも、それがより一般的に広く受け入れられているのでしょうか? – Kos

+1

これはコーディング規則です([PEP8](https://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions))。Pythonでは、クラス名は 'UpperCamelCase'と書かれています。変数、関数、メソッドを 'snake_case'に追加しました。そして、開発者がこれらの慣習を尊重していることを知ったとき、コードは即座に読みやすくなります(少なくとも、私にとってはそうです)。 Pythonでは、関数や変数のようにクラスに対して操作を行うことができるため、適切な名前を付けると適切な名前を付けると明確になり、コードは読みやすくなります。 – BusyAnt

答えて

2

リストからの削除は高価です。代わりにset()を使用してください。また、s.add()やs.discard()などのオブジェクトを削除するためのさまざまなユーティリティ関数があります。今、あなたの質問について

デル(自己)は唯一のクラス内のローカル変数の自己全体ではなく、オブジェクトへの参照を削除します。

オブジェクトを削除する場合は、オブジェクトを保存したリストコンテナからオブジェクトを削除する必要があります。

+0

私は、セットを使用し、攻撃機能のチェックを追加して、損傷したDefenderが0未満であるかどうかを確認しました。HP: Def Attack(攻撃者、Defender): Defender.HP = Defender.HP - Attacker。ダメージ Defender.HP <0の場合: CurrentEnemy.remove(Defender) – Kos

+0

素晴らしい!喜んで助けた。 :) – cedzz

+0

好奇心が強い、リストからの削除が「高価」だと言ってどういう意味ですか? – Kos

関連する問題