0

このエラーは、戦略ゲームのテーブル ウォーズで長い試合をしているときに発生します。戦場に多くのユニットがいる場合に発生するようです。トレースバックは次のとおりです。

Traceback (most recent call last):
  File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 727, in <module>
    main()
  File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 131, in main
RedTeam.update()
  File "C:\Python27\lib\site-packages\pygame\sprite.py", line 399, in update
for s in self.sprites(): s.update(*args)
  File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 372, in update
self.attack()
  File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 393, in attack
    self.target.health -= self.attack_damage
AttributeError: 'NoneType' object has no attribute 'health'

例外はターゲティング コードと攻撃コードに現れるようですので、ここに掲載します。

def move_toward(self, target):
    if self.target is None:
        self.rect.move_ip(1, 0)

def update(self):
    self.find_target()
    self.move_toward(self.target)
    self.attack()
    if self.health <= 0:
        self.kill()

def find_target(self):
    if self.target is not None: return
    for enemy in BluTeam.sprites():
        if enemy.rect.centerx - self.rect.centerx <= self.range and enemy.rect.centery - self.rect.centery <= self.range:
            self.target = enemy
            return
        self.target = None

def attack(self):
    global REDGOLD
    global BLUECOMMAND
    if self.target is None: return
    if self.target.health <= 0:
        REDGOLD += self.target.reward
        BLUECOMMAND += self.target.cmdback
        self.target = None
    if not self.cooldown_ready(): return
    self.target.health -= self.attack_damage

def cooldown_ready(self):
    now = pygame.time.get_ticks()
    if now - self.attack_last >= self.attack_cooldown:
        self.attack_last = now
        return True
    return False

これを修正するにはどうすればよいですか?

4

1 に答える 1

8

一般的なエラーの説明、またはプログラムをデバッグするための単純なトレースバックをよりよく理解する方法:

  File "<path>\<filename>.py", line 393, in <function>

トレースバックは、コールスタックを提供し、どの関数で発生したエラーを示します。ここでは特別なことは何もありません

    self.target.health -= self.attack_damage

親しみやすいインタープリターが、エラーの原因となっているステートメントを提供します。これは、発生したエラーがこのコード行に関連していることを意味するため、重要です。

AttributeError: 'NoneType' object has no attribute 'health'

ここにいます。エラーは次のとおりですAttributeError。ドキュメントはそれについてかなり明確です:関連するオブジェクトのメンバーではない変数の値を読み取ろうとしているか、変数に代入しようとしています。

私のオブジェクトは何ですか?それは'NoneType' object; 名前はありませんが、その型はあります。問題のあるオブジェクトは です。NoneTypeしたがって、これは特別なオブジェクトNoneです。

Noneこのオブジェクトのエラーは何ですか? 'health'Tracebackという属性はありません。healthしたがって、エラーが発生したコード行のどこかで属性にアクセスしており、これはNoneオブジェクトで呼び出されます。

これで、ほぼすべての設定が完了しました。self.target.health使用するエラー行の唯一の場所は です。healthしたがって、これは であることを意味しself.targetますNone。今、ソースコードを見て、それに対する関数の最初にチェックを入れたとしても、なぜそれができるのかを理解しようとしています. Noneそれは、その行の後に何らかの形で設定する必要があるという事実につながります。


このすべての推論ステップは、短い答えにつながります。

という意味self.targetですNone。エラーはあなたのコードから来ています:

if self.target.health <= 0:
    REDGOLD += self.target.reward
    BLUECOMMAND += self.target.cmdback
    self.target = None  # set to None
if not self.cooldown_ready(): return
self.target.health -= self.attack_damage  # self.target is None, .health failed
于 2012-05-28T19:05:00.937 に答える