Ich habe auf GitHub das Projekt PythonPlantsVsZombies gefunden. Es ist ein Klon des legendären „Plants vs. Zombies“ in Pygame: mit Animationen, verschiedenen Zombie-Typen und Levels via JSON. Aber sobald man unter die Haube schaut, beginnt man, die Zombies zu bemitleiden. Sie müssen diesen Code zumindest nicht warten.

Lasst uns dieses ingenieurtechnische Meisterwerk sezieren.

1️⃣ Hölle aus if-elif oder „Fabrik auf Krücken“
In der Datei source/state/level.py lebt die Methode addPlant. Wenn du eine Pflanze auf ein Feld setzt, startet die Engine ein Verhör mit 19 Zweigen elif.

„Bist du eine Sonnenblume? Nein? Vielleicht ein Erbsenschütze? Auch nicht? Dann vielleicht eine Kirsche?“


if self.plant_name == c.SUNFLOWER:
new_plant = plant.SunFlower(x, y, self.sun_group)
elif self.plant_name == c.PEASHOOTER:
new_plant = plant.PeaShooter(x, y, self.bullet_groups[map_y])
# ... und so weiter 17 Mal


Willst du eine neue Sonnenblumenart hinzufügen? Geh in die Mitte der Datei und füge ein weiteres hinzu:
elif self.plant_name == c.SUNSHROOM:
new_plant = plant.SunShroom(x, y, self.sun_group)


Das ist ein klassisches Anti-Pattern. In einer normalen Welt würden wir ein Klassenregister oder Mapping verwenden. Ein einziges Wörterbuch – und diese Schande verwandelt sich in zwei elegante Zeilen.

2️⃣ Synchronisation von Listen – der Weg zur Schizophrenie
In source/component/menubar.py sind die Daten über Pflanzen (Namen, Kosten, Abklingzeit) auf vier unabhängige Listen verteilt.
Sie müssen alle streng gleich lang und in strenger Reihenfolge sein.
Hast du dich um einen Index in plant_sun_list geirrt? Herzlichen Glückwunsch, jetzt kostet dein Erbsenschütze so viel wie eine Kirsche, und die Kirsche ist kostenlos.

Wir haben dataclasses, wir haben Wörterbücher, wir haben OOP, schließlich. Gruppiere zusammengehörige Daten in Objekte, sonst wird das Debuggen zur Hölle.

3️⃣ Globale Nebeneffekte.
In source/tool.py erfolgt die Initialisierung von Pygame und die Erstellung des Fensters (SCREEN) direkt auf Modulebene.
Das Problem: Du kannst nicht einfach eine Konstante oder Hilfsfunktion aus dieser Datei in Tests importieren, ohne den gesamten Grafik-Kern zu initialisieren. Das tötet die Möglichkeit von Modultests. Die Logik sollte vom „Eisen“ getrennt sein.

4️⃣ Kluges „Gehirn“ bei dummen Objekten
Anstatt Polymorphismus zu verwenden (wo jede Pflanze selbst weiß, wie sie angreift), überprüft die Hauptklasse Level manuell die Zeichenkettennamen: if plant.name == c.THREEPEASHOOTER und entscheidet selbst, wohin geschossen wird. Das macht die Pflanzenklassen zu bloßen Dekorationen mit Bildern und die Spiellogik zu einem unhandlichen Monolithen.

Fazit:
Das Projekt ist cool als Demo und um Pygame auszuprobieren. Aber wenn du mit einem solchen Architekturansatz in ein normales Projekt kommst – wirst du schneller gefressen, als Zombies eine Nuss in der ersten Reihe fressen.

🎓 Was wir lernen:
1. Mach keine riesigen if-else-Ketten, wo Polymorphismus funktioniert.
2. Gruppiere zusammengehörige Daten in Objekte oder Wörterbücher.
3. Wenn du im Code den Satz „der Index in dieser Liste entspricht dem Index in jener Liste“ hast – lösche alles und schreibe neu.
4. Ressourcen (Grafik/Ton) sollten lazy geladen werden, nicht „alles auf einmal“ beim Import des Moduls.

#Code_braten