Accueil > > > [C] CASSE-TETE : PUZZLE
[C] CASSE-TETE : PUZZLE
Information sur la source
Description
c'est un casse-tete de la forme d'une table NxN qu'il faudra arrangé par ordre croissant , il y'a une case vide dans la quelle on peut "pousser" un autre élément qui devient vide . on gagne quand on arrange les cases ( VIDE -> 1 -> 2 .. -> N*N ) , c'est pas très amusant surtout que c'est un jeu sur console , c'est un peu moche , le truc amusant c'est de créer le code du jeu . j'ai tout fé moi même donc y'a des beug et c'est pas très optimisé , mais c'est assez rapide je crois .
Source
- /* Auteur : A.souini */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <time.h>
- #include <math.h>
-
- #define tchar sizeof(char)
-
- /* une structure pour sauvegarder la table et la dimension */
- typedef struct donnee_jeu
- {
- int l,c; /* L:ligne C:colonne*/
- char *table; /* pointeur vers la table , j'ai choisie char parceque le max de la dim c'est 10*10 donc 99 et le nombre maximum a sauvgardé */
- } donnee_j;
-
-
- char *creer_table(int,int,char **); /* creer la table et la mix puis retourne un pointeur vers cette derniere */
- int afficher_menu(void); /* affiche le menu et retourn le choix ou quite le programme */
- char **mouv_possible(int,int); /* genere une table ou est stoké les mouvement possible pour chaque case */
- void partie(char *,int,int); /* c'est la fonction qui gere le jeu */
- void afficher_table(char *,int,int); /* affiche la table */
- donnee_j chargement(void); /* charge la table et la dimension a partir d'un fichier de sauvgarde */
- void sauvegarder(char *,int,int); /* sauvgarde la table courrante */
- int en_ordre(char *,int,int); /* retourne 1 si la table et en ordre 0 -> l*c-1 , sinon un 0 */
-
- int afficher_menu(void) /*terminé*/
- {
- int choix_menu;
- do
- {
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
- /* efface l'ecran */
-
- /* un ptit art ascii :p */
- printf("ppppp u u zzzzzz zzzzzz L eeeeeee\n");
- printf("p p u u z z L e\n");
- printf("ppppp u u z z L eeeeeee\n");
- printf("p u u z z L e\n");
- printf("p uuuuuu zzzzzz zzzzzz LLLLLL eeeeeee\n\n\n\n");
-
- printf("\t\t\tFaite un choix :\n\n\t\t\t\t");
- printf("1 - Nouvelle partie.\n\t\t\t\t2 - Charger une partie.\n\t\t\t\t3 - Quiter.\n\n");
- printf("\t\t\t---> ");
- scanf("%d",&choix_menu);
- } while ((choix_menu < 1) || (choix_menu > 3)); /* seul 1 ,2 et 3 sont possible */
-
- if (choix_menu == 3) exit(0); /* quite si le choix et 3 */
- return choix_menu;
- }
-
-
-
- char **mouv_possible(int l,int c) /*terminé*/
- {
- char **ptr_ptr=malloc(l*c*sizeof(char *)+1);
- /* on alloue un tableau de poiteurs vers char de la taille de la dimension L*C + 1 , le 1 c'est pour un
- tableau ou on metra le nombre de possiblitité pour chaque case */
- int i,j,k=l*c;
-
- ptr_ptr[k]=malloc(l*c*tchar); /* on creer le tableau qui contiendera le nombre de possibilité pour chaque case */
-
- /*****************************shema de la table**********************************
-
- voila ce que j'ai trouvé quand j'ai analysé le probleme et depuis cette analyse j'ai creer
- cette fonction qui est comme la colonne vertebrale du jeu , vu que c'est la ou les possiblité
- de mouvement (les regles) sont calculé
-
- -----------------------------------------------------------------------
- | A11 | A12 | A13 .... .... | A1(c-1) | A1c |
- | A21 | A22 | A23 .... .... | A2(c-1) | A2c |
- . .
- . .
- . .
-
- |A(l-1)1|A(l-1)2|A(l-1)3 .... .... | A(l-1)(c-1) | A(l-1)c |
- | Al1 | Al2 | Al3 .... .... | Al(c-1) | Alc |
- ------------------------------------------------------------------------
-
- - pour A11,A1c,Al1,Alc il ya deu possiblité de mouvement chaqune
- A11 : +1,+C
- A1c : -1,+C
- Al1 : +1,-C
- Alc : -1,-C
-
- - pour les case de A12 a A1(c-1) , Al2 a Al(c-1) , A21 a A(l-1)1 et A2c a A(l-1)c on aura 3 possiblité
- A12 a A1(c-1) : -1,+1,+C
- Al2 a Al(c-1) : -1,+1,-C
- A21 a A(l-1)1 : +1,-C,+C
- A2c a A(l-1)c : -1,-C,+C
-
- - pour tout le reste , donc la matrice du milieu on aura 4 possiblité de mouvement
- +1,-1,-C,+C
-
-
- **************************************************************************/
-
- /* ptr_ptr[X] : poiteur vers les possiblité de la case X
- ptr_ptr[X][Y] : la possibilité Y de la case X
- */
-
- // les possibilité avec un cardinale 2 - les quatres coins
-
- /* on alloue l'espace requit pour contenir les deu possiblité pour les 4 case */
- ptr_ptr[0]=malloc(2*tchar);
- ptr_ptr[c-1]=malloc(2*tchar);
- ptr_ptr[(l-1)*c]=malloc(2*tchar);
- ptr_ptr[(l*c)-1]=malloc(2*tchar);
-
- /* on calcul les possibilité des 4 case */
- for (i=0;i<2;i++)
- {
- ptr_ptr[0][i]=(char) (0 + (i? 1:c)); /* +1,+C */
- ptr_ptr[k][0]=2; /* la case 0 a 2 possiblité de mouvement */
- ptr_ptr[c-1][i]=(char) ((c-1) + (i? (-1):c)); /* -1,+C */
- ptr_ptr[k][c-1]=2; /* la case c-1 a 2 possiblité ..*/
- ptr_ptr[(l-1)*c][i]=(char) ((l-1)*c + (i? 1:(-c))); /* +1,-C */
- ptr_ptr[k][(l-1)*c]=2;
- ptr_ptr[(l*c)-1][i]=(char) ((l*c)-1 + (i? (-1):(-c))); /* -1,-C */
- ptr_ptr[k][(l*c)-1]=2;
- }
-
- // les posibilités avec un cardinale 3 - les barres des cotés sans les coins
- for (i=1;i<(c-1);i++) /* coté haut --> A12 a A1(c-1) */
- {
- ptr_ptr[i]=malloc(3*tchar); /* on alloue troi case */
- ptr_ptr[k][i]=3; /* la case i a 3 possiblité de mouvement */
- for (j=0;j<3;j++)
- ptr_ptr[i][j]= (char) (i + (((int)pow((-1),j)) * ((j==2)? c:1))); /* on rempli les possiblité -1,+1,+C */
- }
-
- for (i=1+l*(c-1);i<l*c-1;i++) /* coté bas --> Al2 a Al(c-1) */
- {
- ptr_ptr[i]=malloc(3*tchar);
- ptr_ptr[k][i]=3;
- for (j=0;j<3;j++)
- ptr_ptr[i][j]=(char) (i + (((int)pow((-1),j)) * ((j==2)? (-c):1))); /* -1,+1,-C */
- }
-
- for (i=1;i<(l-1);i++) /* coté gauche --> A21 a A(l-1)1 */
- {
- ptr_ptr[i*l]=malloc(3*tchar);
- ptr_ptr[k][i*l]=3;
- for (j=0;j<3;j++)
- ptr_ptr[i*l][j]=(char) ((i*l)+ (((int)pow((-1),j)) * ((j==2)? 1:c))); /* +1,-C,+C */
- }
-
- for (i=1;i<(l-1);i++) /* coté droite --> A2c a A(l-1)c */
- {
- ptr_ptr[(c*(i+1))-1]=malloc(3*tchar);
- ptr_ptr[k][(c*(i+1))-1]=3;
- for (j=0;j<3;j++)
- ptr_ptr[(c*(i+1))-1][j]=(char) (((c*(i+1))-1)+ (((int)pow((-1),j)) * ((j==2)? (-1):(c)))); /* -1,-C,+C */
- }
-
- //les possibilité avec un cardinale eguale a 4 - la matrice du milieu sans les barre de coté et de haut
-
- for (i=(c+1);i<((c*(l-1))-1);(!(i % c)||!((i+1) % c))? i+=2:i++)
- {
- ptr_ptr[i]=malloc(4*tchar);
- ptr_ptr[k][i]=4;
- for (j=0;j<4;j++)
- ptr_ptr[i][j]=(char) (i+ ((int)pow((-1),j)) * ((j>1)? c:1)); /* +1,-1,-C,+C */
- }
-
- return ptr_ptr; /* on retourne le pointeur vers les poiteur de mouvement possible */
- }
-
-
-
- char *creer_table(int l,int c,char **mouv_poss) /* terminé */
- {
- int i,k,j;
- char *ptr=malloc(l*c*tchar+1); /* j'alloue L*C+1 case , la case de plus c'est pour contenir l'indice du zero (la marke XX aka la case vide) */
-
- for(i=0;i<l*c;ptr[i]=i++); /* je rempli la table de 0 a (L*C)-1 */
- ptr[l*c]=0; /* c'est la case d'indice 0 qui contient le 0 */
-
- srand(time(NULL)); /* on initialise le seed par l'heur courrante */
- for(j=0,i=ptr[l*c];j<l*c*10;j++) /* l'ordinateur vas joué 10 foi la taille de la table comme ca elle sera bien mixé et y'aura au moin une solution :D */
- {
- k=(rand() % mouv_poss[l*c][i]); /* k contient un nombre entre dans l'intervale [0,mouv_poss[l*c][i]] */
- ptr[i]=ptr[mouv_poss[i][k]];/* on efectue l'echange */
- ptr[mouv_poss[i][k]]=0; /* .. */
- ptr[l*c]=mouv_poss[i][k]; /* ..*/
- i=ptr[l*c]; /* i contient la nouvelle position du zero */
-
- }
-
- return ptr; /* on retourne le poiteur de la table cree et mixé */
- }
-
-
-
- void affiche_table(char *ptr,int l,int c) /* terminé*/
- {
- int i,j;
- char temp[4]="XX"; /* texte a afficher dans la case vide */
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
- /* effacer l'ecran */
- for (i=0;i<l;i++)
- {
- for (j=0;j<c;j++)
- if (i*c+j!=ptr[l*c]) /*si c'est pas la position du zero alor affichier le nombre */
- printf("%6d",ptr[i*c+j]);
- else
- printf("%6s",temp); /* sinon afichier le XX */
- printf("\n");
- }
- }
-
-
-
- void partie(char *table,int l,int c) /*terminé*/
- {
- int choix,temp,temp1,i;
- char **mouv_poss;
-
- mouv_poss=mouv_possible(l,c);
-
- if (!table) /* si c'est pas un chargement de sauvgarde , on creer une table */
- {
- table = creer_table(l,c,mouv_poss);
- }
-
- do {
- affiche_table(table,l,c);
- printf("\n\n - (-1) : menu .\n - (-2) : Sauvgarder .\n - le nombre a deplacer .\n");
- do {
- printf("----> ");
- scanf("%d",&choix);/*je voulé prendre des char et puis testé mais j'ai eu kelke probleme
- donc j'ai abondoné et c'est avec un -1 et un -2 que j'ai continué */
- } while ((choix >((l*c) - 1)) || ((choix < 1) && (choix != -2) && (choix != -1)));
-
- switch (choix)
- {
- case (-1): /* menu */
- temp=3;
- do {
- printf(" - Voulez-vous sauvegarder ? (1:oui 0:non) --> ");
- scanf("%d",&temp);
- }while ((temp!=1) && (temp!=0));
- if (temp) sauvegarder(table,l,c);
- free(table); /* un seul free :p les autre vienderon plus tard pas le temps ^^*/
- choix=0;
- break;
- case (-2): /* sauvegarder */
- sauvegarder(table,l,c);
- break;
- default : /* faire le mouvement si c'est possible */
- temp=mouv_poss[l*c][table[l*c]];
- for (i=0;i<l*c;i++)
- if (choix==table[i]) break; /* cherche l'indice de l'element choisi par l'utilisateur */
- temp1=i;
- for (i=0;i<temp;i++)
- if (temp1==mouv_poss[table[l*c]][i]) break; /* cherche l'indice de l'element dans la liste des element
- possible de la case du 0 */
- if (i>=temp) /*si indice non trouvé donc pas possible de faire le mouvement */
- {
- printf("Err : Mouvement impossible !!");
- getch();
- }
- else /* sinon on swap les valeurs */
- {
- table[table[l*c]]=table[temp1];
- table[l*c]=temp1;
- table[temp1]=0;
- }
- break;
- }
-
- if (!choix) break; /* si on choisi menu on quite vers le menu */
-
- } while (!en_ordre(table,l,c)); /* boule tand que c'est pas en ordre ( casse tete non resolue ) */
-
- if (choix) /* si choi est differante de zero et qu'on a quité la boucle c'est que c'est en ordre */
- {
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
-
- printf("Vous Avez Gagner :D felicitation !"); /* je v bientot ajouté une fonction qui creer un high score liste dans un fichier crypté
- ou le gagnan aura son nom et le nombre de mouvement avec les quelle il a resolut le casse
- tete de dimention LxL */
- getch();
- }
-
-
- }
-
-
-
- donnee_j chargement(void) /* terminé*/
- {
- FILE *fichier;
- char nom_f[30],test[4],*ptr;
- donnee_j temp; /*le structure que retournera la fonction*/
- int i;
-
-
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
-
- printf(" - donner le nom du fichier de sauvegarde ( sans l'extention .DAT) : \n---> ");
- scanf("%s",nom_f);
- strcat(nom_f,".dat");
-
- if (fichier=fopen(nom_f,"r"))
- {
- fscanf(fichier,"%s ",test); /*teste si le fichier commence par la chaine PZL*/
- if (!strcmp("PZL",test)) /* si oui alor il comment l'extraction des donnee */
- {
- fscanf(fichier,"%d %d ",&temp.l,&temp.c);
- temp.table=malloc((temp.l*temp.c*tchar)+1);
- fread(temp.table,tchar,(temp.l*temp.c)+1,fichier);
- fclose(fichier);
- return temp;
- }
- else
- {
- temp.table=NULL; /* c'est pour le test de la fonction main */
- printf("ERR : ce fichier n\'est pas un fichier de sauvegarde PUZZLE !!");
- getch();
- }
- }
- else
- {
- temp.table=NULL;
- printf("ERR : erreur lors de l\'ouverture du fichier sauvegarde !!");
- getch();
- }
-
- return temp;
- }
-
- void sauvegarder(char *table,int l,int c) /* terminé*/
- {
- FILE *fichier;
- char nom_f[30];
-
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
-
- printf(" - donner le nom du fichier ou vas etre sauvegarde la partie ( sans l\'extention .dat )\n---> ");
- scanf("%s",nom_f);
- strcat(nom_f,".dat");
-
- if (fichier=fopen(nom_f,"w"))
- {
- fprintf(fichier,"%s %d %d ","PZL",l,c);
- fwrite(table,tchar,(l*c)+1,fichier);
- fclose(fichier);
- }
- else
- {
- printf("ERR : erreur lors de la creation de la sauvegarde !!");
- getch();
- }
- }
-
- int en_ordre(char *table,int l,int c) /*terminé*/
- {
- int i;
- for (i=0;i<l*c;i++)
- if (table[i]!=i) return 0;
-
- return 1;
- }
-
-
- int main(void)
- {
- int l,c;
- donnee_j dcharge;
-
- while (1) {
- if (!(afficher_menu()-1))
- {
- do {
- #ifdef _WIN32
- system("cls");
- #elif defined(_UNIX)
- system("clear");
- #else
- #error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
- #endif
-
- printf(" - Donner la dimension du puZZle L [ 1<L<12 ] : ");
- scanf("%d",&l); /* c'est sensé travailé avec n'importe kel dimension LxC mais vu que ca beug :/
- j'ai pri alor que des matrice Carré inferieure a 12 parceque sinon ca plante et je suis pas
- sur de la raison */
- } while ( l<2 || l>11 );
-
- partie(NULL,l,l);
- }
- else
- {
- dcharge = chargement();
- if (dcharge.table)
- partie(dcharge.table,dcharge.l,dcharge.c);
- }
-
- }
-
- return 0;
- }
/* Auteur : A.souini */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#define tchar sizeof(char)
/* une structure pour sauvegarder la table et la dimension */
typedef struct donnee_jeu
{
int l,c; /* L:ligne C:colonne*/
char *table; /* pointeur vers la table , j'ai choisie char parceque le max de la dim c'est 10*10 donc 99 et le nombre maximum a sauvgardé */
} donnee_j;
char *creer_table(int,int,char **); /* creer la table et la mix puis retourne un pointeur vers cette derniere */
int afficher_menu(void); /* affiche le menu et retourn le choix ou quite le programme */
char **mouv_possible(int,int); /* genere une table ou est stoké les mouvement possible pour chaque case */
void partie(char *,int,int); /* c'est la fonction qui gere le jeu */
void afficher_table(char *,int,int); /* affiche la table */
donnee_j chargement(void); /* charge la table et la dimension a partir d'un fichier de sauvgarde */
void sauvegarder(char *,int,int); /* sauvgarde la table courrante */
int en_ordre(char *,int,int); /* retourne 1 si la table et en ordre 0 -> l*c-1 , sinon un 0 */
int afficher_menu(void) /*terminé*/
{
int choix_menu;
do
{
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
/* efface l'ecran */
/* un ptit art ascii :p */
printf("ppppp u u zzzzzz zzzzzz L eeeeeee\n");
printf("p p u u z z L e\n");
printf("ppppp u u z z L eeeeeee\n");
printf("p u u z z L e\n");
printf("p uuuuuu zzzzzz zzzzzz LLLLLL eeeeeee\n\n\n\n");
printf("\t\t\tFaite un choix :\n\n\t\t\t\t");
printf("1 - Nouvelle partie.\n\t\t\t\t2 - Charger une partie.\n\t\t\t\t3 - Quiter.\n\n");
printf("\t\t\t---> ");
scanf("%d",&choix_menu);
} while ((choix_menu < 1) || (choix_menu > 3)); /* seul 1 ,2 et 3 sont possible */
if (choix_menu == 3) exit(0); /* quite si le choix et 3 */
return choix_menu;
}
char **mouv_possible(int l,int c) /*terminé*/
{
char **ptr_ptr=malloc(l*c*sizeof(char *)+1);
/* on alloue un tableau de poiteurs vers char de la taille de la dimension L*C + 1 , le 1 c'est pour un
tableau ou on metra le nombre de possiblitité pour chaque case */
int i,j,k=l*c;
ptr_ptr[k]=malloc(l*c*tchar); /* on creer le tableau qui contiendera le nombre de possibilité pour chaque case */
/*****************************shema de la table**********************************
voila ce que j'ai trouvé quand j'ai analysé le probleme et depuis cette analyse j'ai creer
cette fonction qui est comme la colonne vertebrale du jeu , vu que c'est la ou les possiblité
de mouvement (les regles) sont calculé
-----------------------------------------------------------------------
| A11 | A12 | A13 .... .... | A1(c-1) | A1c |
| A21 | A22 | A23 .... .... | A2(c-1) | A2c |
. .
. .
. .
|A(l-1)1|A(l-1)2|A(l-1)3 .... .... | A(l-1)(c-1) | A(l-1)c |
| Al1 | Al2 | Al3 .... .... | Al(c-1) | Alc |
------------------------------------------------------------------------
- pour A11,A1c,Al1,Alc il ya deu possiblité de mouvement chaqune
A11 : +1,+C
A1c : -1,+C
Al1 : +1,-C
Alc : -1,-C
- pour les case de A12 a A1(c-1) , Al2 a Al(c-1) , A21 a A(l-1)1 et A2c a A(l-1)c on aura 3 possiblité
A12 a A1(c-1) : -1,+1,+C
Al2 a Al(c-1) : -1,+1,-C
A21 a A(l-1)1 : +1,-C,+C
A2c a A(l-1)c : -1,-C,+C
- pour tout le reste , donc la matrice du milieu on aura 4 possiblité de mouvement
+1,-1,-C,+C
**************************************************************************/
/* ptr_ptr[X] : poiteur vers les possiblité de la case X
ptr_ptr[X][Y] : la possibilité Y de la case X
*/
// les possibilité avec un cardinale 2 - les quatres coins
/* on alloue l'espace requit pour contenir les deu possiblité pour les 4 case */
ptr_ptr[0]=malloc(2*tchar);
ptr_ptr[c-1]=malloc(2*tchar);
ptr_ptr[(l-1)*c]=malloc(2*tchar);
ptr_ptr[(l*c)-1]=malloc(2*tchar);
/* on calcul les possibilité des 4 case */
for (i=0;i<2;i++)
{
ptr_ptr[0][i]=(char) (0 + (i? 1:c)); /* +1,+C */
ptr_ptr[k][0]=2; /* la case 0 a 2 possiblité de mouvement */
ptr_ptr[c-1][i]=(char) ((c-1) + (i? (-1):c)); /* -1,+C */
ptr_ptr[k][c-1]=2; /* la case c-1 a 2 possiblité ..*/
ptr_ptr[(l-1)*c][i]=(char) ((l-1)*c + (i? 1:(-c))); /* +1,-C */
ptr_ptr[k][(l-1)*c]=2;
ptr_ptr[(l*c)-1][i]=(char) ((l*c)-1 + (i? (-1):(-c))); /* -1,-C */
ptr_ptr[k][(l*c)-1]=2;
}
// les posibilités avec un cardinale 3 - les barres des cotés sans les coins
for (i=1;i<(c-1);i++) /* coté haut --> A12 a A1(c-1) */
{
ptr_ptr[i]=malloc(3*tchar); /* on alloue troi case */
ptr_ptr[k][i]=3; /* la case i a 3 possiblité de mouvement */
for (j=0;j<3;j++)
ptr_ptr[i][j]= (char) (i + (((int)pow((-1),j)) * ((j==2)? c:1))); /* on rempli les possiblité -1,+1,+C */
}
for (i=1+l*(c-1);i<l*c-1;i++) /* coté bas --> Al2 a Al(c-1) */
{
ptr_ptr[i]=malloc(3*tchar);
ptr_ptr[k][i]=3;
for (j=0;j<3;j++)
ptr_ptr[i][j]=(char) (i + (((int)pow((-1),j)) * ((j==2)? (-c):1))); /* -1,+1,-C */
}
for (i=1;i<(l-1);i++) /* coté gauche --> A21 a A(l-1)1 */
{
ptr_ptr[i*l]=malloc(3*tchar);
ptr_ptr[k][i*l]=3;
for (j=0;j<3;j++)
ptr_ptr[i*l][j]=(char) ((i*l)+ (((int)pow((-1),j)) * ((j==2)? 1:c))); /* +1,-C,+C */
}
for (i=1;i<(l-1);i++) /* coté droite --> A2c a A(l-1)c */
{
ptr_ptr[(c*(i+1))-1]=malloc(3*tchar);
ptr_ptr[k][(c*(i+1))-1]=3;
for (j=0;j<3;j++)
ptr_ptr[(c*(i+1))-1][j]=(char) (((c*(i+1))-1)+ (((int)pow((-1),j)) * ((j==2)? (-1):(c)))); /* -1,-C,+C */
}
//les possibilité avec un cardinale eguale a 4 - la matrice du milieu sans les barre de coté et de haut
for (i=(c+1);i<((c*(l-1))-1);(!(i % c)||!((i+1) % c))? i+=2:i++)
{
ptr_ptr[i]=malloc(4*tchar);
ptr_ptr[k][i]=4;
for (j=0;j<4;j++)
ptr_ptr[i][j]=(char) (i+ ((int)pow((-1),j)) * ((j>1)? c:1)); /* +1,-1,-C,+C */
}
return ptr_ptr; /* on retourne le pointeur vers les poiteur de mouvement possible */
}
char *creer_table(int l,int c,char **mouv_poss) /* terminé */
{
int i,k,j;
char *ptr=malloc(l*c*tchar+1); /* j'alloue L*C+1 case , la case de plus c'est pour contenir l'indice du zero (la marke XX aka la case vide) */
for(i=0;i<l*c;ptr[i]=i++); /* je rempli la table de 0 a (L*C)-1 */
ptr[l*c]=0; /* c'est la case d'indice 0 qui contient le 0 */
srand(time(NULL)); /* on initialise le seed par l'heur courrante */
for(j=0,i=ptr[l*c];j<l*c*10;j++) /* l'ordinateur vas joué 10 foi la taille de la table comme ca elle sera bien mixé et y'aura au moin une solution :D */
{
k=(rand() % mouv_poss[l*c][i]); /* k contient un nombre entre dans l'intervale [0,mouv_poss[l*c][i]] */
ptr[i]=ptr[mouv_poss[i][k]];/* on efectue l'echange */
ptr[mouv_poss[i][k]]=0; /* .. */
ptr[l*c]=mouv_poss[i][k]; /* ..*/
i=ptr[l*c]; /* i contient la nouvelle position du zero */
}
return ptr; /* on retourne le poiteur de la table cree et mixé */
}
void affiche_table(char *ptr,int l,int c) /* terminé*/
{
int i,j;
char temp[4]="XX"; /* texte a afficher dans la case vide */
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
/* effacer l'ecran */
for (i=0;i<l;i++)
{
for (j=0;j<c;j++)
if (i*c+j!=ptr[l*c]) /*si c'est pas la position du zero alor affichier le nombre */
printf("%6d",ptr[i*c+j]);
else
printf("%6s",temp); /* sinon afichier le XX */
printf("\n");
}
}
void partie(char *table,int l,int c) /*terminé*/
{
int choix,temp,temp1,i;
char **mouv_poss;
mouv_poss=mouv_possible(l,c);
if (!table) /* si c'est pas un chargement de sauvgarde , on creer une table */
{
table = creer_table(l,c,mouv_poss);
}
do {
affiche_table(table,l,c);
printf("\n\n - (-1) : menu .\n - (-2) : Sauvgarder .\n - le nombre a deplacer .\n");
do {
printf("----> ");
scanf("%d",&choix);/*je voulé prendre des char et puis testé mais j'ai eu kelke probleme
donc j'ai abondoné et c'est avec un -1 et un -2 que j'ai continué */
} while ((choix >((l*c) - 1)) || ((choix < 1) && (choix != -2) && (choix != -1)));
switch (choix)
{
case (-1): /* menu */
temp=3;
do {
printf(" - Voulez-vous sauvegarder ? (1:oui 0:non) --> ");
scanf("%d",&temp);
}while ((temp!=1) && (temp!=0));
if (temp) sauvegarder(table,l,c);
free(table); /* un seul free :p les autre vienderon plus tard pas le temps ^^*/
choix=0;
break;
case (-2): /* sauvegarder */
sauvegarder(table,l,c);
break;
default : /* faire le mouvement si c'est possible */
temp=mouv_poss[l*c][table[l*c]];
for (i=0;i<l*c;i++)
if (choix==table[i]) break; /* cherche l'indice de l'element choisi par l'utilisateur */
temp1=i;
for (i=0;i<temp;i++)
if (temp1==mouv_poss[table[l*c]][i]) break; /* cherche l'indice de l'element dans la liste des element
possible de la case du 0 */
if (i>=temp) /*si indice non trouvé donc pas possible de faire le mouvement */
{
printf("Err : Mouvement impossible !!");
getch();
}
else /* sinon on swap les valeurs */
{
table[table[l*c]]=table[temp1];
table[l*c]=temp1;
table[temp1]=0;
}
break;
}
if (!choix) break; /* si on choisi menu on quite vers le menu */
} while (!en_ordre(table,l,c)); /* boule tand que c'est pas en ordre ( casse tete non resolue ) */
if (choix) /* si choi est differante de zero et qu'on a quité la boucle c'est que c'est en ordre */
{
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
printf("Vous Avez Gagner :D felicitation !"); /* je v bientot ajouté une fonction qui creer un high score liste dans un fichier crypté
ou le gagnan aura son nom et le nombre de mouvement avec les quelle il a resolut le casse
tete de dimention LxL */
getch();
}
}
donnee_j chargement(void) /* terminé*/
{
FILE *fichier;
char nom_f[30],test[4],*ptr;
donnee_j temp; /*le structure que retournera la fonction*/
int i;
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
printf(" - donner le nom du fichier de sauvegarde ( sans l'extention .DAT) : \n---> ");
scanf("%s",nom_f);
strcat(nom_f,".dat");
if (fichier=fopen(nom_f,"r"))
{
fscanf(fichier,"%s ",test); /*teste si le fichier commence par la chaine PZL*/
if (!strcmp("PZL",test)) /* si oui alor il comment l'extraction des donnee */
{
fscanf(fichier,"%d %d ",&temp.l,&temp.c);
temp.table=malloc((temp.l*temp.c*tchar)+1);
fread(temp.table,tchar,(temp.l*temp.c)+1,fichier);
fclose(fichier);
return temp;
}
else
{
temp.table=NULL; /* c'est pour le test de la fonction main */
printf("ERR : ce fichier n\'est pas un fichier de sauvegarde PUZZLE !!");
getch();
}
}
else
{
temp.table=NULL;
printf("ERR : erreur lors de l\'ouverture du fichier sauvegarde !!");
getch();
}
return temp;
}
void sauvegarder(char *table,int l,int c) /* terminé*/
{
FILE *fichier;
char nom_f[30];
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
printf(" - donner le nom du fichier ou vas etre sauvegarde la partie ( sans l\'extention .dat )\n---> ");
scanf("%s",nom_f);
strcat(nom_f,".dat");
if (fichier=fopen(nom_f,"w"))
{
fprintf(fichier,"%s %d %d ","PZL",l,c);
fwrite(table,tchar,(l*c)+1,fichier);
fclose(fichier);
}
else
{
printf("ERR : erreur lors de la creation de la sauvegarde !!");
getch();
}
}
int en_ordre(char *table,int l,int c) /*terminé*/
{
int i;
for (i=0;i<l*c;i++)
if (table[i]!=i) return 0;
return 1;
}
int main(void)
{
int l,c;
donnee_j dcharge;
while (1) {
if (!(afficher_menu()-1))
{
do {
#ifdef _WIN32
system("cls");
#elif defined(_UNIX)
system("clear");
#else
#error "Système d'exploitation non pris en charge, l'écran ne sera pas effacé."
#endif
printf(" - Donner la dimension du puZZle L [ 1<L<12 ] : ");
scanf("%d",&l); /* c'est sensé travailé avec n'importe kel dimension LxC mais vu que ca beug :/
j'ai pri alor que des matrice Carré inferieure a 12 parceque sinon ca plante et je suis pas
sur de la raison */
} while ( l<2 || l>11 );
partie(NULL,l,l);
}
else
{
dcharge = chargement();
if (dcharge.table)
partie(dcharge.table,dcharge.l,dcharge.c);
}
}
return 0;
}
Conclusion
il manque encore des fonctionnalités et y'a aussi des beugs donc merci a tout ceux qui me donneront des solutions .
Historique
- 24 décembre 2006 14:38:21 :
- normalement maintenant ca devrais etre compilable sur linux aussi -> d'apres un commentaire de nightlord666 sur le jeu "[C] PENDU EN CONSOLE" h__p://www.cppfrance.com/codes/PENDU-CONSOLE_40840.aspx
- 04 janvier 2007 15:07:20 :
- ptite correction
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Snake tsssssssssss aidez moiiiiiiii [ par AmK ]
Salut ,Je suis en train de coder un snake et la je crois avoir bien compris le principe de l'algo mais niveau code ça foire je sais pas pourquoi voila
disque dur , plateau , bras , tete de lecture. [ par Bonjour_ca_va_? ]
Bonjour a tous.Je voudrai savoir si il est possible d'accedé a la tete de lecture (et le reste du disque dur).Exemple faire bougé le bras,passé la tet
travail sur les files (assez urgent :) ) [ par tagada_du_loft ]
voila je doit inserer un elt en tete de file "1ere fonction"et en oter le dernier elt de la file "2eme"les structure de bases sont:*******************
Ajout en tete dans un Vector [ par titpeste ]
Bonjour,je code en ce moment avec des vector en C++. Seulement, je n'ai pas trouve de methode pour ajouter en tete. Cela existe t'il? Si non, comment
Casse Briques en C [ par fanaticmassalia13000 ]
Salut a tous,voila j'étudie le langage C et je doit devellopper un Casse Brique en C pour mon projet alors j'aurais souhaité savoir si vous pourriez m
Pb avec Template [ par Diabolus ]
Salut à tous,J'ai un problème avec les templates. Je veux faire une liste chainée qui fonctionne avec les templates.Mon problème arrive au moment où j
casse brique pb collision [ par mat74 ]
voila je suis en train de faire un casse brique et je n'arrive pas a gerer les collisions entre les briques et la balle "correctement" .je connais le
g,n,rateur de puzzle de forme rectangulaire [ par nizcom ]
bonjour;Il s'agit de d,velopper et d'impl,menter une methode pour la g,n,ration d'un puzzle de formes rectangulaires.Un rectangle initial (plaque) de
Casse-tête [ par alex1982 ]
Bonjour, j'utilise visual dot net, et j'ai un problème avec mon code.Lorsque j'exécute le code suivant (très simple) :#include <stdlib.h>class e
static en C [ par tich69 ]
Salut !!!Voila je suis débutant en C, et j'ai un petit problème. ( je vous explique)-------------------------------J'ai plusieurs modules :pile.c / p
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|