Skip to content
Extraits de code Groupes Projets
Valider 53f7a059 rédigé par Loïc DUBARD's avatar Loïc DUBARD :speech_balloon:
Parcourir les fichiers

enfin le deplacement des pièces

parent b4686a0f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
a.out a.out
obj/* obj/*
test.c
stackchess
Aucun aperçu pour ce type de fichier
Aucun aperçu pour ce type de fichier
Aucun aperçu pour ce type de fichier
...@@ -8,31 +8,28 @@ ...@@ -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"; char sel[4]="\0\0\0\0";
switch (action){ switch (action){
case 'c' : case 'c' :
affichecouleur(tableau,N); affichage(tableau,N,cases,*tour,"Entrez les coordonnées de la case à selectionner >");
affichepile(cases,tableau,N);
printf("\nEntrez les coordonnées de la case à selectionner >");
scanf("%3s",sel); scanf("%3s",sel);
if (sel[1] != '\0'){ if (sel[1] != '\0'){
strcpy(cases,sel); strcpy(cases,sel);
} }
break; break;
case 'd' : case 'd' :
printf("d"); deplacement(tableau,N,cases,tour);
char couleur='N';
deplacement(tableau,N,cases,couleur);
break; break;
case 'a' : 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; char c;
scanf("%1s",&c); scanf("%1s",&c);
if (c == 'y'){ if (c == 'y'){
nettoyer(tableau,N); affichecouleur(tableau,N);
printf("\n Vous allez quitter le jeu"); printf("\n Vous allez quitter le jeu");
nettoyer(tableau,N);
exit(0); exit(0);
} }
break; break;
......
...@@ -4,4 +4,4 @@ ...@@ -4,4 +4,4 @@
* @assign * @assign
* @ensure fait entrer dans le bon mode (abandon, selection ou déplacement) * @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);
...@@ -74,16 +74,34 @@ void affichepion(char *pion,char *CASE) ...@@ -74,16 +74,34 @@ void affichepion(char *pion,char *CASE)
void affichepile(char *sel,pile **tableau,int N) void affichepile(char *sel,pile **tableau,int N)
{ {
if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1) if (*sel == '\0')
printf("Aucune case n'est sélectionnée."); printf("Aucune case n'est sélectionnée");
else { else {
printf("%s:\n",sel); int i,j;
int i=N-strtol(sel+1,NULL,10),j=*sel-'A'; determiner_indices(sel,N,&i,&j);
noeud* tmp=tableau[i][j].sommet; //printf("(%d,%d)",i,j);
while (tmp != NULL){ if (i>=N || i<0 || j<0 || j>=N)
affichepion(tmp->chaine,NOIR); printf("Aucune case n'est sélectionnée.");
tmp=tmp->next; else {
printf("\n"); 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);
}
...@@ -32,4 +32,10 @@ void affichepion(char *pion,char* CASE); ...@@ -32,4 +32,10 @@ void affichepion(char *pion,char* CASE);
*/ */
void affichepile(char* sel, pile **tableau, int N); 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 #endif
#include<unistd.h>
#include"tableau.h" #include"tableau.h"
#include"affichage.h"
#include"deplacement.h"
/*deplacement.c*/ /*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'; int nb;
if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1) scanf("%d",&nb);
printf("Aucune case n'est sélectionnée."); if (nb<=nb_de_pion(tableau[i][j],"BN"[*tour%2]) && nb>0)
else { 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));
}
}
...@@ -8,8 +8,68 @@ ...@@ -8,8 +8,68 @@
/* /*
* @require * @require
* @assign * @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 #endif
...@@ -13,13 +13,12 @@ int main(int argc, char **argv) ...@@ -13,13 +13,12 @@ int main(int argc, char **argv)
pile **tableau=initialisation(N); pile **tableau=initialisation(N);
debut_partie(tableau,N); debut_partie(tableau,N);
char action; char action;
int tour=0;
char sel[4]="\0\0\0\0"; char sel[4]="\0\0\0\0";
while (1){ while (1){
affichecouleur(tableau,N); affichage(tableau,N,sel,tour,"Entrez une action (c,d,a) >");
affichepile(sel,tableau,N);
printf("\n Entrez une action (c,d,a) >");
scanf("%c",&action); scanf("%c",&action);
realiser(action,tableau,N,sel); realiser(action,tableau,N,sel,&tour);
} }
nettoyer(tableau,N); nettoyer(tableau,N);
return 0; return 0;
......
...@@ -54,6 +54,7 @@ char *depiler(pile *p) ...@@ -54,6 +54,7 @@ char *depiler(pile *p)
void reset(pile *p) void reset(pile *p)
{ {
while (p->sommet) while (p->sommet)
/*termine lorsque p n'a plus de sommet à dépiler (car p est de longueur finie)*/
depiler(p); depiler(p);
} }
...@@ -96,6 +97,26 @@ int longueur_pile(pile p) ...@@ -96,6 +97,26 @@ int longueur_pile(pile p)
int i=0; int i=0;
noeud* tmp=p.sommet; noeud* tmp=p.sommet;
while (tmp != NULL){ 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++; i++;
tmp=tmp->next; tmp=tmp->next;
} }
......
...@@ -81,4 +81,18 @@ void debut_partie(pile **tableau,int N); ...@@ -81,4 +81,18 @@ void debut_partie(pile **tableau,int N);
*/ */
int longueur_pile(pile p); 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 #endif
Aucun aperçu pour ce type de fichier
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter