Minimax pour tic Tac Toe en java
Bonjour, j'ai implémenté un Algo minimax pour une AI imbattable sauf que quelque à un moment donné, l'AI fait un choix qui lui fait potentiellement perdre la partie. voici mon code et un résultat face à un jour humain ( AI: X, humain: O):
La board: 3 x 3 grid.
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| private static List<String> minMax(Board board, int depth , String player){
String bestX = "";
String bestY = "";
List<String> l = new ArrayList<>();
Board b = board.deepClone();
if(b._stack.isEmpty()){
l.add(getresult(b)+"");
l.add(1+"");
l.add(1+"");
return l;
}
if ( depth == 0 || b.is_game_over() ){
l.add(getresult(b)+"");
List <String> k = (List<String>) b._stack.getLast();
l.add(k.get(1));
l.add(k.get(2));
b.pop();
return l;
}
if (b._nextPlayer == player){
int maxEval = Integer.MIN_VALUE;
for (int i = 0; i < b.legal_moves().size(); i++) {
try {
b.push(b.legal_moves().get(i));
List <String> eval = minMax(b, depth-1, b._nextPlayer);
if(maxEval < Integer.parseInt(eval.get(0))){
maxEval = Integer.parseInt(eval.get(0));
bestX = eval.get(1);
bestY = eval.get(2);
}
}catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
}
l.add(maxEval+"");
l.add(bestX);
l.add(bestY);
return l;
}
else{
int minEval = Integer.MAX_VALUE;
for (int i = 0; i < b.legal_moves().size(); i++) {
try {
b.push(b.legal_moves().get(i));
List<String> eval = minMax(b, depth - 1, b._nextPlayer);
if(minEval > Integer.parseInt(eval.get(0))){
minEval = Integer.parseInt(eval.get(0));
bestX = eval.get(1);
bestY = eval.get(2);
}
}catch (IndexOutOfBoundsException e){
e.printStackTrace();
}
}
l.add(minEval+"");
l.add(bestX);
l.add(bestY);
return l;
}
} |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
----------
. . .
. . .
. . .
Next player: X
----------
. . .
. X .
. . .
Next player: O
choose a move (format: x y)
0 2
this is minimax value for this board = [-1, 2, 2]
----------
. . O
. X .
. . .
Next player: X
----------
. . O
. X .
. . X
Next player: O
choose a move (format: x y)
0 0
this is minimax value for this board = [-1, 2, 0]
----------
O . O
. X .
. . X
Next player: X
----------
O . O
. X .
X . X
Next player: O
choose a move (format: x y)
0 1
this is minimax value for this board = [-1, 0, 1]
----------
O O O
. X .
X . X
Next player: X
Victory of O
After the match, every move is undone (thanks to pop()): we get back to the initial board :
. . .
. . .
. . .
Next player: O
Process finished with exit code 0 |
Je viens de passer 7h dessus et suis à cours d'idée, quelqu'un saurait ce qui ne vas pas? Merci d'avance.