fonction d'évaluation pour algorithme negaBeta ( puissance 4 )
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:
Code:
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;
} |
et ma foncton scores utilisée dans evaluate est:
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
|
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;
} |
Je tiens à préciser que mes bornes 7 et 6 correspondent respectivement aux colonnes et aux lignes.
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:
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