Buchbeispiel geht nicht

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

http://pastebin.com/EV9nXtn6

Code: Alles auswählen

Traceback (most recent call last):
  File "D:/Phyton/Hallo Welt/Ski/skispiel.py", line 125, in <module>
    if getroffen[0].typ == "baum" and not getroffen[0].vorbei:
IndexError: list index out of range

Ich seh bei meinem Code keinen Unterschied zum Buch ..aber es will einfach nicht :(
BlackJack

@Tengel: Wenn das so im Buch steht, dann ist es offensichtlich fehlerhaft. Laut Fehlermeldung gibt es keinen Index 0 bei `getroffen`. Das kann nur passieren wenn `getroffen` *nichts* enthält. Also schau mal wie `getroffen` zustande kommt. Eine Zeile darüber durch die `pygame.sprite.spritecollide()`-Funktion. Die liefert eine leere Liste wenn die Skier mit *keinem* der Hindernisse kollidieren. Was eine Situation ist, mit der man rechnen muss, denn das ist ja gerade das Ziel des Spielers, nirgends gegen zu fahren. Also müsste der Code danach, damit rechnen und prüfen ob überhaupt eine Kollision stattgefunden hat, bevor das Objekt untersucht wird, mit dem die Skier kollidiert sind.

Zwei Zeilen später hast Du übrigens `image` falsch geschrieben. Mit einem Accent anstelle des i-Punkts. Du hast da noch ein paar andere falsch geschriebene Namen. Was für einen Editor verwendest Du denn? Eigentlich sollte so etwas nicht passieren, oder zumindest sollten alle Vorkommen eines Namens gleich falsch geschrieben sein, wegen der Autovervollständigung.

Der Quelltext ist qualitativ nicht wirklich gut, mit den globalen Werten und dem ganzen Code auf Modulebene. Das in den Klassenname das Wort Klasse vorkommt, ist auch nicht gut. Es gibt sehr schlechte Namen wie `t_ptr`. Verschiedene Namenskonventionen vermischt. Unbenutze lokale Variablen. Viele „magische” Zahlen.

Die Logik mit den beiden Karten ist nicht einfach über zwei Objekte gelöst, welche die Plätze tauschen, sondern umständlich über eine zusätzliche Variable `aktive_karte` die entweder 0 oder 1 ist und sagt welches die aktive Karte ist.

Edit: Noch ein Fehler im Programm: `animiere()` kann unter Umständen aufgerufen werden, bevor das darin benötigte `punktzahl_text` definiert wurde. Wenn man das nicht einfach über einen Modulglobalen zugriff machen würde, wäre der Fehler leichter zu entdecken.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ich verwende IDLE(Phyton GUI) mit Version 3.3 - das war beim Galileo Buch dabei.

Mehreres falsch geschrieben -hm das sind dann "Fingerfehler" - passiert mir öfter wen ich auf Arbeit was schreibe - muss mich erst an Laptoptastatur gewöhnen.

Naja - das der Code nicht sonderlich schön ist - ist wohl ein ständig wiederkehrendes und leidiges Thema bei Büchern.
Aber immerhin wurde schon an mehreren Stellen auf die allg. Konvention hingewiesen.

Der Code wird auch nur mit der Info - "Abtippen und ausprobieren" gebracht - wohl um zu zeigen was so möglich ist oder um die Leser bei Laune zu halten, ka.
Klassen etc. wurden eig. noch gar nicht behandelt.
BlackJack

@Tengel: Wenn der Editor keine Autovervollständigung für die Worte aus der aktuellen Datei bietet, dann würde ich einen anderen verwenden.

Und noch ein Fehler: In der `erstelle_karte()` ist ein Fehler der dafür sorgt, dass nur Fahnen und keine Bäume als Hindernisse erstellt werden.

Das ständige Neuladen von immer den selben Bildern ist sowohl von der Laufzeit, als auch vom Speicherverbrauch ineffizient.

Im Hinderniss werden `bild_name` und `ort` unnötigerweise an das Objekt gebunden. `bild_name` wird nie verwendet und `ort` ist redundant, weil die Information schon in `self.rect` gespeichert wird. In der Hauptschleife wird zwar auf das `ort`-Attribut zugegriffen, an der Stelle kann und sollte man dafür aber die `scrolle()`-Methode verwenden.

Der von `Group` und `Sprite` vorgegebene Mechanismus zum Zeichnen wird nur von der Hindernis-Spritegruppe verwendet, und der zum Aktualisieren wird überhaupt nicht verwendet. Ausserdem könnte man effizienter neuzeichnen, also zum Beispiel die `Group.clear()`-Methode verwenden, statt immer den ganzen Bildschirm zu füllen.

Bei Fahnenkollision wird unnötigerweise auf das `vorbei`-Attribut getestet, was bei Fahnen nie verändert wird.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Echt ätzend.... wie man es schon "falsch" beigebracht bekommt ...und da man es ja nicht besser weiß -.-"

Naja - ich hab ja mal gefragt was so genutzt wird - aber Texteditor ist mir dann doch zu Hardcore - ist Autovervollständigung für Anfänger nicht schlecht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Tengel hat geschrieben:Echt ätzend.... wie man es schon "falsch" beigebracht bekommt ...und da man es ja nicht besser weiß -.-"
Ich bin mir irgend wie sicher, dass auch Du schon mal die Warnungen hier im Forum vor Galileo-Büchern zum Thema Python gelesen oder sogar direkt als Warnung serviert bekommen hast ;-)

Was kann man da noch sagen? Selbt schuld! :-P
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Tengel: Was meinst Du mit Texteditor ist Dir zu Hardcore? Als „schlechte” Autovervollständigung für Anfänger (und auch Fortgeschrittene) bezeichnet man normalerweise solche die den Code analysiert und die Attribute von Objekten vorschlägt, weil man sich dann nicht mehr so gut die Codestruktur merkt und sich auf die Autovervollständigung verlässt. Aber so etwas wie eine Autovervollständigung die einfach nur bereits geschriebene Worte aus den gerade bearbeiteten Dateien anbietet, hilft einfach nur Namen die man bereits geschrieben hat, beim nächsten mal nicht falsch zu schreiben. Es nimmt ein wenig die Angst vor längeren, aber aussagekräftigen Namen, weil ein `StrassenAmpel` nicht deutlich mehr Schreibarbeit macht als `StrAmp`.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Das man im Texteditor keine farbigen Schlüsselwörter etc. hat?
BlackJack

@Tengel: Ich glaube Du hast falsche Vorstellungen davon was ein Texteditor ist. Mir fällt jetzt auf Anhieb ausser notepad.exe keiner ein der *kein* Syntaxhighlighting beherrscht.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Achsooooooooo :>
Ich dachte ihr meint mit Texteditor den Windows-> Zubehör 0/8/15 Standardeditor.
Das diese dev c++ etc auch "Texteditor" sind.....hätte mir eigentlich gleich einfallen können ... -.-"

Und was nutzt ihr da so?
BlackJack

@Tengel: Dev C++ ist eine IDE (Integrated Developement Environment), also etwas mehr als ein Texteditor auf der einen Seite, auf der anderen Seite aber auch ein bisschen weniger, weil hauptsächlich auf C++ zugeschnitten.

Wie gesagt, Editoren gibt's wie Sand am Meer. Neben den Klassikern Emacs und Vim noch eine ganze Menge anderer. Jeder hat da so seine(n) Lieblingseditor und ich denke jeder Programmierer hat in seinem Leben mehr als einen ausprobiert.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Verstehe - ich werde also mal googeln und ein paar anschauen :>
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

OT: DevC++ ist IIRC völlig veraltet und man sollte eher Codeblocks oder VC++ einsetzen.

Mein Texteditor der Wahl ist Notepad++. Wobei ich recht rudimentäre Anforderungen an einen Editor habe: Syntax-Hervorhebung, Wahl des Encodings, des Zeilenendes und eine einfache automatische Einrückung.

Vim/Emacs sind mir dann doch etwas zu "Hardcore" ... :roll:

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

bwbg hat geschrieben:OT: DevC++ ist IIRC völlig veraltet und man sollte eher Codeblocks oder VC++ einsetzen.
Visual Studio!?! Ab welcher Version kann man denn da von einer IDE (in Sachen C++!) sprechen? In der 2008er ist das eher ein Witz als etwas ernst zu nehmendes...

Wir haben heute die 2012er auf Arbeit installiert - auch wenn ich das primär mit C# einsetze, werd ich mir die C++ Unterstützung auch dabei angucken.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten