Für meine Viergewinnt Ki benutze ich folgende Bewertungsfunktion:
Bei allen möglichen 4 er Reihen (parallel ,waagerecht, diagonal)werden X(Spieler 1) und O(Spieler2) gezählt.
- 4 mal X und 0 mal O gibt einen Wert von -1000
- 3 mal X und 0 mal O gibt einen Wert von -50
- 2 mal X und 0 mal O gibt einen Wert von -10
- 1 mal X und 0 mal O gibt einen Wert von -1
und umgekehrt für Spieler O.
Nur werden so manchmal eindeutige(einzügige) Gewinnmöglichkeiten nicht genutzt oder gegnerische Gewinn wird nicht verhindert. Weiß wer woran das liegt?
Danke im Vorraus.
Bei allen möglichen 4 er Reihen (parallel ,waagerecht, diagonal)werden X(Spieler 1) und O(Spieler2) gezählt.
- 4 mal X und 0 mal O gibt einen Wert von -1000
- 3 mal X und 0 mal O gibt einen Wert von -50
- 2 mal X und 0 mal O gibt einen Wert von -10
- 1 mal X und 0 mal O gibt einen Wert von -1
und umgekehrt für Spieler O.
Nur werden so manchmal eindeutige(einzügige) Gewinnmöglichkeiten nicht genutzt oder gegnerische Gewinn wird nicht verhindert. Weiß wer woran das liegt?
Java:
/*
Zählt Xs und Os in einer 4er Reihe
*/
private int evaluateSegment(int[] s) {
int countX = 0, countO = 0;
for(int i = 0; i < s.length; i++) {
if(s[i] == playerX) countX++;
if(s[i] == playerO) countO++;
}
if(countX == 0) {
if(countO == 4) return -1000;
if(countO == 3) return -50;
if(countO == 2) return -10;
if(countO == 1) return -1;
}
if(countO == 0) {
if(countX == 4) return 1000;
if(countX == 3) return 50;
if(countX == 2) return 10;
if(countX == 1) return 1;
}
return 0;
}
/*
Von jedem Feld werden alle von dort ausgehenden Reihen bewertet.
*/
private int evaluate(int board[][], int row, int col) {
int rows = board.length;
int cols = board[0].length;
int score = 0;
/// rechts, links , hoch, runter
if(col >= cols - 4) {
score += evaluateSegment(new int[] {board[row][col], board[row][col-1], board[row][col-2], board[row][col-3]});
}
if(col <= cols - 4) {
score += evaluateSegment(new int[] {board[row][col], board[row][col+1], board[row][col+2], board[row][col+3]});
}
if(row <= rows - 4) {
score += evaluateSegment(new int[] {board[row][col], board[row+1][col], board[row+2][col], board[row+3][col]});
}
if(row >= rows - 3) {
score += evaluateSegment(new int[] {board[row][col], board[row-1][col], board[row-2][col], board[row-3][col]});
}
// diagonal
if(col >= cols - 4 && row >= rows - 3) {
score += evaluateSegment(new int[]{board[row][col], board[row-1][col-1], board[row-2][col-2], board[row-3][col-3]});
}
if(col <= cols - 4 && row <= rows - 4) {
score += evaluateSegment(new int[]{board[row][col], board[row+1][col+1], board[row+2][col+2], board[row+3][col+3]});
}
if(col <= cols - 4 && row >= rows - 3) {
score += evaluateSegment(new int[]{board[row][col], board[row-1][col+1], board[row-2][col+2], board[row-3][col+3]});
}
if(col >= cols - 4 && row <= rows - 4) {
score += evaluateSegment(new int[]{board[row][col], board[row+1][col-1], board[row+2][col-2], board[row+3][col-3]});
}
return score;
}
private int evaluate(int board[][]) {
int score = 0;
for(int r = 0; r < board.length; r++) {
for(int c = 0; c < board[r].length; c++) {
score += evaluate(board, r, c);
}
}
return score;
}