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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }Je viens de passer 7h dessus et suis à cours d'idée, quelqu'un saurait ce qui ne vas pas? Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager