diff --git a/.gitignore b/.gitignore index 4d37d303942b9350be7fb5f2c7b101ad1152cc2a..5a1127b6cd7c8d7afa4d5e803f9816cb94073b53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ a.out obj/* +test.c +stackchess diff --git a/obj/affichage.o b/obj/affichage.o index 3985760b38e53f8f2a5586eabb8f5cc7d47e4510..d523223d8a0a3a5b549648e9929317a67b8c9409 100644 Binary files a/obj/affichage.o and b/obj/affichage.o differ diff --git a/obj/main.o b/obj/main.o index 9a3d11526c522ad45c8a55eb46a92e765dafeb15..982deb19e71fb45fd96ce0099a364ee379963600 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/tableau.o b/obj/tableau.o index 5c5044a14e8f3a001d27defb681abd88e8f6ab97..6656502d35d47551951fdca5d99e6a56502da20d 100644 Binary files a/obj/tableau.o and b/obj/tableau.o differ diff --git a/src/action.c b/src/action.c index 42ab26c60ddd34a70547baf0d9bd14d478c3ef2a..0c1d6a152728f767e32299fcdc6ca70032ddcbc9 100644 --- a/src/action.c +++ b/src/action.c @@ -8,31 +8,28 @@ -void realiser(char action,pile **tableau,int N,char *cases) +void realiser(char action,pile **tableau,int N,char *cases,int *tour) { char sel[4]="\0\0\0\0"; switch (action){ case 'c' : - affichecouleur(tableau,N); - affichepile(cases,tableau,N); - printf("\nEntrez les coordonnées de la case à selectionner >"); + affichage(tableau,N,cases,*tour,"Entrez les coordonnées de la case à selectionner >"); scanf("%3s",sel); if (sel[1] != '\0'){ strcpy(cases,sel); } break; case 'd' : - printf("d"); - char couleur='N'; - deplacement(tableau,N,cases,couleur); + deplacement(tableau,N,cases,tour); break; case 'a' : - printf("\n Voulez vous quitter le jeu (y|n)? \n"); + affichage(tableau,N,cases,*tour,"\n Voulez vous quitter le jeu (y|n)? \n"); char c; scanf("%1s",&c); if (c == 'y'){ - nettoyer(tableau,N); + affichecouleur(tableau,N); printf("\n Vous allez quitter le jeu"); + nettoyer(tableau,N); exit(0); } break; diff --git a/src/action.h b/src/action.h index cc1c9b517a3a3715cfd09a216f48d9896d54a509..d681cb598121b04464596ca577795d040d3baf08 100644 --- a/src/action.h +++ b/src/action.h @@ -4,4 +4,4 @@ * @assign * @ensure fait entrer dans le bon mode (abandon, selection ou déplacement) */ -void realiser(char action,pile **tableau,int N,char *cases); +void realiser(char action,pile **tableau,int N,char *cases,int *tour); diff --git a/src/affichage.c b/src/affichage.c index d3ebf40629ad32f169243b3e80e07e30bfba0438..4a4893a080aef26c3240be227cb9224f0eb1a126 100644 --- a/src/affichage.c +++ b/src/affichage.c @@ -74,16 +74,34 @@ void affichepion(char *pion,char *CASE) void affichepile(char *sel,pile **tableau,int N) { - if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1) - printf("Aucune case n'est sélectionnée."); + if (*sel == '\0') + printf("Aucune case n'est sélectionnée"); else { - printf("%s:\n",sel); - int i=N-strtol(sel+1,NULL,10),j=*sel-'A'; - noeud* tmp=tableau[i][j].sommet; - while (tmp != NULL){ - affichepion(tmp->chaine,NOIR); - tmp=tmp->next; - printf("\n"); + int i,j; + determiner_indices(sel,N,&i,&j); + //printf("(%d,%d)",i,j); + if (i>=N || i<0 || j<0 || j>=N) + printf("Aucune case n'est sélectionnée."); + else { + printf("%s:\n",sel); + noeud* tmp=tableau[i][j].sommet; + while (tmp != NULL){ + affichepion(tmp->chaine,NOIR); + tmp=tmp->next; + printf("\n"); + } } } } + +void affichage(pile **tableau,int N, char *sel,int tour,char *message) +{ + affichecouleur(tableau,N); + affichepile(sel,tableau,N); + if (tour%2 == 0) + printf("\n C'est au tour des Verts."); + else + printf("\n C'est au tour des Rouges."); + printf("\n%s",message); +} + diff --git a/src/affichage.h b/src/affichage.h index 71ddfc771be15f95610bc698c76cb2d2b25b9605..088fe0f9e60fbd2a5b417b561ccf92ad0b575bd4 100644 --- a/src/affichage.h +++ b/src/affichage.h @@ -32,4 +32,10 @@ void affichepion(char *pion,char* CASE); */ void affichepile(char* sel, pile **tableau, int N); +/* + * @require + * @assign + * @ensure combine affichecouleur() et affichepile() + */ +void affichage(pile **tableau,int N,char *sel,int tour,char *message); #endif diff --git a/src/deplacement.c b/src/deplacement.c index c3aab91ecef8021481323fc1e8c1278593662213..0f0c62966207971edc3560a6a0e96aaf973cded6 100644 --- a/src/deplacement.c +++ b/src/deplacement.c @@ -1,14 +1,131 @@ +#include<unistd.h> #include"tableau.h" - +#include"affichage.h" +#include"deplacement.h" /*deplacement.c*/ -void deplacement(pile **tableau, int N, char *sel, char couleur) +void deplacement(pile **tableau, int N, char *sel, int *tour) +{ + if (*sel != '\0'){ + int i,j; + determiner_indices(sel,N,&i,&j); + if (i>=N || i<0 || j>=N || j<0) + printf("\nCase sélectionnée hors du tableau."); + else if (sommet(tableau[i][j])[1] == "BN"[*tour%2]){ + affichage(tableau,N,sel,*tour,"Combien de pions à déplacer >"); + int nb=nb_a_selectionner(tableau,i,j,tour); + if (nb>0){ + int i_dest,j_dest; + affichage(tableau,N,sel,*tour,"Entrez les coordonnées de la case de destination>"); + case_destination(tableau,N,i,j,&i_dest,&j_dest,nb,tour); + } + } else + printf("\nDéplacement non autorisé"); + char c; + printf("\n"); + //scanf("%1s",&c); + read(0,&c,1);//attend la touche entrer + } +} + + +int nb_a_selectionner(pile **tableau,int i,int j,int *tour) { - int i=N-strtol(sel+1,NULL,10),j=*sel-'A'; - if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1) - printf("Aucune case n'est sélectionnée."); - else { + int nb; + scanf("%d",&nb); + if (nb<=nb_de_pion(tableau[i][j],"BN"[*tour%2]) && nb>0) + return nb; + else + printf("\nVous n'avez pas rentré un nombre valide."); + return 0; +} +void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int *j_dest,int nb,int *tour) +{ + char dest[4]="\0\0\0\0"; + 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){ + noeud* tmp=tableau[i_src][j_src].sommet; + int valide,i; + for (i=0 ; i<nb ; i++){ + switch (tmp->chaine[0]){ + case 'P' : + valide=pions(i_src,j_src,*i_dest,*j_dest); + break; + case 'R' : + valide=roi(i_src,j_src,*i_dest,*j_dest); + break; + case 'D' : + valide=dames(i_src,j_src,*i_dest,*j_dest); + break; + case 'T' : + valide=tours(i_src,j_src,*i_dest,*j_dest); + case 'F' : + valide=fous(i_src,j_src,*i_dest,*j_dest); + case 'C' : + valide=cavaliers(i_src,j_src,*i_dest,*j_dest); + default : + valide=0; + } + if (! valide) + break; + tmp=tmp->next; + } + if (valide){ + effectuer(tableau,i_src,j_src,*i_dest,*j_dest,nb); + *tour=*tour+1; + } else { + printf("Déplacement illégal pour au moins un pion de la pile"); + } + } } } +int pions(int i_src,int j_src,int i_dest,int j_dest) +{ + return 0; +} + +int dames(int i_src,int j_src,int i_dest,int j_dest) +{ + return 0; +} + +int roi(int i_src,int j_src,int i_dest,int j_dest) +{ + if (i_dest==i_src) + if (j_dest==j_src-1 || j_dest==j_src+1) + return 1; + if (i_dest==i_src+1 || i_dest==i_src-1) + if (j_dest==j_src+1 || j_dest==j_src || j_dest==j_src-1) + return 1; + return 0; +} +int tours(int i_src,int j_src,int i_dest,int j_dest) +{ + return 0; +} + +int fous(int i_src,int j_src,int i_dest, int j_dest) +{ + return 0; +} + +int cavaliers(int i_src,int j_src,int i_dest,int j_dest) +{ + return 0; +} + +void effectuer(pile **tableau,int i_src,int j_src, int i_dest,int j_dest,int nb) +{ + pile p; + int i; + for (i=0 ; i<nb ; i++){ + empiler(&p,depiler(tableau[i_src]+j_src)); + } + for (i=0 ; i<nb ; i++){ + empiler(tableau[i_dest]+j_dest,depiler(&p)); + } +} diff --git a/src/deplacement.h b/src/deplacement.h index 0b45be1747bcb2791dc3941191903862b2ce263e..1d8032cf5c71fed9ab664fe727fe03d099f98e8e 100644 --- a/src/deplacement.h +++ b/src/deplacement.h @@ -8,8 +8,68 @@ /* * @require * @assign - * @ensure détermine si le déplacement est légal ou pas + * @ensure détermine si le déplacement est légal ou pas et l'effectue si c'est le cas */ -void deplacement(pile **tableau,int N, char *cases, char couleur); +void deplacement(pile **tableau,int N, char *sel, int *tour); +/* + * @require + * @assign + * @ensure verifie si le nombre de pièce à deplacer de la case selectionnées est valide + */ +int nb_a_selectionner(pile **tableau,int i,int j,int *tour); + +/*@require + * @assign + * @ensure : verifie si les coordonnées de la case destination est valide pour toutes les pièces à déplacer + */ +void case_destination(pile **tableau,int N,int i_src,int j_src,int *i_dest,int *j_dest,int nb,int *tour); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour un pion + */ +int pions(int i_src,int j_src,int i_dest,int j_dest); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour un roi + */ +int roi(int i_src,int j_src,int i_dest,int j_dest); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour une dame + */ +int dames(int i_src,int j_src,int i_dest,int j_dest); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour une tour + */ +int tours(int i_src,int j_src,int i_dest,int j_dest); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour un fou + */ +int fous(int i_src,int j_src,int i_dest,int j_dest); + +/* + * @require + * @assign + * @ensure : verifie que le déplacement est valide pour un cavalier + */ +int cavaliers(int i_src,int j_src,int i_dest,int j_dest); +/* + * @require + * @assign + * @ensure : effectue le déplacement d'une pile de pion d'une case vers une autre + */ +void effectuer(pile **tableau,int i_src, int j_src,int i_dest, int j_dest,int nb); #endif diff --git a/src/main.c b/src/main.c index d1186ecec125df029d887e49120d596cdb1f1053..248cf5218519fa0d3b1b4902f03ebf4e46b5fcc5 100644 --- a/src/main.c +++ b/src/main.c @@ -13,13 +13,12 @@ int main(int argc, char **argv) pile **tableau=initialisation(N); debut_partie(tableau,N); char action; + int tour=0; char sel[4]="\0\0\0\0"; while (1){ - affichecouleur(tableau,N); - affichepile(sel,tableau,N); - printf("\n Entrez une action (c,d,a) >"); + affichage(tableau,N,sel,tour,"Entrez une action (c,d,a) >"); scanf("%c",&action); - realiser(action,tableau,N,sel); + realiser(action,tableau,N,sel,&tour); } nettoyer(tableau,N); return 0; diff --git a/src/tableau.c b/src/tableau.c index aea1a69f0679ca4cd77e92802120e1557b0530d4..a7eef0b870443b5c73f0595661a588d8315bf8c5 100644 --- a/src/tableau.c +++ b/src/tableau.c @@ -54,6 +54,7 @@ char *depiler(pile *p) void reset(pile *p) { while (p->sommet) + /*termine lorsque p n'a plus de sommet à dépiler (car p est de longueur finie)*/ depiler(p); } @@ -96,6 +97,26 @@ int longueur_pile(pile p) int i=0; noeud* tmp=p.sommet; while (tmp != NULL){ + /*termine quand on arrive au bout de la pile qui est de longueur finie*/ + i++; + tmp=tmp->next; + } + return i; +} + + +void determiner_indices(char *sel,int N,int *i,int *j) +{ + *j=*sel-'A'; + *i=N-strtol(sel+1,NULL,10); +} + +int nb_de_pion(pile p,char couleur) +{ + int i=0; + noeud* tmp=p.sommet; + while (tmp != NULL && tmp->chaine[1] == couleur){ + /*termine car la pile est de longueur finie*/ i++; tmp=tmp->next; } diff --git a/src/tableau.h b/src/tableau.h index 94a849babb90255d8d4da03651241f390f612f2a..1a642d9e67beddd2c583194cb6fd01b29bf237ee 100644 --- a/src/tableau.h +++ b/src/tableau.h @@ -81,4 +81,18 @@ void debut_partie(pile **tableau,int N); */ int longueur_pile(pile p); +/* + * @require + * @assign + * @ensure retourne une tuple contenant les indices de la case selectionnée à partir des coordonnées rentrées à la main + */ +void determiner_indices(char *sel,int N,int *i,int *j); + +/* + * @require + * @assign + * @ensure retourne le nombre de pion d'une couleur donnée placés sur le haut de la pile/case + */ +int nb_de_pion(pile p,char couleur); #endif + diff --git a/stackchess b/stackchess index 0558c9da4e095c2bca2164b4e393676d85322182..5eb5f7af7d3eff31cbd80af2700864647edf4edd 100755 Binary files a/stackchess and b/stackchess differ