Files
bwinf40-runde1/a4-Wuerfelglueck
2021-11-29 21:24:18 +01:00
..
2021-11-29 21:24:18 +01:00
2021-11-19 16:03:04 +01:00
2021-11-19 16:03:04 +01:00
2021-11-29 21:24:18 +01:00

Würfelglück

Lösungsidee

Mithilfe eines Zufallsgenerators kann eine Seite des Würfels und somit die Augenzahl bestimmt werden. Dann muss entschieden werden welche Figur gezogen wird. In der folgenden Reihenfolge wird probiert, die Figuren zu ziehen:

  1. Wenn eine Figur auf Feld A steht, muss diese gezogen werden.
  2. Wurde eine 6 gewürfelt, wird eine neue Figur rausgebracht.
  3. Die vorderste Figur auf der Laufbahn, die gezogen werden kann, wird gezogen.
  4. Die Figur auf dem Zielfeld, die der Laufbahn am nächsten ist, wird gezogen. Welche Figur auf dem Zielfeld gezogen wird, ist nicht in den Regeln festgelegt. Es wäre auch möglich so zu ziehen, dass möglichst keine Figur vor dem Ziel blockiert wird, d. h. sie mit keinem möglichen Augenzahl gezogen werden kann. Allerdings wird der Fall, dass zwei verschiedene Figuren auf den Zielfelder gezogen werden können, selten auftreten. Außerdem wird durch Regeländerung zu einer festen Priorität der Figuren auf der Laufbahn klar, dass so weit vorausschauende Lösungen nicht in dieser Aufgabe erwartet werden.

Sollte der Spieler eine 6 würfeln, ist er nochmal dran, ansonsten der andere. Allerdings stellt sich die Frage, ob dieser auch nochmal dran ist, wenn er mit der 6 nicht ziehen kann. Nach der Anmerkung gilt "Wenn kein Stein bewegt werden kann, verfällt der Zug". Hier ist fraglich, was mit "Zug" gemeint ist. Einerseits können mehrere bewegte Figuren hintereinander als ein Zug angesehen werden, da der gleiche Spieler dran ist. Allerdings werden zwei Figuren gezogen, weshalb es auch als zwei Züge angesehen werden kann. Mit "Wer eine „6“ würfelt, hat nach seinem Zug einen weiteren Wurf frei." wird letzteres unterstützt, weil "nach seinem Zug" bedeutet, dass bereits ein Zug beendet ist, bevor das zweite Mal gewürfelt wird. Es sind also zwei Züge sind und nur der erste der beiden verfällt, sodass der Spieler auch nach Verfallen eines Wurfes mit einer 6 nochmal würfeln darf.

Es ist auch möglich, dass ein Spiel unentschieden ausgeht. Wenn beide Spieler z. B. keine 1 auf dem Würfel haben, diese aber brauchen, um ins Ziel zu kommen. Stellt sich die Frage, wie unentschiedene Spiele gezählt werden. Eine Möglichkeit wäre die Spiele zu wiederholen. Allerdings steht in der Aufgabenstellung: "[...] wie gut diese Würfel geeignet sind, um das Spiel zu gewinnen". D. h., dass es irrelavant ist, ob ein Würfel verloren oder unentschieden gespielt hat, sondern nur, wie oft gewonnen wurde.

Umsetzung

Das Programm wird in Rust implementiert. Als Argumente müssen Dateipfade zu den Eingabedateien übergeben werden. Das Spielfeld ist in einer Struktur gespeichert. Die Laufbahn wird einem 40er-Array innerhalb der Struktur gespeichert. Die Figuren der beiden Spieler werden durch 0 und 1 dargestellt. Die Spieler werden auch Spieler 0 und Spieler 1 genannt. Ist an der entsprechenden Stelle keine Figur, wird dies durch -1 dargestellt. Mit dem gleichen Format hat die Struktur zwei Arrays für die Zielfelder für die beiden Spieler. Außerdem hat die Struktur ein Attribut, das die Anzahl der Figuren auf den B-Feldern der beiden Spieler in einem Array speichert. Schließich hat die Struktur noch ein Attribut, das in einem 2d-Array die Positionen der Figuren abgespeichert, der erste Index 0 oder 1 entsprechend der beiden Spieler und der zweite Index für die Figuren des jeweiligen Spielers. Dies ist notwendig, damit schnell die Figuren gezogen werden können, ohne das das ganze Laufbahn-Array durchsucht werden muss. Die Methode "step" der "Field"-Struktur zieht die Figuren unter Angabe einer Figur und dem Würfelergebnis, wenn es möglich ist, und gibt je nach Erfolg einen Boolean zurück. Außerdem ruft sie die "beat" Methode auf, um die Figur zu schlagen, die dem Zug im Weg stehen.

In der main Funktion wird mit einer for-Schleife über die Eingabedateien iteriert. In einer weiteren for-Schleife werden alle möglichen Würfelkombinationen ermittelt. Wie oft gespielt wird, kann durch die "runs" Variable verändert werden. Eine while-Schleife läuft solange das Spiel läuft. Mit der "rand" Bibliothek werden Zufallszahlen erstellt und die Augenzahl bestimmt. Dann wird entsprechend des oben beschriebenen Algorithmus die "step" Methode aufgerufen. Wurde erfolgreich ein Zug gemacht, wird überpruft, ob der Spieler gewonnen hat. Konnte nicht gezogen werden, wird in einem HashSet die Augenzahl gespeichert. Kann bei keiner Augenzahl bei beiden Spielern eine Figur bewegt werden, wird das Spiel für Unentschieden erklärt. Wurden alle Spiele simuliert, wird das Ergebnis ausgegeben.

Beispiele

Ergebnisse für die Beispieldaten:

beispieldaten/wuerfel0.txt:
1. Würfel: Würfelseiten: [1, 1, 1, 6, 6, 6], Siege: 977293, Siegwahrscheinlichkeit:
0.977293, Niederlagen: 22707, Niederlagewahrscheinlichkeit: 0.022707, Unentschieden:
0, Unentschiedenwahrscheinlichkeit: 0
2. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6], Siege: 640526, Siegwahrscheinlichkeit:
0.640526, Niederlagen: 359474, Niederlagewahrscheinlichkeit: 0.359474, Unentschieden:
0, Unentschiedenwahrscheinlichkeit: 0
3. Würfel: Würfelseiten: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], Siege: 537390,
Siegwahrscheinlichkeit: 0.53739, Niederlagen: 462610, Niederlagewahrscheinlichkeit:
0.46261, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
4. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], Siege: 528348,
Siegwahrscheinlichkeit: 0.528348, Niederlagen: 471652,
Niederlagewahrscheinlichkeit: 0.471652, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0
5. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20], Siege: 316443, Siegwahrscheinlichkeit: 0.316443, Niederlagen:
683557, Niederlagewahrscheinlichkeit: 0.683557, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0
6. Würfel: Würfelseiten: [1, 2, 3, 4], Siege: 0, Siegwahrscheinlichkeit: 0,
Niederlagen: 1000000, Niederlagewahrscheinlichkeit: 1, Unentschieden: 0
Unentschiedenwahrscheinlichkeit: 0

Der Würfel ohne eine 6, kann natürlich nicht gewinnen.

beispieldaten/wuerfel1.txt:
1. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6], Siege: 580726,
Siegwahrscheinlichkeit: 0.580726, Niederlagen: 419274,
eiederlagewahrscheinlichkeit: 0.419274, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0
2. Würfel: Würfelseiten: [2, 3, 4, 5, 6, 7], Siege: 568755,
Siegwahrscheinlichkeit: 0.568755, Niederlagen: 327638,
Niederlagewahrscheinlichkeit: 0.327638, Unentschieden: 103607,
Unentschiedenwahrscheinlichkeit: 0.103607
3. Würfel: Würfelseiten: [3, 4, 5, 6, 7, 8], Siege: 497753,
Siegwahrscheinlichkeit: 0.497753, Niederlagen: 325580,
Niederlagewahrscheinlichkeit: 0.32558, Unentschieden: 176667,
Unentschiedenwahrscheinlichkeit: 0.176667
4. Würfel: Würfelseiten: [4, 5, 6, 7, 8, 9], Siege: 406054,
Siegwahrscheinlichkeit: 0.406054, Niederlagen: 363332,
Niederlagewahrscheinlichkeit: 0.363332, Unentschieden: 230614,
Unentschiedenwahrscheinlichkeit: 0.230614
5. Würfel: Würfelseiten: [5, 6, 7, 8, 9, 10], Siege: 247830,
Siegwahrscheinlichkeit: 0.24783, Niederlagen: 463716, Niederlagewahrscheinlichkeit:
0.463716, Unentschieden: 288454, Unentschiedenwahrscheinlichkeit: 0.288454
6. Würfel: Würfelseiten: [6, 7, 8, 9, 10, 11], Siege: 141690,
Siegwahrscheinlichkeit: 0.14169, Niederlagen: 543268,
Niederlagewahrscheinlichkeit: 0.543268, Unentschieden: 315042,
Unentschiedenwahrscheinlichkeit: 0.315042
beispieldaten/wuerfel2.txt:
1. Würfel: Würfelseiten: [1, 6, 6, 6, 6, 6], Siege: 783608,
Siegwahrscheinlichkeit: 0.97951, Niederlagen: 16392, Niederlagewahrscheinlichkeit:
0.02049, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
2. Würfel: Würfelseiten: [1, 1, 6, 6, 6, 6], Siege: 604274,
Siegwahrscheinlichkeit: 0.7553425, Niederlagen: 195726,
Niederlagewahrscheinlichkeit: 0.2446575, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
3. Würfel: Würfelseiten: [1, 1, 1, 6, 6, 6], Siege:
e03792, Siegwahrscheinlichkeit: 0.50474, Niederlagen: 396208,
Niederlagewahrscheinlichkeit: 0.49526, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
4. Würfel: Würfelseiten: [1, 1, 1, 1, 6, 6], Siege: 205269,
Siegwahrscheinlichkeit: 0.25658625, Niederlagen: 594731,
Niederlagewahrscheinlichkeit: 0.74341375, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
5. Würfel: Würfelseiten: [1, 1, 1, 1, 1, 6], Siege: 3057, Siegwahrscheinlichkeit:
0.00382125, Niederlagen: 796943, Niederlagewahrscheinlichkeit: 0.99617875,
Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
beispieldaten/wuerfel3.txt:
1. Würfel: Würfelseiten: [1, 2, 5, 6], Siege: 752618, Siegwahrscheinlichkeit: 0.752618,
Niederlagen: 247382, Niederlagewahrscheinlichkeit: 0.247382, Unentschieden:
0, Unentschiedenwahrscheinlichkeit: 0
2. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6, 7, 8], Siege: 612183,
Siegwahrscheinlichkeit: 0.612183, Niederlagen: 387817,
Niederlagewahrscheinlichkeit: 0.387817, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0
3. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6], Siege: 593636, Siegwahrscheinlichkeit:
0.593636, Niederlagen: 406364, Niederlagewahrscheinlichkeit: 0.406364, Unentschieden:
0,
Unentschiedenwahrscheinlichkeit: 0
4. Würfel: Würfelseiten: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], Siege: 447023,
Siegwahrscheinlichkeit: 0.447023, Niederlagen: 552977, Niederlagewahrscheinlichkeit:
0.552977, Unentschieden: 0, Unentschiedenwahrscheinlichkeit: 0
5. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], Siege:
440511, Siegwahrscheinlichkeit: 0.440511, Niederlagen: 559489,
Niederlagewahrscheinlichkeit: 0.559489, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0
6. Würfel: Würfelseiten: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20], Siege: 154029, Siegwahrscheinlichkeit: 0.154029, Niederlagen:
845971, Niederlagewahrscheinlichkeit: 0.845971, Unentschieden: 0,
Unentschiedenwahrscheinlichkeit: 0

Allgemein sind die Würfel mit der größten Wahrscheinlichkeit eine 6 zu würfeln am besten. Zum einem, da eine 6 benötigt wird, um raus zu kommen. Außerdem kann man nochmal würfeln, auch wenn man mit der 6 nicht ziehen konnte. Sehr große Augenzahlen dagegen sind zwar gut, um viele Schritte auf einmal zu gehen. Allerdings sind sie kurz vor dem Ziel von Nachteil, da man mit ihnen nicht mehr gehen kann.