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
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 @@
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;
......
......@@ -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);
......@@ -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);
}
......@@ -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
#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));
}
}
......@@ -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
......@@ -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;
......
......@@ -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;
}
......
......@@ -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
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