Tic Tac Toe

Neue Frage »

Schnoofy Auf diesen Beitrag antworten »
Tic Tac Toe
Hej Ihr Lieben,

ich habe mir vor ein paar Wochen folgende Frage gestellt:

"Aendert sich die Wahrscheinlichkeit auf einem (3x3)-Feld Tic Tac Toe mit einer 3er-Kette X oder O zu gewinnen im Gegensatz zu einem (4x4)-Feld, wo man mit einer 4er-Kette gewinnt?"

Folgende Einschraenkungen sind zu beachten, damit die Fragestellung beherrschbar bleibt:
1.) Es wird angenommen, dass voellig zufaellig gesetzt wird.
2.) Es wird angenommen, dass das Spiel vorbei ist, sobald alle Felder besetzt sind (auch wenn ein Spieler zwischendurch bereits gewonnen hat.)
3.) Es wird angenommen, dass man gewonnen hat, sobald man eine 3er- respektive 4er-Kette zusammen hat. Es ist moeglich, dass der Gewinner zwei Ketten gleichzeitig hat; dieses Ereignis wird als normaler Gewinn klassifiziert.

Die theoretischen Ueberlegungen / Rechnungen habe ich als PDF angefuegt. Zusaetzlich wurde ein Java-Programm geschrieben, welches jedoch - zumindestens beim (4x4)-Feld - eine fakultative Laufzeit hat und nicht fertig werden wollte mit der Berechnung.

Das Hauptproblem ist, dass in den Berechnungen immer wieder doppelte Faelle sind, die natuerlich herausgerechnet gehoeren.
Intuitiv wuerde ich sagen, dass die Wahrscheinlichkeit zu gewinnen auf einem (4x4)-Feld groeßer ist als auf einem (3x3)-Feld, da wir hier 16 Felder zur Verfuegung haben auf denen man eine 4er-Kette bilden muss als auf dem Feld mit 9 Einheiten wo eine 3er-Kette zu bilden ist. Dies ist jedoch nur Intuition und muss noch durch eine exakte Rechnung verifiziert werden.

Uebrigens: Man kann das Spielchen noch beliebig irrer machen indem man auf noch groeßere Felder geht oder sogar die Dimensionen vergroeßert.

Hat vielleicht Jemand eine Idee? Weitere Loesungsansaetze waeren schon hilfreich.

Viele Grueße,
Maurice
Dopap Auf diesen Beitrag antworten »

warum sollte man das komplizierte Zufallsspiel nicht simulieren ?
Die freien Felder werden zufällig belegt, bis eine Reihe erzielt ist. oder alle Felder belegt sind.

Somit könnte man
a.) die Frage beantworten

und bei Aufsplittung der Siege und Unentschieden =0 den Erwartungswert bestimmen und damit

b.) klären, ob der Anziehende im Vorteil ist.

Das dürfte doch eigentlich kein Problem darstellen.
Schnoofy Auf diesen Beitrag antworten »

Hej Dopap,

hast Du denn einen Loesungsansatz fuer mich?

Viele Grueße,
Maurice
Dopap Auf diesen Beitrag antworten »

da hast du mich nicht richtig verstanden.

Auf dem Computer nimmst du ein Array 3x3 und belegst zufällig ein Rest-Feld mit der 1. Dann zufällig ein Rest-Feld mit der Null, dann wieder eine 1...

Ab 3 Belegungen fragst du alle Zeilen und Spalten und Diagonalen auf Summe ab.

Bei Summe = 3 hat Spieler A gewonnen
Bei Summe = 0 hat Spieler B gewonnen.

Abbruch.

nächster Abbruch bei n= 9

und die Ergebnisse immer addieren.

Und das spielst, simulierst du z.B. 100000 mal. Dann sieht man schon mehr.
Huggy Auf diesen Beitrag antworten »

Falls es noch interessiert, mit je 10^5 Simulationen habe ich erhalten:

n|--G-----R----V---
3| 58.4 12.8 28.8
4| 31.7 41.8 26.6
5| 24.7 59.8 15.5
6| 12.1 75.9 11.9

n: Brettgröße
G: Gewinn (%) aus Sicht des Beginnenden
R: Remis (%)
V: Verlust (%)
Schnoofy Auf diesen Beitrag antworten »

Hej Huggy,

hast Du ein Programm geschrieben? Wenn ja, magst Du mir es eventuell zukommen lassen?

Auf den ersten Blick schaut es so aus, als das sich mit groeßer werdenden n die Werte G und V annaehern und die Remis-Rate stark ansteigt. Koenntest Du vielleicht die Werte bis n = 10 noch zur Verfuegung stellen?

Viele Grueße,
Maurice
 
 
Huggy Auf diesen Beitrag antworten »

Die gewünschten weiteren Ergebnisse:

n |--G----R---V---
7 | 8.4 85.5 6.1
8 | 4.3 91.6 4.1
9 | 2.6 95.4 2.0
10| 1.3 97.4 1.3

Es ist plausibel, dass mit größer werdendem Feld die Remisquote ansteigt und der Vorteil des Anzugs immer kleiner wird. Das Programm ist ein Mathematica-Programm. Ohne Kenntnisse in Mathematica dürfte es nicht leicht lesbar sein. Ich füge es trotzdem mal bei.

Der Ablauf ist wie folgt: Zunächst wird das Spielbrett als lineare Felderkette (linBrett0) betrachtet und mit einer Standardzugfolge belegt. Die Simulation erfolgt mit der Zeile

code:
1:
linBrett = RandomSample[linBrett0];
Damit wird eine Zufallspermutation der Zugfolge erzeugt. Der Rest ist die Prüfung, ob jemand und falls ja, wer gewonnen hat. Dieser Teil ist nicht auf Effektivität, sondern auf Bequemlichkeit ausgelegt. Das Programm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
(* Initialisierung und Eingabe *)
n = 10; nn = n^2; nSim = 10^5; nErg = {0, 0, 0};
linBrett0 = Table[(-1)^(i + 1)*i, {i, 1, nn}];

(* Simulation *)
For[iSim = 0, iSim < nSim, iSim++,
   rslt = 0; nZmin = nn + 1;
   linBrett = RandomSample[linBrett0];
   zlBrett = Table[linBrett[[n*(i - 1) + j]], {i, n}, {j, n}];
   spBrett = Table[linBrett[[n*(i - 1) + j]], {j, n}, {i, n}];
   diag1 = Table[zlBrett[[i, i]], {i, n}];
   diag2 = Table[zlBrett[[i, n + 1 - i]], {i, n}];
   zlSum = Table[Total[Sign[zlBrett[[i]]]], {i, n}];
   spSum = Table[Total[Sign[spBrett[[i]]]], {i, n}];
   d1Sum = Total[Sign[diag1]];
   d2Sum = Total[Sign[diag2]];
   
   For[i = 1, i < n + 1, i++,
    If[Abs[zlSum[[i]]] == n, nZ = Max[Abs[zlBrett[[i]]]]; 
     If[nZ < nZmin, nZmin = nZ; rslt = Sign[zlSum[[i]]]]];
    If[Abs[spSum[[i]]] == n, nZ = Max[Abs[spBrett[[i]]]]; 
     If[nZ < nZmin, nZmin = nZ; rslt = Sign[spSum[[i]]]]]];
   If[Abs[d1Sum] == n, nZ = Max[Abs[diag1]];
    If[nZ < nZmin, nZmin = nZ; rslt = Sign[d1Sum]]];
   If[Abs[d2Sum] == n, nZ = Max[Abs[diag2]];
    If[nZ < nZmin, nZmin = nZ; rslt = Sign[d2Sum]]];
   nErg[[rslt + 2]]++;
   ]; // Timing

(* Ergebnis *)
nErg
Print[nErg[[3]]/nSim*100., " % Gewinn"];
Print[nErg[[2]]/nSim*100., " % Remis"];
Print[nErg[[1]]/nSim*100., " % Verlust"];
Dopap Auf diesen Beitrag antworten »

@Huggy: also wird das Brett erstmal voll belegt, und dann geprüft ?

geht das mit der Regel konform, wonach vorzeitiger Abbruch wegen Gewinn eines Spielers quasi die Regel ist. ?
Huggy Auf diesen Beitrag antworten »

Ja. Wenn es mehrere gefüllte Zeilen/Spalten/Diagonalen gibt, wird geprüft, wer das zuerst erreicht hat. Deshalb enthält die Zugcodierung auch die Zugnummer. Ein Eintrag -7 im Feld 5 von linBrett würde bedeuten, Spieler 2 hat Feld 5 im Zug 7 besetzt. Da man in Mathematica die gesamte Zugliste mit dem einen Befehl RandomSample permutieren kann, erschien mir das einfacher, als die Züge einzeln zu generieren und nach jedem Zug zu prüfen.
Neue Frage »
Antworten »



Verwandte Themen