Bonjour à tous,
J'ai déjà implémenté ce genre d'algorithme en C mais ça remonte à un bail.
Je ne me souvient plus de la forme que doit prendre la fonction d'évaluation...
Pour l'instant mon algo me sert ce genre de résulat {970, 140, 90, 230, 90, 30, 30} pour les sept colonnes, et ce en jouant le premier et au centre.
Bizarre pour une profondeur de 7.
Ma fonction d'évaluation est celle ci:
et ma foncton scores utilisée dans evaluate est:
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 private int evaluate() { int score = 0; for(int i = 0; i < 7;i++) { for(int j = 0; j < 6; j++) { score+=scores(Player.MAKINA, i, j) - scores(Player.FIRST, i, j); } } return score; }
Je tiens à préciser que mes bornes 7 et 6 correspondent respectivement aux colonnes et aux lignes.
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 private int scores(Player p, int i, int j) { int score = 0; if(cases[i][j].isPlayer(p)) { // exemple de la diagonale SUD-OUEST / NORD-EST if(j+1 < 6 && i-1 > -1 && cases[i-1][j+1].isPlayer(p)) { if(j+2 < 6 && i-2 > -1 && cases[i-2][j+2].isPlayer(p)) { if(j+3 < 6 && i-3 > -1 && cases[i-3][j+3].isPlayer(p)) { score+=1000; }else if(j+3 < 6 && i-3 > -1 && cases[i-3][j+3].isPlayer(switchPlayer(p))) { score-=1000; } score+=100; }else if(j+2 < 6 && i-2 > -1 && cases[i-2][j+2].isPlayer(switchPlayer(p))) { score-=100; } score+=10; }else if(j+1 < 6 && i-1 > -1 && cases[i-1][j+1].isPlayer(switchPlayer(p))) { score-=10; } } return score; }
Que Player.MAKINA est le joueur PC et que Player.FIRST est l'humain.
Pour ceux que vois venir me demandant à quoi ressemble ta fonction negaBeta , la voici:
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 private int alphaBeta(int tours, Player player, int alpha, int beta) { if(tours==0 || won()) return evaluate(); else{ for(int i = 0; i < 7; i++) { if(!cases[i][0].isFull()) { int row; for(row = 0;row < 6;row++) { if(cases[i][row].isFull()) break; } row--; player=switchPlayer(player); cases[i][row].setPlayer(player); int val = - alphaBeta(tours - 1, player, -beta, -alpha); cases[i][row].removePlayer(); if(val > alpha) { alpha = val; if(alpha > beta) { return alpha; } } } } return alpha; } }
Merci d'avance pour la foultitude de conseil que vous allez me prodiguer.
à bientôt
Partager