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
| int jouer_coup(int x)
{
bool echec = FAUX;
COUP c;
int xc = OPP(side);
printf("jouer coup %d \n",x);
c = pile_coups[x];
printf("jouer coup\n");
//----------------------------------------------------------------------------------------------------------------
// sauvegarde des données du coup précédent
coups[nb_coups].t = c; //index
coups[nb_coups].statut = coup_biblio; //coup biblio ou non
coups[nb_coups].cap = echiquier[c.arr]; //case départ "from"
coups[nb_coups].coul = couleur[c.arr]; //case arrivée "to"
coups[nb_coups].hashcode = hash; //hashcodes sauvegardés pour three fold repetition
coups[nb_coups].regle_50 = cinquante; //val 50 coups sauvegardées
coups[nb_coups].enpassant = ep; //case prise en passant sauvée
//----------------------------------------------------------------------------------------------------------------
// mise a jour si c'est un roi qui bouge
if((int)c.piece_jouee == ROI)
{
pos_roi[side] = (int)c.arr;
//droit_OO[side] = REFUSE;
//droit_OOO[side]= REFUSE;
}
//----------------------------------------------------------------------------------------------------------------
// on vide la case depart
vider((int)c.dep,echiquier[(int)c.dep],side);
//----------------------------------------------------------------------------------------------------------------
// on vide la case arrivee si occupée
//if(echiquier[(int)c.arr] != VIDE)
vider((int)c.arr,echiquier[(int)c.arr],xc);
//----------------------------------------------------------------------------------------------------------------
// occuper la case arrivee
if((int)c.piece_promue != 0)
occuper((int)c.arr,(int)c.piece_promue,side);
else
occuper((int)c.arr,(int)c.piece_jouee,side);
//----------------------------------------------------------------------------------------------------------------
// si petit roque?
if((int)c.type == PETIT_ROQUE)
{
if(side == BLANC)
{
vider(H1,TOUR,BLANC);
occuper(F1,TOUR,BLANC);
hash ^= hash_petit_roque[BLANC];
}
else
{
vider(H8,TOUR,NOIR);
occuper(F8,TOUR,NOIR);
hash ^= hash_petit_roque[NOIR];
}
}
//----------------------------------------------------------------------------------------------------------------
// si grand roque?
if((int)c.type == GRAND_ROQUE)
{
if(side == BLANC)
{
vider(A1,TOUR,BLANC);
occuper(D1,TOUR,BLANC);
hash ^= hash_grand_roque[BLANC];
}
else
{
vider(A8,TOUR,NOIR);
occuper(D8,TOUR,NOIR);
hash ^= hash_grand_roque[NOIR];
}
}
//----------------------------------------------------------------------------------------------------------------
// en passant ?
if((int)c.type == EN_PASSANT)
{
vider((int)c.pion_ep,PION,xc);
hash ^= hash_ep[(int)c.ep];
}
//----------------------------------------------------------------------------------------------------------------
// mise a jour regle des 50 coups
if((c.piece_jouee != PION) && (c.type != PRISE) && (c.type != EN_PASSANT))
cinquante++;
else
cinquante = 0;
//----------------------------------------------------------------------------------------------------------------
// incrément profondeur et nombre de coups joués
prof++;
nb_coups++;
//----------------------------------------------------------------------------------------------------------------
// mise a jour case prise en passant
ep = c.ep;
//----------------------------------------------------------------------------------------------------------------
// teste la légalité du coup
echec = atak(side,pos_roi[side]);
//----------------------------------------------------------------------------------------------------------------
// changement de la couleur qui joue
hash ^= hash_couleur[side];
side = OPP(side);
//----------------------------------------------------------------------------------------------------------------
// retourne la valeur echec (VRAI?coup illégal , FAUX? coup légal
return echec;
} |
Partager