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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
double eval=val;
int matosW=0,matosB=0;
for (int i=9; i>=0; i--)
for (int j=4; j>=0; j--) {
if (damier[5*i+j]>0) matosW++;
else if (damier[5*i+j]<0) matosB++;
}
// recherche de pions isoles "loins" sur colonnes a horizon occupe (heuristique qui semble OK)
// (poids plus faible des que le materiel est trop reduit)
/* --> evite les bourdes du genre pion trop avance perdu */
int isolW=0,isolB=0;
for (int i=4; i>=0; i--) {
for (int j=7; j>=4; j--)
if (damier[j*5+i]==VP)
if (j&1) // rangee paire
if (i!=0)
if (damier[j*5+i+5]==0 && damier[j*5+i+6]==0 && damier[j*5+i-5]==0 && damier[j*5+i-4]==0)
for (int k=j+1; k<=9; k++)
if (damier[5*j+i]<0) {
isolW++;
break;
}
else
if (i!=4)
if (damier[j*5+i+4]==0 && damier[j*5+i+5]==0 && damier[j*5+i-6]==0 && damier[j*5+i-5]==0)
for (int k=j+1; k<=9; k++)
if (damier[5*j+i]<0) {
isolW++;
break;
}
for (int j=5; j>=2; j--)
if (damier[j*5+i]==-VP)
if (j&1) // rangee paire
if (i!=0)
if (damier[j*5+i+5]==0 && damier[j*5+i+6]==0 && damier[j*5+i-5]==0 && damier[j*5+i-4]==0)
for (int k=j-1; k>=0; k--)
if (damier[5*j+i]>0) {
isolB++;
break;
}
else
if (i!=4)
if (damier[j*5+i+4]==0 && damier[j*5+i+5]==0 && damier[j*5+i-6]==0 && damier[j*5+i-5]==0)
for (int k=j-1; k>=0; k--)
if (damier[5*j+i]>0) {
isolB++;
break;
}
}
eval-=(double)(isolW*matosW-isolB*matosB)/80;
// test de l'équilibre/harmonie global(e) du damier
// on compte le nombre de pions sur chaque colonne:
// malus s'ils sont très !=
// utilisé en fonction de l'avancement de la partie
// ATTENTION: a desactiver (ou inverser) si on veut une partie de flanc, ou centrale
/* --> permet de garder un jeu homogene */
/* int nbColW[5]={0,0,0,0,0};
int nbColB[5]={0,0,0,0,0};
int sommeW=0,sommeB=0;
for (int i=4; i>=0; i--)
for (int j=9; j>=0; j--)
if (damier[i+j*5]>0) {
nbColW[i]++;
sommeW++;
}
else if (damier[i+j*5]<0) {
nbColB[i]++;
sommeB++;
}
// calcul des variances
int varW=0,varB=0;
for (int i=4; i>=0; i--) {
varW+=(sommeW-nbColW[i])*(sommeW-nbColW[i]);
varB+=(sommeB-nbColB[i])*(sommeB-nbColB[i]);
}
eval-=(varW*matosW-varB*matosB);///70; */
// recherche des colonnes vides
/* --> evite tout simplement que l'adversaire fasse dame trop vite */
bool colVidW[5]={true,true,true,true,true};
bool colVidB[5]={true,true,true,true,true};
for (int i=4; i>=0; i--)
for (int j=9; j>=0; j--)
if (damier[j*5+i]>0) {
colVidW[i]=false;
break;
}
else if (damier[j*5+i]<0) {
colVidW[i]=false;
break;
}
for (int i=4; i>=0; i--) {
if (colVidW[i]) eval-=40;//4;
if (colVidB[i]) eval+=40;//4;
}
// on donne plus de poids aux pion avances sur les bords
/* --> conserve des avant-postes avantageux */
int avanceW=0,avanceB=0;
if (damier[40]==VP) avanceW+=2;
if (damier[39]==VP) avanceW++;
if (damier[30]==VP) avanceW++;
if (damier[29]==VP) avanceW++;
if (damier[20]==-VP) avanceB++;
if (damier[19]==-VP) avanceB++;
if (damier[10]==-VP) avanceB++;
if (damier[9]==-VP) avanceB+=2;
eval+=(double)(avanceW*matosW-avanceB*matosB)/80;
// comptage des degrés de liberté selon l'avancement de la partie
/* --> evite de se mettre en zugzwang */
int degLibW=0,degLibB=0;
int auxW,auxB;
for (int i=9; i>=0; i--) {
auxW=0; auxB=0;
for (int j=4; j>=0; j--)
if (damier[i*5+j]>0) auxW++;
else if (damier[i*5+j]<0) auxB++;
degLibW+=(i+1)*auxW;
degLibB+=(10-i)*auxB;
}
eval+=(double)((20-(int)partie.size())*(degLibW-degLibB))/50; // "20" est sensé etre le nb de demi-coups à mi-partie..
// le critere suivant est pris en compte que s'il n'y a pas de dames avec une partie pas trop avancee
if (matosW<=10 || matosB<=10 || (int)partie.size()>40) return eval;
for (int i=9; i>=0; i--)
for (int j=4; j>=0; j--)
if (damier[i*5+j]==VD || damier[i*5+j]==-VD) return eval;
// recherche des mauvaises configurations en V ou deux pions adverses forment une pente du V
// surtout utilise en debut/milieu de partie
/* --> permet d'eviter certaines recaptures dans de mauvaises conditions */
int nbConfW=0,nbConfB=0;
for (int i=6; i>=3; i--)
for (int j=3; j>=1; j--)
if (i&1) // toujours la distinction rangee paire/impaire
if ((damier[i*5+j]>0 && damier[i*5+j+5]<0 && damier[i*5+j-1]<0) ||
(damier[i*5+j]>0 && damier[i*5+j+6]<0 && damier[i*5+j+1]<0)) nbConfW++;
else if ((damier[i*5+j]<0 && damier[i*5+j-5]>0 && damier[i*5+j-1]>0) ||
(damier[i*5+j]<0 && damier[i*5+j-4]>0 && damier[i*5+j+1]>0)) nbConfB++;
else
if ((damier[i*5+j]>0 && damier[i*5+j+4]<0 && damier[i*5+j-1]<0) ||
(damier[i*5+j]>0 && damier[i*5+j+5]<0 && damier[i*5+j+1]<0)) nbConfW++;
else if ((damier[i*5+j]<0 && damier[i*5+j-6]>0 && damier[i*5+j-1]>0) ||
(damier[i*5+j]<0 && damier[i*5+j-5]>0 && damier[i*5+j+1]>0)) nbConfB++;
eval-=(float)(nbConfW*matosB-nbConfB*matosW)/80; |
Partager