Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Hallo. Habe mal als erstes Programm ein Zahlenratespiel geschrieben. Nur irgendwie kriege ich das mit dem "pickle" nicht so richtig hin, und ich finde den Fehler nicht. Kann mir jemand helfen?
Jeez, das ist ja ein unglaublicher Wust. Den solltest du erstmal aufräumen und dir abgewöhnen Spaghetticode zu schreiben. Ich sehe in deiner Funktion mindestens 4 weitere.
Was genau ist denn das Problem (am besten mit Fehlermeldung)? Hast du die Doku schon gelesen? Daneben sollte man Pickles immer binär schreiben und lesen ("b" an den Modus anhängen -> "ab", "rb").
Du solltest deinen highscore entweder:
- als liste picklen (kannst du sortieren und. z.B. auf die besten 10 beschränken)
- komplett laden: zu jedem dump() gehört auch ein load()
b.esser-wisser hat geschrieben:- komplett laden: zu jedem dump() gehört auch ein load()
Zur Erklärung: In Zeile 60 legst du immer ein neues Highscore-Dictionary an, ohne die Werte des Alten zu laden.
Wenn du ein Dictionary benutzen willst, kannst du auch auf ``shelve`` ausweichen. Das nimmt dir den Verwaltungsaufwand ab, denn du mit ``pickle`` hast.
so, ich habs jetzt mal ein bisschen überarbeitet und mehrere funktionen daraus gemacht. ich hoffe, man kennt sich jetzt etwas besser aus .
muss ich jetzt die variablen guess, counter, versuche usw global anlegen?
Nein, nichts global machen. Vergiss am besten, dass es ``global`` überhaupt gibt. Werte sollten Funktionen als Argumente betreten und als Rückgabewerte verlassen.
Die Aufteilung ist auch nicht so gelungen, weil es eher aussieht wie Programmblöcke, denen Namen gegeben worden sind, damit man sie "anspringen" kann und nicht wie Funktionen.
Funktionen sollten Namen haben, die ihre Tätigkeit ausdrücken, und auf Abkürzungen sollte man möglichst auch verzichten, es sei denn die sind wirklich *sehr* geläufig.
Die `schwierigk()`-Funktion sollte zum Beispiel ein Tupel mit der zu ratenden Zahl und der Anzahl der maximalen Versuche zurückgeben. Und `erfrage_schwierigkeitsgrad()` oder so ähnlich heissen. Die Fehlerbehandlung muss natürlich auch in der Funktion erfolgen. Wenn da vom Benutzer etwas falsches eingegeben wird, liegt es in der Verantwortung dieser Funktion, solange zu fragen, bis etwas sinnvolles zurückgegeben werden kann.
Teilweise sollte man auch anders Aufteilen. Zum Beispiel ist das laden und speichern der Bestenliste eine Aufgabe, die prima jeweils in eine Funktion abstrahiert werden kann.
1.Immer wenn du den counter um 1 hochzählst, zählst du versuche um eins runter. Die könnte man eigentlich ganz gut miteinander verknüpfen.
2. "menu = int(raw_input(" > "))" ?? Dann kann man auch gleich input nehmen. Allerdings würde ich vorschlagen das ganze über raw_input zu machen und dann abfragen: if menu == '1': an stelle von == 1.
3. Ich halte die Prozeduren nicht gerade für sinnvoll gewählt. (allerding ist das eher Ansichtssache) Edit: und scheinbar ist BlackJack der gleichen Meinung
4. Den Highscore kann man schön leicht manipulieren
(nicht als txt speicher)
Hierzu mal ein Bsp.:
Pascal hat geschrieben:2. "menu = int(raw_input(" > "))" ?? Dann kann man auch gleich input nehmen.
Nein, das sollte man nicht machen. So kann man ganz einfach den eventuellen `ValueError` abfangen und den Benutzer zu einer richtigen Eingabe auffordern. Andernfalls fliegt einem im günstigten(!) Fall nur das Skript an unerwarteter Stelle um die Ohren.
Pascal hat geschrieben:4. Den Highscore kann man schön leicht manipulieren
(nicht als txt speicher)
Pickle speichert keinen "Text", auch wenn es lesbar ist. Kryptische Binärdateien lassen sich auch nur geringfügig schwieriger manipulieren, mann muss nur die Muster finden. Und überschreiben ist eine unzulässige Idee. Vor allem, da einem das Skript um die Ohren fliegt, weil dein Datentyp nicht (mehr) dem von wildflower entspricht
In dieser Funktion brauchst du keine Schleife. Ob man 10 oder 11 Versuche hat, macht meiner Meinung nach keinen großen Unterschied. If-Else kannst du durch ein Dictionary gut vereinfachen (siehe Code von BlackJack). Aber am wichtigsten ist, dass du auf eine Schleife verzichtest, weil sie einfach überflüssig ist.