diff --git a/Makefile b/Makefile index f12413b7babbc607f31f8b022061fce84965c666..fc9e6f9ec86610c5a4e52ec07e3fe82f9cb7d24b 100644 --- a/Makefile +++ b/Makefile @@ -30,4 +30,4 @@ stackchess32.exe : main32.o tableau32.o affichage32.o action32.o deplacement32. cd obj && $(WIN32) $(CFLAGS) $^ -o ../build/$@ stackchess64.exe : main64.o tableau64.o affichage64.o action64.o deplacement64.o - cd obj && $(WIN64) $(CFLAGS)$^ -o ../build/$@ \ No newline at end of file + cd obj && $(WIN64) $(CFLAGS) $^ -o ../build/$@ \ No newline at end of file diff --git a/build/stackchess32.exe b/build/stackchess32.exe new file mode 100755 index 0000000000000000000000000000000000000000..e24c7b73002cfbebfc9aae4cf6c428f50e527d33 Binary files /dev/null and b/build/stackchess32.exe differ diff --git a/build/stackchess64.exe b/build/stackchess64.exe new file mode 100755 index 0000000000000000000000000000000000000000..4fdb453c5d01d6f2104e8340546aae56aa23e60d Binary files /dev/null and b/build/stackchess64.exe differ diff --git a/obj/affichage.o b/obj/affichage.o index 43f031287aee45fca6cab0f46347031313b4d86d..4fa5a7f21021d8e68665c675ceef988810e6831c 100644 Binary files a/obj/affichage.o and b/obj/affichage.o differ diff --git a/obj/tableau.o b/obj/tableau.o index 9dea15b060e0c76b8877c7f9c61179e67598b2ac..eded87a0f13d578fa55a07915528ed4f9aaa9f33 100644 Binary files a/obj/tableau.o and b/obj/tableau.o differ diff --git a/src/action.c b/src/action.c index e81d3ae1482fdd1365a6be5c9f87e13eb2170578..4f5ce5b1838925ec3d3de9b85e0d40c045e69e1a 100644 --- a/src/action.c +++ b/src/action.c @@ -29,7 +29,7 @@ void realiser(char action,pile **tableau,int N,char *cases,int *tour) scanf("%1s",&c); if (c == 'y'){ printf("\n Vous allez quitter le jeu"); - printf("La partie est finie\n les %c ont gagné !","BN"[*tour%2+1]); + printf("La partie est finie\n les %c ont gagné !","BN"[(*tour+1)%2]); nettoyer(tableau,N); exit(0); } diff --git a/src/affichage.c b/src/affichage.c index 023f94bf8d473cdd3caa9a6a5e69dad952174c5c..b4d4bd9872f6653f8f37e7fed8c976d1a7a4a47b 100644 --- a/src/affichage.c +++ b/src/affichage.c @@ -83,8 +83,8 @@ void affichage(pile **tableau,int N, char *sel,int tour,char *message) { affichetableau_pile_cote(tableau,N,sel); if (tour%2 == 0) - printf("\n [\x1B[1;5;32m%sGRIS" RESET "] %s",NOIR,message); + printf("\n [\x1B[1;5;32m%sBLANCS" RESET "] %s",NOIR,message); else - printf("\n [\x1B[1;5;31m%sROUGES" RESET "] %s",NOIR,message); + printf("\n [\x1B[1;5;31m%sNOIRS" RESET "] %s",NOIR,message); } diff --git a/src/deplacement.c b/src/deplacement.c index 245691d64aeeb92e364a823fcc2e1c1e50407d9a..f5ba5a3d87bd6d548b5bdada0dfd546c4be351ca 100644 --- a/src/deplacement.c +++ b/src/deplacement.c @@ -47,9 +47,10 @@ void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int scanf("%3s",dest); if (dest[1] != '\0'){ determiner_indices(dest,N,i_dest,j_dest); - if (*i_dest>=0 && *i_dest<N && *j_dest>=0 && *j_dest<N && nb>nb_de_pion(tableau[*i_dest][*j_dest],"BN"[*tour%2+1])){ + if (*i_dest>=0 && *i_dest<N && *j_dest>=0 && *j_dest<N && nb>nb_de_pion(tableau[*i_dest][*j_dest],"BN"[(*tour+1)%2])){ noeud* tmp=tableau[i_src][j_src].sommet; int valide,i; + for (i=0 ; i<nb ; i++){ switch (tmp->chaine[0]){ case 'P' : @@ -77,6 +78,9 @@ void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int break; tmp=tmp->next; } + if (nb_de_cavaliers(tableau[i_src][j_src],"BN"[*tour%2],nb)*2>=nb){ + valide=cavaliers(tableau,i_src,j_src,*i_dest,*j_dest); + } if (valide){ effectuer(tableau,N,i_src,j_src,*i_dest,*j_dest,nb,*tour); *tour=*tour+1; @@ -85,7 +89,7 @@ void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int } } else if (*i_dest>=0 && *i_dest<N && *j_dest>=0) { printf("Coordonnées invalides pour la case de destination"); - } else if (*j_dest<N && nb>nb_de_pion(tableau[*i_dest][*j_dest],"BN"[*tour%2+1])){ + } else if (*j_dest<N && nb>nb_de_pion(tableau[*i_dest][*j_dest],"BN"[(*tour+1)%2])){ printf("Le nombre de pions à déplacer doit être strictement plus grand que le nombre de pions adverses sur la case de destination"); } } @@ -99,7 +103,7 @@ int pions(pile **tableau,int N,int i_src,int j_src,int i_dest,int j_dest,int tou } else { k=-1; } - if (nb_de_pion(tableau[i_dest][j_dest],"BN"[tour%2+1])==0 && j_dest==j_src){ + if (nb_de_pion(tableau[i_dest][j_dest],"BN"[(tour+1)%2])==0 && j_dest==j_src){ if (i_dest==i_src+k) return 1; if (i_dest==i_src+k+k && longueur_pile(tableau[i_src+k][j_src])==0){ @@ -226,11 +230,13 @@ void effectuer(pile **tableau,int N,int i_src,int j_src, int i_dest,int j_dest,i for (i=0 ; i<nb ; i++){ empiler(&p,depiler(tableau[i_src]+j_src)); } - if (sommet(tableau[i_dest][j_dest])[0]=="BN"[tour%2+1]) + if (sommet(tableau[i_dest][j_dest])[0]=="BN"[(tour+1)%2]) + //réalise une attaque reset(tableau[i_dest]+j_dest); for (i=0 ; i<nb ; i++){ empiler(tableau[i_dest]+j_dest,depiler(&p)); if (sommet(tableau[i_dest][j_dest])[0]=='P' && (i_dest==N-1 || i_dest==0)) { + //transforme les pions en dames depiler(tableau[i_dest]+j_dest); if (tour%2==0) empiler(tableau[i_dest]+j_dest,"DB"); else empiler(tableau[i_dest]+j_dest,"DN"); diff --git a/src/tableau.c b/src/tableau.c index eac028232b48ce06b1235ba3e172bfdddf828d1c..4bef19a06c748c15054c6a133097b58075dee404 100644 --- a/src/tableau.c +++ b/src/tableau.c @@ -116,23 +116,68 @@ int nb_de_pion(pile p,char couleur) { int i=0; noeud* tmp=p.sommet; - while (tmp != NULL && tmp->chaine[1] == couleur){ + while (tmp != NULL){ /*termine car la pile est de longueur finie*/ - i++; + if (tmp->chaine[1]==couleur) i++; tmp=tmp->next; } return i; } +int nb_de_cavaliers(pile p,char couleur,int nb) +{ + int i,k=0; + for (i=0 ; i<nb ; i++){ + if (p.sommet->chaine[0] == 'C' && p.sommet->chaine[1]==couleur) k++; + p.sommet=p.sommet->next; + } + return k; +} + int partie_finie(pile ** tableau,int N,int tour) { - int i,j,k=0; - for (i=0 ; i<N ; i++) - for (j=0; j<N ; j++) - if (nb_de_pion(tableau[i][j],"BN"[tour%2+1])==0) k++; - if (k==2*N){ - printf("La partie est finie\n les %c ont gagné !","BN"[tour%2]); + tour=tour-1; + int i,j,k=0,l=0,toursb=0,toursn=0,fousb=0,fousn=0; + for (i=0 ; i<N ; i++){ + for (j=0; j<N ; j++){ + k=k+nb_de_pion(tableau[i][j],"BN"[(tour+1)%2]); + l=l+nb_de_pion(tableau[i][j],"BN"[tour%2]); + } + } + + if (k==0){ + /*le cas où on a pris toutes les pièces de l'adversaire*/ + printf("La partie est finie\n les %c ont gagné !\n","BN"[tour%2]); + return 1; + + } else if (k+l==2){ + /*le cas où il ne reste que 2 pièces sur le plateau*/ + printf("On a un cas d'égalité !"); return 1; } + noeud* tmp; + if (k+l==4){ + /*le cas il reste à chacun un fou et une tour*/ + for (i=0 ; i<N ; i++){ + for (j=0 ; j<N ; j++){ + tmp=tableau[i][j].sommet; + while (tmp != NULL){ + if (tmp->chaine[0]=='T'){ + if (tmp->chaine[1]=='B') toursb+=1; + else toursn+=1; + } + if (tmp->chaine[0]=='F'){ + if (tmp->chaine[1]=='B') fousb+=1; + else fousn+=1; + } + tmp=tmp->next; + } + } + } + if (toursb==1 && toursn==1 && fousb==1 && fousn==1){ + printf("On a un cas d'égalité !"); + return 1; + } + } return 0; } \ No newline at end of file diff --git a/src/tableau.h b/src/tableau.h index 85993603595529c7573f9a9361df1aac124ed741..e2c0c965b85abe7e404b7f357544cf9e99cb4925 100644 --- a/src/tableau.h +++ b/src/tableau.h @@ -95,6 +95,13 @@ void determiner_indices(char *sel,int N,int *i,int *j); */ int nb_de_pion(pile p,char couleur); +/* + * @require + * @assign + * @ensure retourne le nombre de cavalier d'une couleur donnée dans la pile + */ +int nb_de_cavaliers(pile p,char couleur,int nb); + /* * @require * @assign