2017-04-04 1 views
0

Hallo Leute, ich bin wirklich neu in Python - oder irgendeine Codierung für diese Angelegenheit! Wie auch immer, ich versuche ein einfaches, textbasiertes RPG-Spiel zu machen, ich bin noch lange nicht am Ende, aber ich habe Probleme beim Erstellen eines Heilsystems. Alles funktioniert, bis ich versuche, den Heilzauber zu verwenden und den Fehler im Titel zurückgibt. Nein, ich weiß irgendwie, was es zu sagen versucht, ist falsch, aber ich habe keine Ahnung, wie ich es beheben soll. Jede Hilfe wird geschätzt, aber denken Sie bitte daran, dass ich ein großer Neuling bin, wenn es um das Codieren geht.AttributeError: 'Person' Objekt hat kein Attribut 'heilen'

Vielen Dank.

from classes.game import Person, bcolors 
from classes.magic import Spell 

# Create Black Magic 
fire = Spell("Fire", 10, 100, "black") 
thunder = Spell("Thunder", 10, 100, "black") 
blizzard = Spell("Blizzard", 10, 100, "black") 
meteor = Spell("Meteor", 20, 200, "black") 
quake = Spell("Quake", 14, 140, "black") 

# Create White Magic 
cure = Spell("Cure", 12, 120, "white") 
cura = Spell("Cura", 18, 200, "white") 

# Instantiate People 
player = Person(460, 65, 60, 34, [fire, thunder, blizzard, meteor, cure,   cura]) 
enemy = Person(1200, 65, 45, 25, []) 

running = True 
i = 0 

print(bcolors.FAIL + bcolors.BOLD + "AN ENEMY ATTACKS!" + bcolors.ENDC) 

while running: 
print("=================") 
player.choose_action() 
choice = input("Choose action") 
index = int(choice) - 1 

if index == 0: 
    dmg = player.generate_damage() 
    enemy.take_damage(dmg) 
    print("You attacked for", dmg, "points of damage.") 
elif index == 1: 
    player.choose_magic() 
    magic_choice = int(input("Choose magic:")) - 1 

    spell = player.magic[magic_choice] 
    magic_dmg = spell.generate_damage() 

    current_mp = player.get_mp() 

    if spell.cost > current_mp: 
     print(bcolors.FAIL + "\nNot enough MP\n" + bcolors.ENDC) 
     continue 

    player.reduce_mp(spell.cost) 

    if spell.type == "white": 
     player.heal(magic_dmg) 
     print(bcolors.OKBLUE + "\n" + spell.name + " heals for", str(magic_dmg), "HP." + bcolors.ENDC) 
    elif spell.type == "black": 
     enemy.take_damage(magic_dmg) 
     print(bcolors.OKBLUE + "\n" + spell.name + " deals", str(magic_dmg), "points of damage." + bcolors.ENDC) 


enemy_choice = 1 

enemy_dmg = enemy.generate_damage() 
player.take_damage(enemy_dmg) 
print("Enemy attacks for", enemy_dmg) 

print("-----------------------") 
print("Enemy HP:", bcolors.FAIL + str(enemy.get_hp()) + "/" + str(enemy.get_max_hp()) + bcolors.ENDC + "\n") 

print("Your HP:", bcolors.OKGREEN + str(player.get_hp()) + "/" + str(player.get_max_hp()) + bcolors.ENDC) 
print("Your MP:", bcolors.OKBLUE + str(player.get_mp()) + "/" + str(player.get_max_mp()) + bcolors.ENDC + "\n") 

if enemy.get_hp() == 0: 
    print(bcolors.OKGREEN + "You win!" + bcolors.ENDC) 
    running = False 
elif player.get_hp() == 0: 
    print(bcolors.FAIL + "Your enemy has defeated you!" + bcolors.ENDC) 
    running = False 

Person Klasse:

class Person: 
    def __init__(self, hp, mp, atk, df, magic): 
     self.maxhp = hp 
     self.hp = hp 
     self.maxmp = mp 
     self.mp = mp 
     self.atkl = atk - 10 
     self.atkh = atk + 10 
     self.df = df 
     self.magic = magic 
     self.actions = ["Attack", "Magic"] 

      def generate_damage(self): 
    return random.randrange(self.atkl, self.atkh) 


def take_damage(self, dmg): 
    self.hp -= dmg 
    if self.hp < 0: 
     self.hp = 0 


    def heal(self, dmg): 
     self.hp += dmg 
     if self.hp > self.maxhp: 
      self.hp = self.maxhp 

def get_hp(self): 
    return self.hp 

def get_max_hp(self): 
    return self.maxhp 

def get_mp(self): 
    return self.mp 

def get_max_mp(self): 
    return self.maxmp 

def reduce_mp(self, cost): 
    self.mp -= cost 


def choose_action(self): 
    i = 1 
    print(bcolors.OKBLUE + bcolors.BOLD + "Actions" + bcolors.ENDC) 
    for item in self.actions: 
     print(str(i) + ":", item) 
     i += 1 

def choose_magic(self): 
    i = 1 

    print(bcolors.OKBLUE + bcolors.BOLD + "Magic" + bcolors.ENDC) 
    for spell in self.magic: 
     print(str(i) + ":", spell.name, "(cost:", str(spell.cost) + ")") 
     i += 1 
+3

Der Fehler sagt, dass 'Person' nicht weiß, wie' .heal'ed werden, so sollten Sie uns zeigen, wie Sie die Klasse definiert 'Person'. – kazemakase

+4

Wenn das in Ihrem Kommentar die gesamte Klasse ist. dann ist das Problem offensichtlich, dass du niemals "def heal" (selbst, Menge) "heilst. Bitte machen Sie dies auch in der Frage selbst. –

+2

bitte [bearbeiten] (http://Stackoverflow.com/posts/43206556/edit) den Beitrag und poste keinen mehrzeiligen Code in Kommentaren, der völlig unlesbar ist :) – kazemakase

Antwort

2

Ich sah gerade, dass die Frage bearbeitet wurde. Das Problem ist Einrückung. Alle Methoden def Anweisungen sollten mit der gleichen Einrückungsebene wie __init__ beginnen, andernfalls sind sie nicht Teil der Klasse.

(Indentation bedeutet, wie viele Räume, die Sie am Anfang einer Codezeile setzen.)


Zuerst möchte ich den Code auf das absolute Minimum reduzieren, das Problem zu reproduzieren.

class Person: 
    def __init__(self, hp): 
     self.maxhp = hp 
     self.hp = hp 

player = Person(460) 
player.hp = 455 # forcefully reduce player's hp 
player.heal(10) # AttributeError: 'Person' object has no attribute 'heal' 

Nun, es ist ziemlich offensichtlich, dass die player Person nicht wirklich wissen, wie geheilt werden. heal wurde nie definiert. Beachten Sie, dass auf die .hp ohne Probleme zugegriffen werden konnte, da es in __init__ definiert wurde.

heal sollte kein einfaches Attribut sein, weil wir es nennen wollen. Es sollte also eine Methode sein, das ist eine Funktion, die einer Klasse zugeordnet ist. Es kann so zum Beispiel definiert werden:

class Person: 
    def __init__(self, hp): 
     self.maxhp = hp 
     self.hp = hp 

    # This is part of the Person class 
    def heal(self, amount): 
     self.hp += amount 

# This is NOT part of the Person class 
def something(): 
    pass 
0

Sie haben nicht das UMSETZEN der Klasse Person buchen. Ich nehme an, dass Sie kein Attribut haben, das "heilen" genannt wird. Ich denke, dass Sie versuchen, eine Methode aus der Klasse Person aufzurufen (def heal (damage = 0))

Grundsätzlich sind Attribute die Klassenfelder. zum beispiel

class Example(): 
    field1 = [] # this is an attribute 
    health = 1000 # this is an attribute 

    def __init__(): # this is a method 
     field1 = ['a', 'b'] 

    def heal(value=0): #this is a method 
     if self.health < 1000: 
      if value > 1000 - self.health: 
       self.health = 1000 - self.health 
      else: 
       self.health += value 

Ich habe eine einfache Heilmethode geschrieben, damit Sie sehen können, worüber ich rede.

Wenn Sie also ein Attribut aufrufen möchten, verwenden Sie nicht die "(...)" für die Instanz einer Klasse. Sie rufen einfach "my_instance.attribute1" auf. Aber wenn Sie eine Methode aufrufen möchten, sollten Sie die "(...)" wie "my_instance.my_method()" verwenden. (Auch hier sprechen wir nicht über fortgeschrittene Python-Programmierung, zum Beispiel kann der @property-Dekorator mit verwendet werden, um eine Methode als Attribut aufzurufen).

Bearbeiten: Die Heal-Methode wird nur in der Take_damage-Methode angezeigt. Es ist eine lokale Funktion.

Verwandte Themen