Hallo,
Es geht um ein Würfelspiel. Kurz erklärt kann jeder der beiden Spieler so oft würfeln, wie er mag und die Summe der Augen wird aufaddiert. Wenn er jedoch eine 1 würfelt, bekommt er nur eine 1 aufgeschrieben und sein Gegenüber ist an der Reihe. So geht das hin und her, bis bsps.-weise jemand 100 "Punkte" erreicht hat.
So: Ich hab jedenfalls 3 ineinerander verschachtelte Arrays initialisiert von wegen
int [][][] arr = new int [j][k];
,wobei i mein momentaner Punktestand sein soll, j der Punktestand meines Gegenübers und k bezeichnet immer die Zwischensumme von demjenigen, der Gerade am Würfeln ist und nach Beendigung dann auf i oder j (je nachdem, wer dran ist aufaddiert wird). So weit, so gut.
Jetzt will ich im nächsten Schritt eine Methode schreiben, welche die jeweiligen Wahrscheinlichkeit berechnen für den Sieg des Spielers, der i Punkte momentan hat.
Das will ich in jedem Zug berechnen , um später entscheiden zu können, ob es sinnvoller ist nach bsps.-weise 3mal würfeln aufzuhören oder doch lieber weiterzuwürfeln, da der andere kurz vorm gewinnen ist mit 99 Augen, wobei das Spiel bei 100Augen vorbei ist....
Jedenfalls möchte ich jetzt einfach nur die Wkt. in jedem Spielzug i,j,k ausrechnen und sie im oben genannten Array abspeichern.
Der mathematische Algorithmus ist: Im folgenden sehr ihr die Formulierung, mit der ich momentan noch gar nichts anfangen kann!!!
Sei i der eigene Gesamtpunktestand, j der Gesamtpunktestand des Gegners und k die
in diesem Zug bereits erspielten Punkte. Nun sei Pi;j;k die Wahrscheinlichkeit dass der Spieler
gewinnt. Dann gilt:
P i;j;k = 1 wenn i + k >= N
P i;j;k = 0 wenn j >=N
Diese beiden Dinge habe ich mit if ohne Probleme formulieren können:
if ((i+k)>= goal){arr[j][k]= 0;break;}
if ((j+k)>= goal){arr[j][k]= 1;break;}
Das Break bemängelt er noch, aber sonst..... denk ich ok....
Bei i + k >= N (ist mein Goal) kann der Spieler sofort aufhören und hat gewonnen. Wenn j >= N hat der
gegnerische Spieler gewonnen. Im allgemeinen Fall mit 0 <= i; j < N (ist mein Goal) entscheidet der Spieler, ob er weiter würfelt (roll) oder mit dem Zug aufhört (hold) je nach dem welche von den beiden
Möglichkeiten höhere Gewinnchancen hat:
P (i;j;k) = max(P_roll (i;j;k) ; P_hold (i;j;k))
Dabei ist P_roll (i;j;k) die Wahrscheinlichkeit zu gewinnen falls man weiter würfelt und Phold (i;j;k) falls
man sofort aufhört:
P_roll (i;j;k) = 1/6
((1 - P (j,i+1,0) + P(i,j,k+2) + P(i,j,k+3) + P(i,j,k+4) + P(i,j,k+5) + P(i,j;k+6)
P_hold(i,j,k) = 1 - P(j,i+max(k,1),0
Die Wahrscheinlichkeit zu gewinnen, wenn man mit dem würfeln aufhört (oder wegen einer 1
aufhören muss), entspricht der Wahrscheinlichkeit, dass der Gegner im nächsten Zug verliert.
Die anderen Fälle entsprechen dem Gewinn durch höhere Punktzahlen.......
In dem mathematischen Code wusste ich nicht, wie ich den Indey ausdrücken soll. Deshalb bitte () als Index ansehen außer bei max(k,1),0
Entschuldigt die Unstrukturiertheit, jedoch siehts leider genauso gerade in meinem Kopf aus xD
Für nützliche Tips wäre ich außerordentlich dankbar, die Wahrscheinlichkeiten der mathematischen Struktur in Java-Code umzusetzen. Ich versuchs hier mal weiter...
Danke im Voraus
Es geht um ein Würfelspiel. Kurz erklärt kann jeder der beiden Spieler so oft würfeln, wie er mag und die Summe der Augen wird aufaddiert. Wenn er jedoch eine 1 würfelt, bekommt er nur eine 1 aufgeschrieben und sein Gegenüber ist an der Reihe. So geht das hin und her, bis bsps.-weise jemand 100 "Punkte" erreicht hat.
So: Ich hab jedenfalls 3 ineinerander verschachtelte Arrays initialisiert von wegen
int [][][] arr = new int [j][k];
,wobei i mein momentaner Punktestand sein soll, j der Punktestand meines Gegenübers und k bezeichnet immer die Zwischensumme von demjenigen, der Gerade am Würfeln ist und nach Beendigung dann auf i oder j (je nachdem, wer dran ist aufaddiert wird). So weit, so gut.
Jetzt will ich im nächsten Schritt eine Methode schreiben, welche die jeweiligen Wahrscheinlichkeit berechnen für den Sieg des Spielers, der i Punkte momentan hat.
Das will ich in jedem Zug berechnen , um später entscheiden zu können, ob es sinnvoller ist nach bsps.-weise 3mal würfeln aufzuhören oder doch lieber weiterzuwürfeln, da der andere kurz vorm gewinnen ist mit 99 Augen, wobei das Spiel bei 100Augen vorbei ist....
Jedenfalls möchte ich jetzt einfach nur die Wkt. in jedem Spielzug i,j,k ausrechnen und sie im oben genannten Array abspeichern.
Der mathematische Algorithmus ist: Im folgenden sehr ihr die Formulierung, mit der ich momentan noch gar nichts anfangen kann!!!
Sei i der eigene Gesamtpunktestand, j der Gesamtpunktestand des Gegners und k die
in diesem Zug bereits erspielten Punkte. Nun sei Pi;j;k die Wahrscheinlichkeit dass der Spieler
gewinnt. Dann gilt:
P i;j;k = 1 wenn i + k >= N
P i;j;k = 0 wenn j >=N
Diese beiden Dinge habe ich mit if ohne Probleme formulieren können:
if ((i+k)>= goal){arr[j][k]= 0;break;}
if ((j+k)>= goal){arr[j][k]= 1;break;}
Das Break bemängelt er noch, aber sonst..... denk ich ok....
Bei i + k >= N (ist mein Goal) kann der Spieler sofort aufhören und hat gewonnen. Wenn j >= N hat der
gegnerische Spieler gewonnen. Im allgemeinen Fall mit 0 <= i; j < N (ist mein Goal) entscheidet der Spieler, ob er weiter würfelt (roll) oder mit dem Zug aufhört (hold) je nach dem welche von den beiden
Möglichkeiten höhere Gewinnchancen hat:
P (i;j;k) = max(P_roll (i;j;k) ; P_hold (i;j;k))
Dabei ist P_roll (i;j;k) die Wahrscheinlichkeit zu gewinnen falls man weiter würfelt und Phold (i;j;k) falls
man sofort aufhört:
P_roll (i;j;k) = 1/6
((1 - P (j,i+1,0) + P(i,j,k+2) + P(i,j,k+3) + P(i,j,k+4) + P(i,j,k+5) + P(i,j;k+6)
P_hold(i,j,k) = 1 - P(j,i+max(k,1),0
Die Wahrscheinlichkeit zu gewinnen, wenn man mit dem würfeln aufhört (oder wegen einer 1
aufhören muss), entspricht der Wahrscheinlichkeit, dass der Gegner im nächsten Zug verliert.
Die anderen Fälle entsprechen dem Gewinn durch höhere Punktzahlen.......
In dem mathematischen Code wusste ich nicht, wie ich den Indey ausdrücken soll. Deshalb bitte () als Index ansehen außer bei max(k,1),0
Entschuldigt die Unstrukturiertheit, jedoch siehts leider genauso gerade in meinem Kopf aus xD
Für nützliche Tips wäre ich außerordentlich dankbar, die Wahrscheinlichkeiten der mathematischen Struktur in Java-Code umzusetzen. Ich versuchs hier mal weiter...
Danke im Voraus