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 Zusammen,
wir spielen in der WG zur Zeit gerne das Brettspiel "Risiko". Jedoch sind zum Ende des Spieles die Armeen sehr groß und das ewige Würfeln wird lästig. Mit einem Programm das, dass Auswürfeln einzelner Kämpfe übernimmt bin ich für meine Verhältnisse schon sehr weit gekommen. Jedoch versagt diese zentrale while-Schleife manchmal und erzeugt negative Punktestände, obwohl sie das nach meinem Verständnis von dem Quellcode gar nicht darf! Hat jemand einen Tipp wo mein Fehler liegt?
Mal ein paar ausgewählte Punkte:
Wenn ich das richtig verstehe, ist unter anderem deine Schleifenbedigung fehlerhaft, da du es vmtl. so geschrieben hast, wie man es in der natürlichen Sprache sagen würde ("Solange a oder B größer/gleich null sind"). Es müsste aber so in Python übersetzt werden: "while punkte_b >=0 and punkte_a >=0". Statt 'eval' wäre 'int' die korrekte Wahl. Normale Variablennamen sollten per Konvention keine Großbuchstaben enthalten. Die ganzen Würfelwürfe könntest du in eine Funktion "roll()" oder so auslagern.
Zuletzt geändert von nezzcarth am Mittwoch 24. Oktober 2018, 18:35, insgesamt 1-mal geändert.
@Casio: Du hast doch Punkte_X -=1 in Deiner while-Schleife, also ist es doch prinzipiell möglich, dass negative Punkte rauskommen. Die while-Schleife wird erst beendet, wenn Punkte_B == 0 und Punkte_A < 0. Also muß Punkte_A negativ sein. Wird Punkte_b negativ, hast Du eine Endlosschleife. Wie soll denn die Bedingung eigentlich heißen?
Zum Code allgemein: `eval` hat in einem vernünftigen Programm nichts verloren. Hier willst Du doch nur `int` verwenden. Am Anfang der while-Schleife wird viel Code wiederholt. Am besten wäre es, eine Funktion zu schreiben, die n sortierte Würfelwürfe zurückgibt.
Wenn der elif-Block und der else-Block identisch sind, braucht es nur den else-Block.
solange Punkte_B ungleich Null und damit True ist wird die Kondition Punkte_A >= 0 nicht geprüft
das passiert erst wenn Punkte_B gleich Null und damit False ist.
@__blackjack__ :
habe gerade deine Variante nachvollzogen. War für mich viel neues dabei --> zip() und partial() sind auf jeden Fall ziemlich praktisch. Manchmal knarzt das Programm ein bischen.
Beispiel: Hier in Runde 3 würfelt der Verteidiger besser, bekommt aber trotzdem Punkte abgezogen.