Erst einmal: Danke für die Rückmeldung BlackJack!
Dann hab ich einiges vor mir, bis das Spiel auch gut aufgebaut ist, aber dazu hab ich es ja auch vorgestellt.
Die Programminfos werde ich wie vorgeschlagen ändern, ebenso wie die Pfadangaben.
BlackJack hat geschrieben:`setfigur()` und `getfigur()` sind unnötig. Man kann stattdessen auch gleich auf `figur` zugreifen.
Ich hab gedacht, dass man es besser so machen sollte, ließe sich aber ändern, kann ich auch einsehen.
BlackJack hat geschrieben:`Figur` macht zu viel bzw. vereint unterschiedliche Klassen in einer. Immer wenn man per ``if``-Abragen "Typen" unterscheidet, ist das ein deutlicher Hinweis, dass am Entwurf etwas nicht stimmt. Das ganze wird noch "schlimmer" als das es auch noch zwei "Ebenen" gibt, dadurch das eine "Figur" auch Felder repräsentiert.
Hm... Das stimmt schon... Am besten wäre es einmal die Felder zu haben und dann auf den Feldern die Figuren abzustellen. Momentan sind die Figuren ja Feld, Sonderfeld und Figur gleichzeitig...
Diese Typen sind nunmal wichtig für das Spiel... Diese Typen sind eigentlich nur die Hintergründe für das Feld und die muss ich ja auch irgendwo unterbringen. Und für jeden Typ von Feld (Haus der Auferstehung, 5/3/2/1 Felder bis zu Ziel und die Wasserfalle) eine eigene Klasse zu machen rechnet sich im Endeffekt auch nicht wirklich... Dabei haben sie keine Sonderfunktion.
BlackJack hat geschrieben:Warum ist die Statistik ein Dictionary und keine Klasse? Bzw. sind das ja anscheinend Statistiken für die jeweiligen Spieler, gehören also eher zu einem Spieler-Objekt.
Es ist ein Dictionary weil ich dachte damit kann man es leicht speichern. Bevor ich das ganze mit JSON gespeichert habe ging das über Prickle...
Aber auf jeden Fall wäre eine Klasse Spieler nicht ganz verkehrt... Ich werde mir mal einige Gedanken dazu machen.
BlackJack hat geschrieben:Bei `makestat()` sind mehrere Funktionen in einer zusammengefasst. Das `code`-Argument ist unschön. Statt das irgendwo im Code ``makestat(player_nummer, 'z')`` steht, wäre ein ``player.zuege += 1`` an der Stelle wesentlich lesbarer und verständlicher.
Ich hatte die Wahl zwischen dem 'makestat(spieler, "z")' oder einem 'self.statistik["zuege"][spieler-1] += 1' und da hab ich das erste genommen. Wenn man die Spieler aber in Klassen packt und auch die Statistik, dann würde das wegfallen.
BlackJack hat geschrieben:`getstat()` ist IMHO überflüssig.
Das ist das gleiche wie bei 'set-/getfigur()', werde ich ändern.
BlackJack hat geschrieben:Abkürzungen wie `ret` und `stati` sind IMHO schlechter Stil. Was zum Henker soll `eingabesm` bedeuten?
'ret', weil ich 'return' ja nicht nehmen kann und 'stati' weil mir 'self.statistik' zu lang war, das gleiche bei eingabesm. Bei letztem kann ich mich aber retten und auf folgende Zeile verweisen: (556)
Aber der Name ist tatsächlich nicht sehr schön.
BlackJack hat geschrieben:`ziehen()` ist zu lang und zu unübersichtlich.
Ja, ich weiß pylint meckert auch... Ich weiß nur noch nicht wie ich das sinnvoll ändern kann...
BlackJack hat geschrieben:Du ziehst anscheinend gerne von Indexen 1 ab. Das riecht ein wenig danach, dass die Datenstruktur falsch aufgebaut ist, oder dass Du GUI und Programmlogik mischst. Wenn in der Anzeige bei 1 angefangen wird zu zählen, darf dass in der Programmlogik nicht dazu führen, dass man da ständig Indexe anpassen muss. Das muss an der Grenze zwischen GUI und Logik passieren, sonst wird es intern früher oder später unübersichtlich.
Ja das war beim Programmieren immer etwas gemein: "Muss da jetzt '- 1' stehen oder nicht...?" Ist bei mir wahrscheinlich ein Überbleibsel von Delphi/Pascal, da hatte ich das auch sehr oft, wenn ich mich recht erinnere...
BlackJack hat geschrieben:Du gehst insgesamt zuviel über kryptische Zahlen und Indexe, statt Objekte zu verwenden.
Ich arbeite noch nicht allzu lange mit Klassen, aber sie haben schon immense Vorteile. Ich werde versuchen das in Zukunft zu vermeiden. Allerdings finde ich zu viele Klassen und Objekte auch so unübersichtlich... Das mit den Indexen ist auch ein Überbleibsel von Pascal, dort hatte ich nie so etwas praktisches wie for ... in und so weiter... Ich werde beim Verbessern des Codes daran denken.
BlackJack hat geschrieben:`getrausgeworfen()`, `getjenseits()`, und `getspielerfiguren()` sind wieder Methoden, die auf ein Spieler-Objekt gehören.
Was soll ich sagen...: Jap.
BlackJack hat geschrieben:In `getspielstand()` steht ein ``except`` ohne konkrete Ausnahme und ausserdem wird dort entweder ein Dictionary oder eine Liste mit zwei Elementen zurückgegeben, die etwas komplett anderes bedeutet. Solche speziellen "Fehlerwerte" sind schlechter Stil. Um diesen Mist loszuwerden wurden Ausnahmen erfunden.
Ich werde sehen, dass ich das loswerde... Und überhaupt: Wenn denn da ein Fehler auftritt, dann bricht das Skript eh ab, denn dort wo ich diese Funktion aufrufe gehe ich davon aus, dass es ein Dictionary zurückliefert. Wenn das nicht der Fall ist, gibt es Ärger.
BlackJack hat geschrieben:`loadsave()`!? Ja was denn nun? Load oder Save? Wenn man in die Methode reinschaut, keines von beidem. Den kompletten inneren Zustand eines so komplexen Objekts zu setzen, gehört IMHO eher in die __init__(), also dass man eine Funktion oder Klassenmethode schreibt, die ein Dictionary bekommt und daraus ein Spiel-Objekt erstellt.
Ja, das ist das tolle an Namen... Es wird wohl etwas gemeint sein wie LadeSpielstand... Aber immerhin geladen wird ja ein bisschen, obwohl es ja eher nur Zuweisungen sind, wie z.B. das Spielfeld und die Statistik.
BlackJack hat geschrieben:`Oberflaeche` speichert wohl auch noch ein paar Sachen, die in die Spiellogik gehören. Zum Beispiel die Rundenzahl oder welcher Spieler gerade dran ist. Ebenso ist das Laden und Speichern des Spielstands, und das Würfeln keine Aufgabe der GUI.
Ich schaue dann mal, dass ich das trenne... Ich fand es schwer beim Speichern GUI von Logik zu trennen... Die GUI sollte nur zum Anzeigen und Eingeben sein, während die Logik es dann tatsächlich speichert.
BlackJack hat geschrieben:Was ist denn das für eine Würfel-Methode!? Warum ist die so kompliziert? Warum hast Du nicht einfach das mit den Stäbchen in Code umgesetzt? Wie kommt man bei einer Beschreibung "Werfe 4 Stäbe die entweder weiss oder rot ergeben können" auf "Ich werfe 10.000 "Stäbe" bei denen weiss, rot, grün, oder gelb herauskommen kann"!? Kannst Du zumindest plausibel erklären warum Dein Code zu den gleichen Wahrscheinlichkeiten kommt, wie das einfache Werfen von vier Stäbchen mit zwei Farben?
Hm... Manchmal ist das genau mein Problem, in Mathe wie in Info... Es klappt alles und das auch gut, aber es ist unnötig. (Schlechtere Noten gab es dadurch noch nicht

) Ich hab mal schlechte Erfahrungen mit Zufallszahlen gemacht und deswegen mache ich immer ganz viele und schaue dann wo von am meisten da ist und das nehme ich dann. Theoretisch müssten ja alle Werte gleich sein, wenn man das statistisch auswerten würde.
Ich war so sehr auf diese 4 Möglichkeiten fixiert, dass ich ganz vergessen habe, dass es nur 2 Werte für jeden Stab gibt. Werde ich dann mal anpassen.
Danke nochmal für die Rückmeldung ich werde sie mir zu Herzen nehmen. Bis zur verbesserten Version wird es etwas dauern, denn ich muss doch einiges umorganisieren.