begin process at 2010 02 10 09:02:52
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Linux

 > KAKURO

KAKURO


 Information sur la source

Note :
Aucune note
Catégorie :Applications Linux Classé sous :kakuro, jeu, chiffres Niveau :Débutant Date de création :18/05/2007 Vu / téléchargé :3 418 / 107

Auteur : clmercutio

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Voila, je bosse sur un projet pour mes cours de programmation.
Le premier projet consistait en une grille statique realisée correctement.
Pour le second projet, mon prof veut un tableau dynamique. Je crois que j'en suis pas loin mais ca plante pour l'affichage et paf l'erreur habituelle "Erreur de segmentation". Vous pouvez tester le code en mettant en commentaire de la ligne 82 et la ligne 100 et la miracle ca marche. Mais ca ne m'arrange pas du tout puisque mes cases sont vides :(.
Je sais que j'ai defini ici ma taille du tableau par nx,ny mais je dois en fait recuperer la taille en lisant la grille du kakuro, et la aussi je seche, j'utilise un "sscanf" pour lire dans le fichier, il me recupère bien la valeur mais ne l'attribue pas.
Dans un premier temps, je cherche uniquement a resoudre mon problème d'affichage car après vérification, la memoire est belle est bien allouée.
Bon, ne jugez pas mon code lol, je suis novice en programmation et je trouve que le prof a fait un peu fort de demander un kakuro pour des premières années, mais je debrouille meme si parfois je pourrais faire un meilleur codage. Je vous remercie a tous d'avance.
Je joinds le zip comme ca vous avez une grille, donc quand vous jouer, vous tapez 1 puis 1 et encore 1 car c'est la grille11.txt

Source

  • #include<stdio.h>
  • #include<stdlib.h>
  • #include"couleurs.h"
  • typedef struct element
  • {
  • char type;
  • int val[2];
  • int attrib;
  • }grille;
  • /* Explication de la fonction INIT */
  • /* Fonction servant a initialiser le tableau pour eviter des problemes d'allocation */
  • /* de valeur dans les cases, pouvant causer des erreurs */
  • void init(int nx,int ny,grille **tab)
  • {
  • int x,y;
  • for(x=0;x<nx;x++)
  • {
  • for(y=0;y<ny;y++)
  • {
  • tab[x][y].type='Z';
  • tab[x][y].val[0]=0;
  • tab[x][y].val[1]=0;
  • tab[x][y].attrib=-1;
  • }
  • }
  • }
  • /* Explication de la fonction AFFICHAGE */
  • /* En fonction du type attribue a chaque case, un affichage se distinque par le switch */
  • /* Le "default" equivalant aux cases blanches non-codees */
  • void affichage(int nx,int ny,grille **tab)
  • {
  • int x,y,x2;
  • printf("\033[H\033[2J");
  • for(x=0;x<nx+1;x++)
  • {
  • couleur("31");
  • printf("+-----");
  • if(x==nx)
  • {
  • printf("+\n");
  • }
  • }
  • for(x=0;x<nx;x++)
  • {
  • if(x==0)
  • {
  • printf("| ");
  • }
  • printf("| %2d ",x);
  • if(x==nx-1)
  • {
  • printf("|\n");
  • }
  • }
  • for(x=0;x<nx;x++)
  • {
  • for(x2=0;x2<nx+1;x2++)
  • {
  • couleur("31");
  • printf("+-----");
  • if(x2==nx)
  • {
  • printf("+\n");
  • }
  • }
  • for(y=0;y<ny;y++)
  • {
  • if(y==0)
  • {
  • couleur("31");
  • printf("| %2d ",x);
  • couleur("0");
  • }
  • couleur("31");
  • printf("|");
  • couleur("0");
  • switch (tab[x][y].type)
  • {
  • case 'D' : couleur("36");
  • printf("%2d\\%2d",tab[x][y].val[1],tab[x][y].val[0]);
  • couleur("0");
  • break;
  • case 'N' : couleur("32");
  • printf("*****");
  • couleur("0");
  • break;
  • case 'P' : couleur("33");
  • printf(" %2d ",tab[x][y].val[0]);
  • couleur("0");
  • break;
  • case 'B' : printf(" %2d ",tab[x][y].val[0]);
  • break;
  • default : printf(" ");
  • break;
  • }
  • }
  • couleur("31");
  • printf("|\n");
  • couleur("0");
  • }
  • for(x=0;x<nx+1;x++)
  • {
  • couleur("31");
  • printf("+-----");
  • if(x==nx)
  • {
  • printf("+\n");
  • }
  • couleur("0");
  • }
  • }
  • /* Explication de la fonction LOAD */
  • /* Fonction de lecture du fichier */
  • /* Lecture du fichier a partir de la commande FGETS */
  • /* Lecture ligne par ligne */
  • /* En fonction du premier caractere, je peux definir le masque pour la commande SSCANF et */
  • /* Ainsi recupere les differentes valeurs correspondant au type de la case, on rempli la structure */
  • /* et on termine en fermant le fichier */
  • void chargement(long int nx,long int ny,grille **tab,char fichier[20])
  • {
  • char type,temp[14];
  • int ligne,colonne,valeur1,valeur2,i,j;
  • int compteur=0,drap=0;
  • FILE *jeu;
  • jeu=fopen(fichier,"r");
  • if(jeu==NULL)
  • {
  • printf(" \n Fichier non charge \n");
  • }
  • else
  • {
  • printf(" Fichier %s charge \n",fichier);
  • /* Fonction de lecture du fichier. */
  • /* Attrib est specifique de ce que je peux faire, */
  • /* 0 affecte aux cases definitions, impossible de faire une action dessus. */
  • /* 1 affecte aux cases noires, impossible de faire une action dessus. */
  • /* -1 affecte aux cases blanches(Z), possibilite d'agir dessus */
  • /* 3 affecte aux cases predifinies, case remplie par le joueur, impossible d'agir dessus sauf en supprimant la valeur, */
  • /* et reaffectant la case en case blanche(Z) voir plus bas dans supprimvaleur */
  • while(!feof(jeu))
  • {
  • fgets(temp,14,jeu);
  • if(drap==0)
  • {
  • tab=(grille **)malloc(nx * sizeof(grille *));
  • if(tab==NULL)
  • {
  • printf("\n Echec lors de l'allocation memoire!!!");
  • }
  • printf("La memoire allouee est de %d ",sizeof(grille*));
  • for(i=0;i<nx;i++)
  • {
  • tab[i] = (grille *)malloc(ny * sizeof(grille));
  • printf("La memoire allouee est de %d\n",sizeof(grille));
  • if (tab[i] == NULL)
  • {
  • for (j=0;j<ny;j++)
  • {
  • printf("%d",j);
  • free(tab[j]);
  • printf("\n Echec lors de l'allocation memoire!!!");
  • }
  • }
  • }
  • drap=1;
  • }
  • if(temp[0]=='D')
  • {
  • sscanf(temp,"%c %d %d %d %d",&type,&ligne,&colonne,&valeur1,&valeur2);
  • tab [ligne][colonne].attrib=0;
  • tab [ligne][colonne].type=type;
  • tab [ligne][colonne].val[0]=valeur1;
  • tab [ligne][colonne].val[1]=valeur2;
  • }
  • if(temp[0]=='N')
  • {
  • sscanf(temp,"%c %d %d",&type,&ligne,&colonne);
  • tab [ligne][colonne].type=type;
  • tab [ligne][colonne].attrib=1;
  • }
  • if(temp[0]=='B')
  • {
  • tab[ligne][colonne].attrib=-1;
  • }
  • if(temp[0]=='P')
  • {
  • sscanf(temp,"%c %d %d %d",&type,&ligne,&colonne,&valeur1);
  • tab [ligne][colonne].type=type;
  • tab [ligne][colonne].val[0]=valeur1;
  • tab [ligne][colonne].attrib=3;
  • }
  • compteur++;
  • }
  • fclose(jeu);
  • }
  • }
  • /* Explication de la fonction SAUVEGARDE */
  • /* Fonction de sauvegarde du jeu */
  • /* On ouvre un fichier en ecriture, et ecrase l'ancien s'il y en a deja un nomme comme cela */
  • /* et on enregistre les donnees dedans */
  • /* Enregistrement case par case dans un fichier texte au meme format que les grilles de depart */
  • void sauvegarde(int nx,int ny,grille **tab,char fichier[20])
  • {
  • int x,y;
  • FILE *savegame;
  • char nom_fic[20];
  • printf("Veuillez entrer le nom du fichier : ");
  • fgets(nom_fic,20,savegame);
  • savegame=fopen(nom_fic,"w");
  • if(savegame==NULL)
  • {
  • printf("Fichier non sauvegarde");
  • }
  • else
  • {
  • for(x=0;x<nx;x++)
  • {
  • for(y=0;y<ny;y++)
  • {
  • if(tab[x][y].type=='D')
  • {
  • fprintf(savegame,"%c %d %d %d %d\n",tab[x][y].type,x,y,tab[x][y].val[0],tab[x][y].val[1]);
  • }
  • if(tab[x][y].type=='B'||tab[x][y].type=='N')
  • {
  • fprintf(savegame,"%c %d %d\n",tab[x][y].type,x,y);
  • }
  • if(tab[x][y].type=='P')
  • {
  • fprintf(savegame,"%c %d %d %d\n",tab[x][y].type,x,y,tab[x][y].val[0]);
  • }
  • }
  • }
  • }
  • }
  • /* Explication de la fonction VERIFREGLE*/
  • /* Fonction de verification pour les lignes horizontales */
  • /* Premierement, on cherche la valeur de la case definition correspondant a la ligne */
  • /* Dont la valeur fait partie, de la on sait d'ou notre verification doit partir (valeur DEPART) */
  • /* Ensuite, on demarre du DEPART, on teste si la valeur se trouve deja sur la ligne */
  • /* Si elle se trouve sur la ligne, on retourne directement 0 */
  • /* Si la valeur ne se trouve pas sur la ligne, on verifie que la case est soit Blanche, soit Predefinie */
  • /* Si elle l'est, alors on fait la somme de la valeur actuelle avec les valeurs precedentes. */
  • /* Si a un moment donne, la colonne est differente de DEPART et que les cases sont differentes de B ou P */
  • /* On a une case vide en plus de celle que l'on veut attribuer et donc cela ne sert a rien de tester la somme */
  • /* En fin de fonction, on verifie les deux cas possibles et on retourne 1 si c'est possible ou 0 si ca ne l'est pas */
  • int verifregle(int nx,int ny,grille **tab,int ligne,int colonne,int valeur)
  • {
  • int test=0,co,somme=valeur;
  • int depart,def,echec=1;
  • co=colonne;
  • while(test==0)
  • {
  • if(tab[ligne][co-1].type=='D')
  • {
  • def=tab[ligne][co-1].val[0];
  • depart=co;
  • test=1;
  • }
  • co--;
  • }
  • for(depart=depart;depart<nx&&tab[ligne][depart].type!='N'&&tab[ligne][depart].type!='D';depart++)
  • {
  • if(valeur!=tab[ligne][depart].val[0])
  • {
  • if(tab[ligne][depart].type=='P'||tab[ligne][depart].type=='B')
  • {
  • somme=somme+tab[ligne][depart].val[0];
  • }
  • else if(colonne!=depart)
  • echec=0;
  • }
  • else
  • {
  • return 0;
  • }
  • }
  • if( (echec==1&&somme==def)||(echec==0&&somme<def))
  • return 1;
  • else
  • return 0;
  • }
  • /* Explication de la fonctoion VERIFREGLE2 */
  • /* Fonction de verification pour les lignes verticales */
  • /* Premierement, on cherche la valeur de la case definition correspondant a la colonne */
  • /* Dont la valeur fait paretie, de la sait d'ou notre verification doit partir (valeur DEPART) */
  • /* Ensuite, on demarre du DEPART, on teste si la valeur se trouve deja sur la colonne */
  • /* Si elle se trouve sur la ligben on retourne directement 0 */
  • /* Si la valeur ne se trouve pas sur la colonne, on verifie que la case est soit Blanche, soit Predefinie */
  • /* Si elle l'est, alors on fait la somme de la valeur actuelle avec les valeurs precedentes. */
  • /* Si a un moment donne, la ligne est differente de DEPART et que les cases sont differentes de B ou de P */
  • /* On a une case videen plus de celle que l'on veut attribuer et donc cela ne sert a rien de tester la somme */
  • /* En fin de fonction, on verifie les deux cas possibles et on retourne 1 si c'est possible ou 0 si ca ne l'est pas */
  • int verifregle2(int nx,int ny,grille **tab,int ligne,int colonne,int valeur)
  • {
  • int test=0;
  • int somme=valeur;
  • int def,echec=1,depart,li;
  • li=ligne;
  • while(test==0)
  • {
  • if(tab[li-1][colonne].type=='D')
  • {
  • def=tab[li-1][colonne].val[1];
  • depart=li;
  • test=1;
  • }
  • li--;
  • }
  • for(depart=depart;depart<ny&&tab[depart][colonne].type!='N'&&tab[depart][colonne].type!='D';depart++)
  • {
  • if(valeur!=tab[depart][colonne].val[0])
  • {
  • if(tab[depart][colonne].type=='P'||tab[depart][colonne].type=='B')
  • somme=somme+tab[depart][colonne].val[0];
  • else if(ligne!=depart)
  • echec=0;
  • }
  • else
  • {
  • return 0;
  • }
  • }
  • if((echec==1&&somme==def)||(echec==0&&somme<def))
  • return 1;
  • else
  • return 0;
  • }
  • /* Explication de BACKTRACKING */
  • /* Ne fonctionne pas correctement, plante sur la grille 32,34,35 */
  • int backtracking(int nx,int ny,grille **tab, int lig, int colo)
  • {
  • int i=1;
  • if(colo==ny)
  • {
  • lig=lig+1;
  • colo=0;
  • }
  • while(tab[lig][colo].type=='D'||tab[lig][colo].type=='N'||tab[lig][colo].type=='P') /* Test pour voir le type de ligne */
  • {
  • colo++; /* Tant que c'est un des types test, on avance dans la colonne */
  • if(colo==ny) /* Si on arrive en fin de colonne, on avance d'une ligne et on reviens a la case 0 de la colonne */
  • {
  • lig=lig+1;
  • colo=0;
  • }
  • }
  • if((colo==0&&lig==nx)||(colo==ny&&lig==nx)) /*Sert a verifier que je suis a la fin du tableau*/
  • return 1;
  • else
  • {
  • while(i<10) /* Test tant que i est plus que 10 */
  • /* Si les 2 regles sont verifiees, on change le type de */
  • /* en case Blanche, on affecte la valeur de i a la case */
  • /* Ensuite on teste ce que la fonction et la colonne */
  • /* renvoie */
  • /* Sinon on reaffecte un type vide a la case ainsi que la */
  • /* valeur 0 */
  • /* On incremente le compteur et on recommence */
  • {
  • if(verifregle(nx,ny,tab,lig, colo,i)==1 && verifregle2(nx,ny,tab,lig, colo,i)==1)
  • {
  • tab[lig][colo].type='B';
  • tab[lig][colo].val[0]=i;
  • if(backtracking(nx,ny,tab, lig,colo+1)==1)
  • return 1;
  • }
  • else
  • {
  • tab[lig][colo].type='Z';
  • tab[lig][colo].val[0]=0;
  • }
  • i++;
  • tab[lig][colo].type='Z';
  • tab[lig][colo].val[0]=0;
  • }
  • return 0;
  • }
  • }
  • void resolutionautomatique(int nx,int ny,grille **tab)
  • {
  • int colo=0,lig=0;
  • /*fonction qui me permet de trouver le depart */
  • if( backtracking(ny,nx,tab, colo, lig)==1 )
  • printf("Solution possible\n");
  • else
  • printf("solution impossible\n");
  • }
  • /* Explication de la fonction JEU */
  • /* Introduction des coordonnees de la case par le joueur */
  • /* Fonction de test de valeur introduite par le joueur */
  • /* Test de la case pour savoir si celle ci est libre ( type Z ) ou si elle correspond a un autre type */
  • /* Si la case est libre, introduction de la valeur par le joueur puis test de la valeur entree avec les */
  • /* fonction VERIFREGLE et VERIFREGLE2 */
  • /* Si test ok, la valeur est encodee, sinon on refais la boucle */
  • void jeu(int nx,int ny,grille **tab)
  • {
  • int ligne,colonne,valeur,test;
  • do
  • {
  • printf("Veuillez entrer le numero de la ligne : \n");
  • scanf("%d",&ligne);
  • printf("Veuillez entrer le numero de la colonne : \n");
  • scanf("%d",&colonne);
  • if(tab[ligne][colonne].attrib==0)
  • {
  • test=0;
  • affichage(nx,ny,tab);
  • couleur("1;31");
  • printf("Ceci est une case definition \n");
  • couleur("0");
  • }
  • if(tab[ligne][colonne].attrib==1)
  • {
  • test=0;
  • affichage(nx,ny,tab);
  • couleur("1;31");
  • printf("Ceci est une case noire \n");
  • couleur("0");
  • }
  • if(tab[ligne][colonne].attrib==3)
  • {
  • test=0;
  • affichage(nx,ny,tab);
  • couleur("1;31");
  • printf("Cette case a deja ete remplie par le joueur \n");
  • couleur("0");
  • }
  • if(tab[ligne][colonne].attrib==-1)
  • {
  • printf("Veuillez introduire votre valeur comprise entre 1 et 9 inclus : \n");
  • scanf("%d",&valeur);
  • if(valeur>0&&valeur<10)
  • {
  • if(verifregle(nx,ny,tab,ligne,colonne,valeur)==0||verifregle2(nx,ny,tab,ligne,colonne,valeur)==0)
  • {
  • affichage(nx,ny,tab);
  • couleur("1;31");
  • printf("Cette valeur se trouve deja sur la ligne et/ou la colonne, ou la somme n'est pas correcte \n");
  • couleur("0");
  • test=0;
  • }
  • else
  • {
  • tab[ligne][colonne].type='P';
  • tab[ligne][colonne].val[0]=valeur;
  • tab[ligne][colonne].attrib=3;
  • test=1;
  • }
  • }
  • else
  • {
  • couleur("1;31");
  • printf("La valeur introduire n'est pas comprise dans la fourchette\n");
  • printf("Veuillez recommencer\n");
  • couleur("0");
  • }
  • }
  • }
  • while(test==0);
  • }
  • /* Explication de la fonction SUPPRIMVALEUR */
  • /* Fonction pour supprimer la valeur d'une case */
  • /* Meme test que pour la fonction JEU, pour ne pas effacer n'importe quoi */
  • /* Si case ok, la valeur est supprimee et on repasse la case en type Z pour pouvoir reecrire dedans par la suite */
  • /* J'etais d'abord passe par une fonction pour modifier la valeur plutot que de la supprimer, mais cela pose */
  • /* des problemes au niveau des regles de verification */
  • void supprimvaleur(int nx,int ny,grille **tab)
  • {
  • int ligne,colonne,valeur,test;
  • do
  • {
  • printf("Veuillez entrer le numero de la ligne : \n");
  • scanf("%d",&ligne);
  • printf("Veuillez entrer le numero de la colonne : \n");
  • scanf("%d",&colonne);
  • if(tab[ligne][colonne].attrib==-1)
  • {
  • affichage(nx,ny,tab);
  • printf("Il n'y a rien a supprimer ici ici \n" );
  • test=0;
  • }
  • if(tab[ligne][colonne].attrib==0)
  • {
  • affichage(nx,ny,tab);
  • printf("Ceci est une case definition \n");
  • test=0;
  • }
  • if(tab[ligne][colonne].attrib==1)
  • {
  • affichage(nx,ny,tab);
  • printf("Ceci est une case noire \n");
  • test=0;
  • }
  • if(tab[ligne][colonne].attrib==3)
  • {
  • tab[ligne][colonne].type='Z';
  • tab[ligne][colonne].val[0]=valeur;
  • tab[ligne][colonne].attrib=-1;
  • printf("La valeur a ete supprimee \n");
  • test=1;
  • }
  • }
  • while(test==0);
  • }
  • /* Explication de la fonction AIDE */
  • /* Fonction pour l'aide sur les valeurs possibles que peut prendre une case */
  • /* Introduction par le joueur des coordonnees de la case */
  • /* Test des valeurs de 1 a 9 par les fonctions VERIFREGLE et VERIFREGLE2 */
  • /* Les valeurs retournees sont celles qui sont possibles d'introduire */
  • void aide(int nx,int ny,grille **tab, int ligne, int colonne)
  • {
  • int i;
  • printf("Solution possible : ");
  • for(i=1;i<10;i++)
  • {
  • if(verifregle(nx,ny,tab,ligne,colonne,i)==1&&verifregle2(nx,ny,tab,ligne,colonne,i)==1)
  • {
  • printf("%d est une valeur possible pour cette case \n", i);
  • }
  • }
  • printf("\n");
  • }
  • /* Explication de la fonction MENU2 */
  • /* Menu de JEU avec la grille */
  • /* 1. Entrer une valeur, permet d'entrer une valeur en appelant la fonction JEU */
  • /* 2. Supprimer une valeur, supprimer la valeur d'une case en appelant la fonction SUPPRIMVALEUR */
  • /* 3. Demander de l'aide, introduction des coordonnees par le joueur puis appel de la fonction AIDE */
  • /* 4. Resolution automatique, appel de la fonction resolutionautomatique ( BACKTRACKING ) */
  • /* 5. Sauvegarde de la partie, enregistre la partie dans un fichier txt en appelant la fonction SAUVEGARDE */
  • /* 6. Retour, retour au menu principal */
  • void menu2(int nx,int ny,grille **tab)
  • {
  • int ligne,colonne;
  • char choix2;
  • char fichier[20]="";
  • do
  • {
  • affichage(nx,ny,tab);
  • couleur("1;34");
  • printf("***** MENU DU JEU *****\n");
  • couleur("0");
  • couleur("31");
  • printf("-----------------------\n");
  • couleur("0");
  • printf("Que voulez-vous faire ?\n"
  • "1.Entrer une valeur\n"
  • "2.Supprimer une valeur\n"
  • "3.Demander de l'aide\n"
  • "4.Resolution automatique\n"
  • "5.Sauvegarde de la partie\n"
  • "6.Retour\n");
  • do
  • choix2=getchar();
  • while((int)choix2<49||(int)choix2>55);
  • switch ((int)choix2)
  • {
  • case 49 : jeu(nx,ny,tab);
  • break;
  • case 50 : supprimvaleur(nx,ny,tab);
  • break;
  • case 51 : printf("Entrez le numero de la ligne : \n");
  • scanf("%d",&ligne);
  • printf("Entrez le numero de la colonne : \n");
  • scanf("%d",&colonne);
  • aide(nx,ny,tab,ligne,colonne);
  • break;
  • case 52 : resolutionautomatique(nx,ny,tab);
  • break;
  • case 53 : sauvegarde(nx,ny,tab,fichier);
  • break;
  • }
  • }
  • while((int)choix2!=54);
  • }
  • /* Explication de la fonction MENU3 */
  • /* Menu de selection de difficulte de la grille */
  • /* 3 difficultes sont proposees */
  • /* Utilisation de la commande SPRINTF pour concatener les valeurs introduites par le joueur */
  • void menu3(int nx,int ny,grille **tab)
  • {
  • int choix3,choix4;
  • char fichier[20]="";
  • do
  • {
  • couleur("1;34");
  • printf("Selectionnez le niveau de difficulte\n");
  • couleur("0");
  • printf("-------------1.Facile---------------\n"
  • "-------------2.Moyen----------------\n"
  • "-------------3.Expert---------------\n"
  • "-------------4.Retour---------------\n");
  • scanf("%d",&choix3);
  • }
  • while(choix3<1 || choix3>4);
  • if((int)choix3!=4)
  • {
  • do
  • {
  • printf("Selectionnez votre grille de 1 a 5 : \n");
  • scanf("%d",&choix4);
  • }
  • while(choix4<1 || choix4>5);
  • sprintf(fichier,"grille%d%d.txt",choix3,choix4);
  • chargement(nx,ny,tab,fichier);
  • menu2(nx,ny,tab);
  • }
  • }
  • /* Explication de la fonction MAIN */
  • /* Menu de depart */
  • int main()
  • {
  • long int nx=9;
  • long int ny=9;
  • grille **tab;
  • char choix,fichier [20];
  • printf("\033[H\033[2J");
  • couleur("1;34");
  • printf( "*****************************************************************************************************************\n"
  • "*****************************************************************************************************************\n"
  • "** **\n"
  • "* *\n"
  • "* *\n"
  • "* *\n"
  • "* *\n"
  • "* *\n"
  • "* BIENVENUE DANS LE JEU KAKURO *\n"
  • "* *\n"
  • "* *\n"
  • "* *\n"
  • "** **\n"
  • "****************************************************************************************************************\n"
  • "****************************************************************************************************************\n");
  • printf("\n");
  • printf(" Tapez 1 pour Jouer\n "
  • " Tapez 2 pour charger une partie sauvegardee\n "
  • " Tapez 3 pour quitter le jeu\n");
  • do
  • {
  • choix=getchar();
  • while((int)choix<49 || (int)choix>52);
  • switch((int)choix)
  • {
  • case 49 : menu3(nx,ny,tab);
  • break;
  • case 50 : printf("Entrer le nom du fichier en specifiant son extension (.TXT) : \n");
  • scanf("%s",fichier);
  • chargement(nx,ny,tab,fichier);
  • menu2(nx,ny,tab);
  • break;
  • }
  • }
  • while((int)choix!=51);
  • return 0;
  • }
#include<stdio.h>
#include<stdlib.h>
#include"couleurs.h"

typedef struct element
{
	char type;
	int val[2];
	int attrib;
}grille;

/* Explication de la fonction INIT */
/* Fonction servant a initialiser le tableau pour eviter des problemes d'allocation */
/* de valeur dans les cases, pouvant causer des erreurs */

void init(int nx,int ny,grille **tab)
{
	int x,y;
	for(x=0;x<nx;x++)
	{
		for(y=0;y<ny;y++)
		{
			tab[x][y].type='Z';
			tab[x][y].val[0]=0;
			tab[x][y].val[1]=0;
			tab[x][y].attrib=-1;
		}
	}
}

/* Explication de la fonction AFFICHAGE */
/* En fonction du type attribue a chaque case, un affichage se distinque par le switch */
/* Le "default" equivalant aux cases blanches non-codees */

void affichage(int nx,int ny,grille **tab)
{
	int x,y,x2;
	printf("\033[H\033[2J");
	for(x=0;x<nx+1;x++)
	{
		couleur("31");
		printf("+-----");
		if(x==nx)
		{
			printf("+\n");
		}
	}
	for(x=0;x<nx;x++)
	{
		if(x==0)
		{
			printf("|     ");
		}
		printf("| %2d  ",x);
		if(x==nx-1)
		{
			printf("|\n");
		}
	}
	for(x=0;x<nx;x++)
	{
		for(x2=0;x2<nx+1;x2++)
		{
			couleur("31");
			printf("+-----");
			if(x2==nx)
			{
				printf("+\n");
			}
		}		
		for(y=0;y<ny;y++)
		{
			if(y==0)
			{
				couleur("31");
				printf("| %2d  ",x);
				couleur("0");
			} 
	 		couleur("31");	
			printf("|");
			couleur("0");
			switch (tab[x][y].type)
			{
				case 'D' : couleur("36");
					   printf("%2d\\%2d",tab[x][y].val[1],tab[x][y].val[0]);
					   couleur("0");
				  	   break;
				case 'N' : couleur("32");
					   printf("*****");
					   couleur("0");
					   break;
				case 'P' : couleur("33");
					   printf(" %2d  ",tab[x][y].val[0]);
					   couleur("0");
					   break;
				case 'B' : printf(" %2d  ",tab[x][y].val[0]);
					   break;
				default :  printf("     ");
					   break;
			} 
		}
		couleur("31");
		printf("|\n");
		couleur("0");
	}
	for(x=0;x<nx+1;x++)
	{
		couleur("31");
		printf("+-----");
		if(x==nx)
		{
			printf("+\n");
		}
		couleur("0");
	}
}

/* Explication de la fonction LOAD */
/* Fonction de lecture du fichier */
/* Lecture du fichier a partir de la commande FGETS */
/* Lecture ligne par ligne */
/* En fonction du premier caractere, je peux definir le masque pour la commande SSCANF et */
/* Ainsi recupere les differentes valeurs correspondant au type de la case, on rempli la structure */
/* et on termine en fermant le fichier */

void chargement(long int nx,long int ny,grille **tab,char fichier[20])
{
	char type,temp[14];
	int ligne,colonne,valeur1,valeur2,i,j;
	int compteur=0,drap=0;
	FILE *jeu; 
	jeu=fopen(fichier,"r"); 
	if(jeu==NULL) 
	{
		printf(" \n Fichier non charge \n");
	}
	else
	{
		printf(" Fichier %s charge \n",fichier);

/* Fonction de lecture du fichier. */
/* Attrib est specifique de ce que je peux faire, */
/* 0 affecte aux cases definitions, impossible de faire une action dessus. */
/* 1 affecte aux cases noires, impossible de faire une action dessus. */
/* -1 affecte aux cases blanches(Z), possibilite d'agir dessus */
/* 3 affecte aux cases predifinies, case remplie par le joueur, impossible d'agir dessus sauf en supprimant la valeur, */
/* et reaffectant la case en case blanche(Z) voir plus bas dans supprimvaleur */

		while(!feof(jeu))
		{
			fgets(temp,14,jeu);
			if(drap==0)
			{
				tab=(grille **)malloc(nx * sizeof(grille *));
				if(tab==NULL)
				{
					printf("\n Echec lors de l'allocation memoire!!!");
				}
				printf("La memoire allouee est de %d ",sizeof(grille*));
				for(i=0;i<nx;i++)
				{
     					tab[i] = (grille *)malloc(ny * sizeof(grille));
					printf("La memoire allouee est de %d\n",sizeof(grille));
    					if (tab[i] == NULL)
     					{
    						for (j=0;j<ny;j++)
     						{
  							printf("%d",j);
							free(tab[j]);
    							printf("\n Echec lors de l'allocation memoire!!!");
     						}
     				 	}
     				}
				drap=1;
			}
		if(temp[0]=='D')
		{
			sscanf(temp,"%c %d %d %d %d",&type,&ligne,&colonne,&valeur1,&valeur2);
			tab [ligne][colonne].attrib=0; 
			tab [ligne][colonne].type=type;
			tab [ligne][colonne].val[0]=valeur1;
			tab [ligne][colonne].val[1]=valeur2;
		}
		if(temp[0]=='N')
		{
			sscanf(temp,"%c %d %d",&type,&ligne,&colonne);
			tab [ligne][colonne].type=type;
			tab [ligne][colonne].attrib=1;
		}
		if(temp[0]=='B')
		{
			tab[ligne][colonne].attrib=-1;
		}
		if(temp[0]=='P')
		{
			sscanf(temp,"%c %d %d %d",&type,&ligne,&colonne,&valeur1);
			tab [ligne][colonne].type=type;
			tab [ligne][colonne].val[0]=valeur1;
			tab [ligne][colonne].attrib=3;
		}		
		compteur++;
		}
		fclose(jeu);
	}

}

/* Explication de la fonction SAUVEGARDE */
/* Fonction de sauvegarde du jeu */
/* On ouvre un fichier en ecriture, et ecrase l'ancien s'il y en a deja un nomme comme cela */
/* et on enregistre les donnees dedans */
/* Enregistrement case par case dans un fichier texte au meme format que les grilles de depart */

void sauvegarde(int nx,int ny,grille **tab,char fichier[20])
{
	int x,y;
	FILE *savegame;
	char nom_fic[20];
	printf("Veuillez entrer le nom du fichier : ");
	fgets(nom_fic,20,savegame);
	savegame=fopen(nom_fic,"w");
	if(savegame==NULL)
	{
		printf("Fichier non sauvegarde");
	}
	else
	{
		for(x=0;x<nx;x++)
		{
			for(y=0;y<ny;y++)
			{
				if(tab[x][y].type=='D')
				{
					fprintf(savegame,"%c %d %d %d %d\n",tab[x][y].type,x,y,tab[x][y].val[0],tab[x][y].val[1]);
				}	
				if(tab[x][y].type=='B'||tab[x][y].type=='N')
				{	
					fprintf(savegame,"%c %d %d\n",tab[x][y].type,x,y);
				}
				if(tab[x][y].type=='P')
				{
					fprintf(savegame,"%c %d %d %d\n",tab[x][y].type,x,y,tab[x][y].val[0]);
				}
			}
		}
	}
}

/* Explication de la fonction VERIFREGLE*/
/* Fonction de verification pour les lignes horizontales */
/* Premierement, on cherche la valeur de la case definition correspondant a la ligne */
/* Dont la valeur fait partie, de la on sait d'ou notre verification doit partir (valeur DEPART) */
/* Ensuite, on demarre du DEPART, on teste si la valeur se trouve deja sur la ligne */
/* Si elle se trouve sur la ligne, on retourne directement 0 */
/* Si la valeur ne se trouve pas sur la ligne, on verifie que la case est soit Blanche, soit Predefinie */
/* Si elle l'est, alors on fait la somme de la valeur actuelle avec les valeurs precedentes. */
/* Si a un moment donne, la colonne est differente de DEPART et que les cases sont differentes de B ou P */
/* On a une case vide en plus de celle que l'on veut attribuer et donc cela ne sert a rien de tester la somme */
/* En fin de fonction, on verifie les deux cas possibles et on retourne 1 si c'est possible ou 0 si ca ne l'est pas */

int verifregle(int nx,int ny,grille **tab,int ligne,int colonne,int valeur)
{
	int test=0,co,somme=valeur;
	int depart,def,echec=1;
	co=colonne;
	while(test==0)
	{
		if(tab[ligne][co-1].type=='D')
		{
			def=tab[ligne][co-1].val[0];
			depart=co;
			test=1;
		}
	co--;
	}
	for(depart=depart;depart<nx&&tab[ligne][depart].type!='N'&&tab[ligne][depart].type!='D';depart++)
	{	
		if(valeur!=tab[ligne][depart].val[0])
		{
			if(tab[ligne][depart].type=='P'||tab[ligne][depart].type=='B')
			{
				somme=somme+tab[ligne][depart].val[0];
			}
			else if(colonne!=depart)
				echec=0;
		}
		else
		{
			return 0;
		}
	}
	if( (echec==1&&somme==def)||(echec==0&&somme<def))
		return 1;
	else
		return 0;
}

/* Explication de la fonctoion VERIFREGLE2 */
/* Fonction de verification pour les lignes verticales */
/* Premierement, on cherche la valeur de la case definition correspondant a la colonne */
/* Dont la valeur fait paretie, de la sait d'ou notre verification doit partir (valeur DEPART) */
/* Ensuite, on demarre du DEPART, on teste si la valeur se trouve deja sur la colonne */
/* Si elle se trouve sur la ligben on retourne directement 0 */
/* Si la valeur ne se trouve pas sur la colonne, on verifie que la case est soit Blanche, soit Predefinie */
/* Si elle l'est, alors on fait la somme de la valeur actuelle avec les valeurs precedentes. */
/* Si a un moment donne, la ligne est differente de DEPART et que les cases sont differentes de B ou de P */
/* On a une case videen plus de celle que l'on veut attribuer et donc cela ne sert a rien de tester la somme */
/* En fin de fonction, on verifie les deux cas possibles et on retourne 1 si c'est possible ou 0 si ca ne l'est pas */

int verifregle2(int nx,int ny,grille **tab,int ligne,int colonne,int valeur)
{
	int test=0;
	int somme=valeur;
	int def,echec=1,depart,li;
	li=ligne;
	while(test==0)
	{
		if(tab[li-1][colonne].type=='D')
		{
			def=tab[li-1][colonne].val[1];
			depart=li;
			test=1;
		}
	li--;
	}
	for(depart=depart;depart<ny&&tab[depart][colonne].type!='N'&&tab[depart][colonne].type!='D';depart++)
	{	
		if(valeur!=tab[depart][colonne].val[0])
		{
			if(tab[depart][colonne].type=='P'||tab[depart][colonne].type=='B')
				somme=somme+tab[depart][colonne].val[0];		
			else if(ligne!=depart)
				echec=0;
		}
		else
		{
			return 0;
		}
	}
	if((echec==1&&somme==def)||(echec==0&&somme<def))
			return 1;
	else
			return 0;
}

/* Explication de BACKTRACKING */
/* Ne fonctionne pas correctement, plante sur la grille 32,34,35 */

int backtracking(int nx,int ny,grille **tab, int lig, int colo)
{
	int i=1;
	if(colo==ny)
	{
		lig=lig+1;
		colo=0;
	}
	while(tab[lig][colo].type=='D'||tab[lig][colo].type=='N'||tab[lig][colo].type=='P') /* Test pour voir le type de ligne */
	{	
		colo++;			/* Tant que c'est un des types test, on avance dans la colonne */
		if(colo==ny)		/* Si on arrive en fin de colonne, on avance d'une ligne et on reviens a la case 0 de la colonne */
		{
			lig=lig+1;
			colo=0;
		}
	}
	if((colo==0&&lig==nx)||(colo==ny&&lig==nx))   /*Sert a verifier que je suis a la fin du tableau*/
		return 1;
	else
	{
		while(i<10)  									/* Test tant que i est plus que 10 */
												/* Si les 2 regles sont verifiees, on change le type de */
												/* en case Blanche, on affecte la valeur de i a la case */
												/* Ensuite on teste ce que la fonction et la colonne */
												/* renvoie */
												/* Sinon on reaffecte un type vide a la case ainsi que la */
												/* valeur 0 */
												/* On incremente le compteur et on recommence */ 
		{
			if(verifregle(nx,ny,tab,lig, colo,i)==1 && verifregle2(nx,ny,tab,lig, colo,i)==1)
			{
				tab[lig][colo].type='B';
				tab[lig][colo].val[0]=i;
				if(backtracking(nx,ny,tab, lig,colo+1)==1)
					return 1;
			}
			else
			{ 
				tab[lig][colo].type='Z';
				tab[lig][colo].val[0]=0;
			}
			i++;
		tab[lig][colo].type='Z';
		tab[lig][colo].val[0]=0;
		}
		return 0;
	}
}
void resolutionautomatique(int nx,int ny,grille **tab)
{
	int colo=0,lig=0;
	/*fonction qui me permet de trouver le depart */
	if( backtracking(ny,nx,tab, colo, lig)==1 )
		printf("Solution possible\n");
	else 
		printf("solution impossible\n");
}

/* Explication de la fonction JEU */
/* Introduction des coordonnees de la case par le joueur */
/* Fonction de test de valeur introduite par le joueur */
/* Test de la case pour savoir si celle ci est libre ( type Z ) ou si elle correspond a un autre type */
/* Si la case est libre, introduction de la valeur par le joueur puis test de la valeur entree avec les */
/* fonction VERIFREGLE et VERIFREGLE2 */
/* Si test ok, la valeur est encodee, sinon on refais la boucle */

void jeu(int nx,int ny,grille **tab)
{
	int ligne,colonne,valeur,test;
	do
	{
		printf("Veuillez entrer le numero de la ligne : \n");
		scanf("%d",&ligne);
		printf("Veuillez entrer le numero de la colonne : \n");
		scanf("%d",&colonne);
		if(tab[ligne][colonne].attrib==0)
		{
			test=0;
			affichage(nx,ny,tab);
			couleur("1;31");
			printf("Ceci est une case definition \n");
			couleur("0");
		}
		if(tab[ligne][colonne].attrib==1)
		{
			test=0;
			affichage(nx,ny,tab);
			couleur("1;31");
			printf("Ceci est une case noire \n");
			couleur("0");
		}
		if(tab[ligne][colonne].attrib==3)
		{
			test=0;
			affichage(nx,ny,tab);
			couleur("1;31");
			printf("Cette case a deja ete remplie par le joueur \n");
			couleur("0");
			
		}
		if(tab[ligne][colonne].attrib==-1)
		{
			printf("Veuillez introduire votre valeur comprise entre 1 et 9 inclus : \n");
			scanf("%d",&valeur);
			if(valeur>0&&valeur<10)
			{
				if(verifregle(nx,ny,tab,ligne,colonne,valeur)==0||verifregle2(nx,ny,tab,ligne,colonne,valeur)==0)
				{
					affichage(nx,ny,tab);
					couleur("1;31");
					printf("Cette valeur se trouve deja sur la ligne et/ou la colonne, ou la somme n'est pas correcte \n");
					couleur("0");
					test=0;
				}
				else
				{
					tab[ligne][colonne].type='P';
					tab[ligne][colonne].val[0]=valeur;
					tab[ligne][colonne].attrib=3;
					test=1;
				}
			}
			else
			{
				couleur("1;31");
				printf("La valeur introduire n'est pas comprise dans la fourchette\n");
				printf("Veuillez recommencer\n");
				couleur("0");
			}
		}	
	}
	while(test==0);
}

/* Explication de la fonction SUPPRIMVALEUR */
/* Fonction pour supprimer la valeur d'une case */
/* Meme test que pour la fonction JEU, pour ne pas effacer n'importe quoi */
/* Si case ok, la valeur est supprimee et on repasse la case en type Z pour pouvoir reecrire dedans par la suite */
/* J'etais d'abord passe par une fonction pour modifier la valeur plutot que de la supprimer, mais cela pose */
/* des problemes au niveau des regles de verification */

void supprimvaleur(int nx,int ny,grille **tab)
{
	int ligne,colonne,valeur,test;
	do
	{
		printf("Veuillez entrer le numero de la ligne : \n");
		scanf("%d",&ligne);
		printf("Veuillez entrer le numero de la colonne : \n");
		scanf("%d",&colonne);
		if(tab[ligne][colonne].attrib==-1)
		{
			affichage(nx,ny,tab);
			printf("Il n'y a rien a supprimer ici ici \n" );
			test=0;
		}
		if(tab[ligne][colonne].attrib==0)
		{
			affichage(nx,ny,tab);
			printf("Ceci est une case definition \n");
			test=0;
		}
		if(tab[ligne][colonne].attrib==1)
		{
			affichage(nx,ny,tab);
			printf("Ceci est une case noire \n");
			test=0;
		}
		if(tab[ligne][colonne].attrib==3)
		{
			tab[ligne][colonne].type='Z';
			tab[ligne][colonne].val[0]=valeur;
			tab[ligne][colonne].attrib=-1;
			printf("La valeur a ete supprimee \n");
			test=1;
		}
	}
	while(test==0);

}



/* Explication de la fonction AIDE */
/* Fonction pour l'aide sur les valeurs possibles que peut prendre une case */
/* Introduction par le joueur des coordonnees de la case */
/* Test des valeurs de 1 a 9 par les fonctions VERIFREGLE et VERIFREGLE2 */
/* Les valeurs retournees sont celles qui sont possibles d'introduire  */

void aide(int nx,int ny,grille **tab, int ligne, int colonne)
{
	int i;
	printf("Solution possible : ");
	for(i=1;i<10;i++)
	{
		if(verifregle(nx,ny,tab,ligne,colonne,i)==1&&verifregle2(nx,ny,tab,ligne,colonne,i)==1)
		{
			printf("%d est une valeur possible pour cette case \n", i);
		}
	}
	printf("\n");
}

/* Explication de la fonction MENU2 */
/* Menu de JEU avec la grille */
/* 1. Entrer une valeur, permet d'entrer une valeur en appelant la fonction JEU */
/* 2. Supprimer une valeur, supprimer la valeur d'une case en appelant la fonction SUPPRIMVALEUR */
/* 3. Demander de l'aide, introduction des coordonnees par le joueur puis appel de la fonction AIDE */
/* 4. Resolution automatique, appel de la fonction resolutionautomatique ( BACKTRACKING ) */
/* 5. Sauvegarde de la partie, enregistre la partie dans un fichier txt en appelant la fonction SAUVEGARDE */
/* 6. Retour, retour au menu principal  */

void menu2(int nx,int ny,grille **tab)
{
	int ligne,colonne;
	char choix2;
	char fichier[20]="";
	do
	{
		affichage(nx,ny,tab);
		couleur("1;34");
		printf("***** MENU DU JEU *****\n");
		couleur("0");
		couleur("31");		
               	printf("-----------------------\n");
		couleur("0");
		printf("Que voulez-vous faire ?\n"
                       "1.Entrer une valeur\n"
		       "2.Supprimer une valeur\n"	
                       "3.Demander de l'aide\n"
                       "4.Resolution automatique\n"
	  	       "5.Sauvegarde de la partie\n"
                       "6.Retour\n");
		do
			choix2=getchar();
		while((int)choix2<49||(int)choix2>55);
		switch ((int)choix2)
		{
			case 49 : jeu(nx,ny,tab);
			          break;
			case 50 : supprimvaleur(nx,ny,tab);
			          break;
			case 51 : printf("Entrez le numero de la ligne : \n");
			          scanf("%d",&ligne);
				  printf("Entrez le numero de la colonne : \n");
				  scanf("%d",&colonne);
				  aide(nx,ny,tab,ligne,colonne);
			          break;
			case 52 : resolutionautomatique(nx,ny,tab);
				  break;
			case 53 : sauvegarde(nx,ny,tab,fichier);			 			 
				  break;
		}
	}
	while((int)choix2!=54);
}

/* Explication de la fonction MENU3 */
/* Menu de selection de difficulte de la grille */
/* 3 difficultes sont proposees */ 
/* Utilisation de la commande SPRINTF pour concatener les valeurs introduites par le joueur */

void menu3(int nx,int ny,grille **tab)
{
	int choix3,choix4;
	char fichier[20]="";
	do
	{	
		couleur("1;34");
		printf("Selectionnez le niveau de difficulte\n");
		couleur("0");
		printf("-------------1.Facile---------------\n"
		       "-------------2.Moyen----------------\n"
		       "-------------3.Expert---------------\n"
		       "-------------4.Retour---------------\n");
		scanf("%d",&choix3);
	}
	while(choix3<1 || choix3>4);
	if((int)choix3!=4) 
	{
		do
		{
			printf("Selectionnez votre grille de 1 a 5 : \n");
			scanf("%d",&choix4);
		}
		while(choix4<1 || choix4>5);
			sprintf(fichier,"grille%d%d.txt",choix3,choix4);
			chargement(nx,ny,tab,fichier);
			menu2(nx,ny,tab);
	}
}

/* Explication de la fonction MAIN */
/* Menu de depart  */

int main()
{
	long int nx=9;
	long int ny=9;
	grille **tab;
	char choix,fichier [20];
	printf("\033[H\033[2J");
	couleur("1;34");
	printf( "*****************************************************************************************************************\n"
		"*****************************************************************************************************************\n"
		"**													       **\n"
		"*														*\n"
		"*														*\n"
		"*														*\n"
		"*														*\n"
		"*														*\n"
		"*					BIENVENUE DANS LE JEU KAKURO						*\n"
		"*														*\n"
		"*														*\n"
		"*														*\n"
		"**													       **\n"
		"****************************************************************************************************************\n"
		"****************************************************************************************************************\n");
		printf("\n");
		printf("  Tapez 1 pour Jouer\n "
		       " Tapez 2 pour charger une partie sauvegardee\n "
                       " Tapez 3 pour quitter le jeu\n");
		do
		{
			choix=getchar();
		while((int)choix<49 || (int)choix>52);
		switch((int)choix)
		{	
			case 49 : menu3(nx,ny,tab);
				  break;
			case 50 : printf("Entrer le nom du fichier en specifiant son extension (.TXT) : \n");
				  scanf("%s",fichier);
				  chargement(nx,ny,tab,fichier);
				  menu2(nx,ny,tab);
				  break;
		}
	}
	while((int)choix!=51);
	return 0; 
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source avec une capture ANIMATIION GRAPHIQUE DES STRUCTURES DE DONNÉES par algoro
PILOTAGE DES 8 SORTIES DU PORT // par cedpic
Source avec Zip PARALLEL OBJECT PROGRAMMING IN C++ (POP-C++) : DEMO par lwinkler
Source avec Zip VOTE ELECTRONIQUE par luvianne
Source avec une capture REMOTE POST PHP WITH SOCKET LINUX par 0x0syscall

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PLUS OU MOINS par antho974
Source avec Zip JEU DE DAMES 3D par vbclaude
Source avec Zip JEU: MARIO SOKOBAN par astro53
Source avec Zip JEU PUISSANCE IV par ElendilAranwe
Source avec une capture MULTIPLICATIONS: PETIT EXERCICE DE MATHS par gmorris

Commentaires et avis

Commentaire de uko le 19/05/2007 14:44:13

Bonjour clmercutio, ton souci vient du fait que tu n'a pas réservé de mémoire pour ta grille dans main. Du coup, à la ligne 82, ton switch fait appel à des variables non allouées en mémoire et tu obtiens ton message d'erreur.

Il faut allouer par malloc de la place pour ton tableau de tableau d'élément puis pour chaque ligne :

        int taille_tab = 0, i;
taille_tab = nx*ny;
tab = (element **) malloc(taille_tab * sizeof(element *));
if (tab == NULL)
{
printf("Erreur d'allocation mémoire pour initialiser la grille\n");
exit(EXIT_FAILURE);
}
for (i=0; i< ny; i++)
{
tab[i] = (element *) malloc(nx * sizeof(element));
}
init(tab);

NB : a la fin du main(), ne pas oublier de désallouer la mémoire

for(i=0; i< ny; i++)
{
free(tab[i]);
}
free(tab);

Sinon, juste un point parmi d'autres : vu que nx et ny ne servent que pour définir la taille de ta grille,
déclare les en début de programme par un #define (donc ce ne seront plus des variables qui coutent 4 octets chacune).

#define nx 9
#define ny 9

Retire ensuite dans les fonctions et les appels de fonction nx et ny. Tes fonctions en deviendront donc plus lisibles.

Vu que tu as déclaré stdlib, tu peux utiliser return EXIT_SUCCESS au lieu de return 0 (ca ne change pas grand chose, mais ça pourra être utile avec des outils comme un débugger par exemple qui le repère) et dans le même registre EXIT_FAILURE.

Evite les menu2, menu3, etc... Sur un plus gros projet, tu y perdras ton latin. Utilise plutôt menu_difficulte, menu_jeu, etc...

pour les commentaires, tu n'est pas obligé de faire /* et */ sur chaque ligne. Par exemple, pour les commentaires du menu init, tu aurais pu écrire

/* Explication de la fonction INIT
* Fonction servant a initialiser le tableau pour eviter des problemes d'allocation
* de valeur dans les cases, pouvant causer des erreurs
*/

NB : les * en début de ligne 2 et 3, c'est juste pour aligner le texte

Tu peux aussi utiliser // pour un commentaire sur une ligne.

Enfin, prends l'habitude de déclarer les fonctions locales saisies dans main en mode static, c'est pour éviter les problèmes de conflits de noms lorsque tu travailles avec plein de fichiers .c. Tu ajoutes static en début de fonction, c'est tout.

Voilà, bonne continuation. Désolé pour mon commentaire un peu long.

Commentaire de clmercutio le 19/05/2007 15:30:52

Je suis d'accord avec toi pour les #define mais si tu lis tout mon post, je dois recupére la longueur et la largeur du tableau en le lisant dans le fichier grille.
Donc ce n'est que temporaire et uniquement pour me permettre d'avoir le tableau et de continuer la suite de mon projet. Mais merci de ton aide. Aide que a mon avis je solliciterai encore. :)

Commentaire de clmercutio le 19/05/2007 15:43:18

En tout merci, ca m'enlève une epine du pied. Maintenant que je sais ce que je dois, je peux rectifier mon code en conséquence.

Commentaire de clmercutio le 19/05/2007 15:53:09

Après rectification de mon code, la grille s'affiche bien seul hic, c'est que les cases sont vides :(

Commentaire de uko le 19/05/2007 17:27:04

J'essayerai de comprendre pourquoi et de t'aider plus si j'en ai le temps, car j'en ai très peu malheureusement. En attendant, les fonctions verifregle posent problème. Déjà, ligne 276 et 326, tu initialises la variable départ dans les for avec départ départ elle-même. Autrement dit, la variable de départ n'est jamais correctement initialisée car si tu n'entres pas dans ton if, depart n'est initialisée nulle part avec une valeur, ce qui donne un comportement aléatoire à cette fonction. De plus, si tu tentes de saisir une valeur à la ligne 0 et la colonne 0 de ta grille, les variables li et co ligne 268 et 318 valent -1 et j'obtiens un memory core dumped.

Commentaire de clmercutio le 19/05/2007 17:39:19

oki je te remercie, je cherche aussi de mon coté et je post si je trouve solution. Mais c'est vrai que le fait de passer le tableau de statique a dynamique pose des problèmes par rapport a mon premier code qui marchait pas mal.

Commentaire de uko le 20/05/2007 09:30:29

Bonjour Clmercutio,

  Il faut que tu supprimes toute la partie entre la ligne 152 et 174 si tu veux que ton affichage fonctionne. Comme la taille de ta grille dépendra du fichier, tu devras donc avoir une fonction qui te donne la taille de ta grille avant de la charger puis faire ton malloc dans le main en fonction du résultat.

Bon courage pour la suite.

Commentaire de thor_le_asgard le 26/05/2007 20:08:22

"En attendant, les fonctions verifregle posent problème. Déjà, ligne 276 et 326, tu initialises la variable départ dans les for avec départ départ elle-même. Autrement dit, la variable de départ n'est jamais correctement initialisée car si tu n'entres pas dans ton if, depart n'est initialisée nulle part avec une valeur, ce qui donne un comportement aléatoire à cette fonction. De plus, si tu tentes de saisir une valeur à la ligne 0 et la colonne 0 de ta grille, les variables li et co ligne 268 et 318 valent -1 et j'obtiens un memory core dumped."

C'est normal et fait exprès. Dans tous les cas, on rentrera dans le if car si tu regarde un peu mieux le code, c'est fait de telle manière a ce que tu rentre dedans. Dans une autre fonction, je vérifie que quand je rentre une valeur en 0 0, ou dans une case noire, définition, que je sache pas mettre de valeur dedans !!

Voila bonne journée
Voila bonne journée

Commentaire de uko le 27/05/2007 22:38:02

J'étais allé trop vite la semaine dernière en répondant à CLMercutio. Merci pour cette précision.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

jeu des chiffres exact [ par mounmoun45 ] salut a tous, Je souhaitreais réaliser un jeu des chiffres "exact" en utilisant les piles ou les arbres de langage c ,et j'ai besoin de votre aide.l Problème de son [ par splifo ] Bonjour,Je voudrais arrêter le son d'un jeu video à partir d'un programme externe sans arrêter le son de l'ordinateur.J'ai pensé à récupérer la variab recherche mot dans un boggle [ par raziel50 ] slt comment est il possible de chercher une chaine de caracteres dans une grille du jeu boggle en c++.j'ai charge un dictionnaire et je voudrais pouvo Jeu de plateforme : balle [ par ketinu ] Bonjour à tous,J'ai un projet à effectuer pour les cours. Il consiste à créer un jeu, le jeu que je souhaite créer est un jeu de plateforme : une ball Jeu du chiffre croisé [ par benhmida ] bonjour mes amis. je suis nouveau, je viens de m"inscrire dans votre site de codes sources et j'espère que ça va bcp m'aider.           je vous remerc gestion des timers [ par malbackt ] Bonjour à tous;  J'ai un jeu réalisé en opengl, son but est de parcourir une labyrinthe et de tuer tous les monstres qu'y existent;le problème c'est q jeu SDL [ par uzixucf ] bonjour tout le monde, je suis nouveau d'entre vousje suis entrain de developper un jeu en SDL (language C)  qui se présente ainsi                     Code d'initialisation de DirectX 9 [ par cathylarainette ] J'ai telechargé un jeu de motos(SBK08) et tout s'instale sauf directX 9.Je cherche partout comment initialiser directX 9.Mon jeu ne peut pas s'ouvrir.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales