Seite 1 von 1

Python Code Problem : " IndentationError: unindent does not match any outer indentation level "

Verfasst: Mittwoch 12. August 2020, 18:57
von P.welke
Guten Tag,

ich bin neu hier im Forum und auch in der Python Programmierung. Ich heisse Patrick bin 25j alt und möchte mir Hobbymässig Python aneignen.
Nun habe ich diverse Videos angeschaut und bin auf ein Textadventure gestoßen was ich jetzt abgetippt habe und umbauen will, nur komme ich an einer Stelle nicht weiter weil mir 'IndentationError: unindent does not match any outer indentation level' .



# -*- coding: utf-8 -*-
"""
Created on Wed Aug 12 05:12:03 2020

@author: G-O-D
"""
import random


class Item:
def __init__(self, weigth, worth):
self.weight = weight
self.worth = worth

class Potion(Item):
def __init__(self, weight, worth):
Item.__init__(self, weight, worth)


class HealthPotion(Potion):
def __init__(self, weight, worth, regenerated_health):
Potion.__init__(self, weight, worth)
self.regenerated_health = regenerated_health


class Character:
def __init__(self, hp, ad, name):
self.hp = hp
self.ad = ad
self.name = name

class CP(Character):
def __init__(self):
Character.__init__(self, 100, 10,"Max")

class HRDCP (Character):
def __init__(self):
Character.__init__(self, 1000, 10,"Felix")


class Player(Character):
def __init__(self, name, hp, ad):
Character.__init__(self, hp, ad, name)
self.max_hp = hp

def die(self):
exit(" Verkackt!!")

def get_hit(self, ad):
self.hp = self.hp - ad
if self.hp <= 0:
self.die()

def die(self):
print(" Du bist TOT!")

def rest(self):
self.hp = self.max_hp




class Field:
def __init__(self, enemies):
self.enemies = enemies
self.loot = []

def print_state (self):
print (" Du guckst dich um ")
for i in self.enemies:
print(i.name)
def gen_random():
rand = random.randint(0,2)


if rand == 0: <--------------------------- In dieser Reihe tritt der Fehler auf 'IndentationError: unindent does not match any outer indentation level'
return Field([])
if rand == 1:
return Field([CP()])
if rand == 2:
return Field ([HRDCP(), HRDCP(), CP()])

class Map:
def __init__(self, width, height):
self.state = []
self.x = 0
self.y = 0

for i in range(width):
fields = []
for j in range(height):
fields.append(Field.gen_random())
self.state.append(fields)

def print_state(self):
self.state[self.x][self.y].print_state()

def get_enemies(self):
return self.stte[self.x][self.y].enemies



def forwards(self):
if self.x ==len(self.state):
print(" Du siehst in weiter Ferne Autos die weit weg von dir fahren...")
else:
self.x = self.x + 1

def backwards(self):
if self.x == 0:
print(" Du siehst eine weitere kammer die Spass versprechen kann...")
else:
self.x = self.x - 1

def right(self):
if self.y ==len(self.state[self.x]) -1 :
print(" Du siehst in weiter Ferne Autos die weit weg von dir fahren...")
else:
self.x = self.x + 1

def left(self):
if self.x == 0:
print(" Du siehst in weiter Ferne Autos die weit weg von dir fahren...")
else:
self.x = self.x - 1



def forward(p, m):
m.forward()

def right (p, m):
m.right()

def left(p, m):
m.left()

def backwards(p, m):
m.backwards()

def save ():
pass

def load ():
pass

def quit_game(p, m):
print("Du hast anscheinend keinen Bock mehr ;p...")


def pickup(p, m):
pass

def fight(p, m):
enemies = m.get_enemies()
while len(enemies > 0):
enemies[0].get_hit(p.ad)
if enemies[0].is_dead():
enemies.remove(enemies[0])
for i in enemies:
p.get_hit(i.ad)

def rest(p, m):
p.rest()

help = help(print_help)


Commands = {
'help' : print_help,
'quit' : quit_game,
'pickup' : pickup,
'forward' : forward,
'right' : right,
'left' : left,
'backwards' : backwards,
'fight' : fight,
'save' : save,
'load' : load,
'rest' : rest,
'run' : run_away
}

def print_help(p, m):
print(Commands.keys())



if __name__ == '__main__':
name = input("Gib deinen Namen ein")
p = Player(name, 1000, 100)
map = Map (5,5)
print (" (Gebe Hilfe ein um die Verfügbaren Kommandos zu sehen)\n")
while True:
command = input (">").lower().split(" ")#Nuckelflasche nehmen
if command [0] in Commands:
if len(command) > 1:
Commands[command[0]](p, map, command[1:])
else:
Commands[command[0]](p, map)
else:
print(" Du stehst Hypnotisiert im Raum!")

Irgendwie weiss ich nicht warum?!... Habe auch leider nicht so viel Erfahrung, bis jetzt habe ich mich mit den Grundsachen beschäftigt dieser Script ist der erste größere.

Freue mich über Hilfe ;p

Gruss

Patrick

Re: Python Code Problem : " IndentationError: unindent does not match any outer indentation level "

Verfasst: Mittwoch 12. August 2020, 20:43
von sparrow
Wenn du Code ins Forum postest, dann setze ihn Code-Tags. Die escheinen automatisch, wenn du im "Vollständiger Editor & Vorschau" den </>-Button drückst.
Dann bleibt auch die Einrückung erhalten, die bei Python wichtig und in diesem Fall (wie die Fehlermeldung sagt) auch fehlerhaft ist.

Eingerückt wird in Python mit vier Leerzeichen. Ist dein Code zumeist auch.
Zumindest für die von dir makierte Zeile trifft das aber nicht zu. Und so weiß der Interpreter nicht, zu welcher Ebene der Block gehört. Mal mit 4 Lerzeichen eingerückt, mal mit 6? Dann findet er die entsprechende Einrückungsebene nicht.

Re: Python Code Problem : " IndentationError: unindent does not match any outer indentation level "

Verfasst: Mittwoch 12. August 2020, 21:08
von Sirius3
Wenn eine __init__-Methode nur ihren Vorgänger aufruft, dann kann man sie auch gleich ganz weglassen:

Code: Alles auswählen

class Potion(Item):
    pass
Benutze keine Abkürzungen. Was soll CP oder HRDCP denn bedeuten?
hp -> health_points und ad -> ???
Warum ist in `Player` die Reihenfolge der __init__-Argumente gedreht?
Die Methode die wird zweimal definiert. Das sieht falsch aus. Im ersten die wird direkt exit aufgerufen, was man niemals tun sollte, weil es erstens sys.exit heißen müßte und zweitens dieses sys.exit niemals außerhalb der main-Funktion exisitieren sollte. Das Argument sollte auch immer eine positive Zahl sein.
In Field.print_state wird `i` für einen enemy benutzt, was ein sehr schlechter Variablenname ist.
Innerhalb einer for-Schleife eine Funktion zu definieren, ist sehr unschön, vor allem, wenn es dort gar keinen Sinn macht.
Dann stimmt die Einrückung gar nicht mehr, in Python ist die Einrüchtung wichtig, um logische Blöcke zu definieren. `gen_random` sollte wohl eine static_method sein, wobei hier class_method besser wäre.
Nach Map.__init__ ist die Einrückung auch falsch.
Eine Schleife in der nur eine leere Liste erzeugt wird, ist unsinnig. Hier ist die Einrückung wahrscheinlich auch falsch. In `get_enemies` gibt es dann auch noch einen Tippfehler.
Ab Zeile 105 sind die Methoden nicht weit genug eingerückt.
Die Funktionen ab Zeile 131 haben schlecht benannte Argumente, p und m? Was soll das sein?
`save` und `load` haben keine Argumente, was dann weiter unten zu Fehlern führen dürfte.
In fight ist die Klammerung falsch und ein is_dead gibt es nicht.

Es ist wenig sinnvoll über 200 Zeilen Code zu schreiben, ohne irgendetwas zu testen. Man schreibt ein Programm Stück für Stück und macht erst weiter, wenn das Programm komplett getestet ist und funktioniert. Zum Testen schreibt man am besten eigene Test-Programme um Tests automatisiert wiederholen zu können.