Hallo zusammen
ich wollte den besten Zug für meinen Spiel implementieren und zwar mit Hilfe von monte carlo Algorithmus.
Erst mal stelle ich die "normalen Zug" Methode vor:
Als Parameter soll die Spaltennummer eingegeben werden und die Methode gibt die Position, wo der Stein heruntergefallen wurde.
Die Position hier ist irrelevant, ich brauche es nur für die Oberfläche.
Für den besten Zug sind folgende Methoden:
int randomlyMove(Board b) macht einen zufälligen Spiel und gibt am Ende den Spiel an, der gewonnen hat.
int[] simulateMoves(Board b, int number) simuliert einen Spiel und gibt anhand der Spielsituation, wie viele Gewinne, Verluste und Unentschieden daraus kommt.
Z.b. für einen leeren Spielbrett gibt die Methode das aus.
evaluateMoves(Board b, int number) gibt anhand der Spielsituation an, wie viel Prozent man bei welcher Spalte gewinnen verloren oder unentschieden das Spiel ist.
ich habe auch eine Methode, die die maximalen Zahl aus dieser Listen raussucht und das soll den besten Zug sein.
Mein Problem ist, dass der Algorithmus nicht richtig funktioniert. Der wählt als erstes immer die 7. Spalte oder die 1. Spalte.
Könnte mir jemand helfen?
ich wollte den besten Zug für meinen Spiel implementieren und zwar mit Hilfe von monte carlo Algorithmus.
Erst mal stelle ich die "normalen Zug" Methode vor:
Java:
public int move(int columnNumber) {
assert columnNumber >= 1 && columnNumber <= 7;
assert fourInArow() == 0: "GAME OVER! Player "+-currentPlayer+" is won";
//assert counter < 42 : "grid is full, DRWA!";
pos = columnNumber;
if(memory[columnNumber-1] >= 10) {
grid[memory[columnNumber-1]] = currentPlayer;
idx = memory[columnNumber-1];
moves.add(idx);
memory[columnNumber-1] -= 9;
currentPlayer = -currentPlayer;
counter++;
}
return idx;
}
Die Position hier ist irrelevant, ich brauche es nur für die Oberfläche.
Für den besten Zug sind folgende Methoden:
Code:
int randomlyMove(Board b){
int value = b.fourInArow();
while (value == 0){
List<Integer> moves = b.generatePossibleMoves();
if(moves.size() == 0) return 0;
Random random = new Random();
int randomMove = random.nextInt(7)+1;
b.move(randomMove);
value = b.fourInArow();
}
return value;
}
int[] simulateMoves(Board b, int number) {
assert number >= 1;
int[] count = {0,0,0}; // Verluste, unntschieden, Gewinnne
while (number > 0){
Board a = new Board();
b = new Board(a);
count[randomlyMove(a) + 1] += 1;
number -= 1;
}
return count;
}
List<List<Integer>> evaluateMoves(Board b, int number) {
assert number >= 1;
List<Integer> moves = b.generatePossibleMoves();
List<List<Integer>> values = new ArrayList<>();
for(int move : moves) {
b.move(move);
values.add(Arrays.stream(simulateMoves(b,number)).boxed().toList());
b.undoMove();
}
return values;
}
int[] simulateMoves(Board b, int number) simuliert einen Spiel und gibt anhand der Spielsituation, wie viele Gewinne, Verluste und Unentschieden daraus kommt.
Z.b. für einen leeren Spielbrett gibt die Methode das aus.
Code:
jshell> b.simulateMoves(b,100)
$6 ==> int[3] { 46, 0, 54 }
Code:
jshell> b.evaluateMoves(b,100)
$7 ==> [[51, 1, 48], [46, 0, 54], [42, 0, 58], [36, 0, 64], [45, 1, 54], [50, 1, 49], [34, 1, 65]]
Mein Problem ist, dass der Algorithmus nicht richtig funktioniert. Der wählt als erstes immer die 7. Spalte oder die 1. Spalte.
Könnte mir jemand helfen?