Un petit beug que je n'arrive pas à corriger ! - C - Programmation
Marsh Posté le 03-11-2014 à 16:51:19
Si vous m'aidez à me débeuguer, je vous offrirai 20 euros paypal ! Mais c'est super urgent svp
Marsh Posté le 03-11-2014 à 17:08:00
http://hiko-seijuro.developpez.com/articles/ddd/
Marsh Posté le 03-11-2014 à 17:09:54
Nan mais ca compile, c est juste que le programme s'arrête plus de rechercher des combinaisons apres...
Marsh Posté le 03-11-2014 à 19:13:16
!
J'ai un peu la flemme de rentrer ton code dans un compilateur
Par contre, j'ai 2 remarques quand même :
Code :
|
Tu ne testes pas si l'indice de ton tableau est supérieur à la taille maximale de celui-ci
Marsh Posté le 03-11-2014 à 19:42:10
recherche_combi appelle nettoyage, qui appelle recherche_combi...
C'est surement de ce côté que tu risques d'avoir une boucle infinie.
A+,
Marsh Posté le 03-11-2014 à 19:42:35
hum en variable globale int lettre[5]={0};
ouais je vois bien qu'il y a une boucle qui déconne mais je sais pas laquelle justement
Marsh Posté le 03-11-2014 à 19:44:51
Soileh a écrit : ! |
Surtout qu'il manquer deux }} a la fin de menu pour que cela compile (un simple formatage sous emacs le montre).
A+,
Marsh Posté le 03-11-2014 à 19:48:09
ussxflintx a écrit : hum en variable globale int lettre[5]={0}; |
d’où l'intérêt d'exécuter le code sous un débugger (tu lances, tu exécutes, quand tu penses être dans la boucle infinie, tu fais une interruption d'arrêt, et tu regardes ta pile d'appel).
A+,
Marsh Posté le 03-11-2014 à 19:52:16
J'ai corrigé mais le truc c'est que ca pas changer si à la fin de netoyage j'arrete d'appeler recherche combi..
Marsh Posté le 03-11-2014 à 19:54:34
ussxflintx a écrit : hum en variable globale int lettre[5]={0}; |
Non, dans le code posté, on a char lettres[6]; tableau qui n'est jamais modifié par le reste du code, d'ailleurs.
A+,
Marsh Posté le 03-11-2014 à 20:40:33
ton tableau lettres[6] te sert pour faire quoi ?
Marsh Posté le 03-11-2014 à 21:10:12
c'est juste pour rechercher l'indice de la lettre du score
Marsh Posté le 03-11-2014 à 22:01:25
On dirait aussi qu'il manque du code dans ce que tu as posté
Il manque par exemple les fonctions actu2( ), actu3( ),...
Marsh Posté le 03-11-2014 à 22:52:33
En suivant les indications de Gilou, j'ai commenté la ligne recherche_combi() dans la fonction nettoyage( ), et ça a l'air de ne plus boucler
Par contre, je pense qu'il y a un problème de rafraîchissement, ce qui cause le clignotement de la grille
Marsh Posté le 04-11-2014 à 11:19:49
Oui, mais si on rentre dans tous les problèmes de son code, on n'a pas fini (menu qui appelle récursivement menu par exemple ).
Pour ce genre de problème, qu'il n'y ait pas une fonction à part dont le seul boulot soit d'afficher la matrice , ça montre que ça a été codé à vue, et non avec une phase de conception avec découpage en fonctionnalités au préalable.
A+,
Marsh Posté le 03-11-2014 à 16:35:16
Salut à toutes et à tous !
Je suis un novice en info mais mon école d'ingé m'a demandé de faire un genre de candy crush.. Un plantamiz quoi. Le but est de déplacer son curseur à l'endroit de la matrice souhaité. On appuie ensuite sur espace pour sélectionner le caractère et le faire passer en minuscule. Ensuite, soit on appuie sur 2 4 6 ou 8 pour intervertir sa position avec celle de celui placé en haut, à droit, en bas ou à gauche de celui sélectionné. L'ordinateur scan ensuite la matrice pour voir s'il y a des combinaisons... C'est jsutement là que mon programme plante... Il rentre dans une boucle infini et je sais pas pourquoi... j'ai VRAIMENT besoin de votre aide svp !
Voici la code
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <unistd.h>
#include <strings.h>
//Prototypes de nos sous-programmes
void souris();
void actu1();
void apport1();
void test();
void restaure(FILE * fic3);
void gravite(char matrice[10][15], int x, int y);
void grille1();
int nettoyage(int modeleTrouve, int lig, int col);
int verificationModele(int lig,int col);
//Déclaration des ressources
int b,a,x,y,z,m,q,t,lvl,col,lig,cas,nbreFruitsSuppr,fruit,n,nbLettres,essai=0,score1=0,score2=0,score3=0,score4=0,score5=0;
char matrice[10][15],touche,carret,mem,choix,h;
char nom[50];
char modele[23][5][6]={'0'};
char typeNettoyage[23]={'M'};
char bareme[23]={0};
char lettres[6];
char score[5];
int nbcol[23]; int nblig[23];
void recherche_combi()
{
int i,j;
int cas;
int nbreFruitsSuppr;
int fruit;
for(i=0;i<10;i++)
{
for (j=0;j<15;j++)
{
cas = verificationModele(i,j);
if (cas != -1)
{
fruit=matrice[i][j];
nbreFruitsSuppr=nettoyage(cas,i,j);
points_fruits(cas,nbreFruitsSuppr,fruit);
}
}
}
}
int verificationModele(int lig,int col)
{
int i=0, j=0, trouve=1, m=0, modeleTrouve=-1;
char caractereAnalyse=matrice[lig][col];
m=0;
while ((m<23)&&(modeleTrouve==-1))
{
i=0;
if (((lig+nblig[m])<10)&&((col+nbcol[m])<15))
trouve=1;
else
trouve=0;
while ((i<5)&&(trouve==1))
{
j=0;
while ((j<5)&&(trouve==1))
{
if (modele[m][i][j]=='1')
{
if (matrice[i+lig][j+col]!=caractereAnalyse)
trouve=0;
}
j++;
}
i++;
}
if (trouve==0)
{
m++;
}
else {modeleTrouve=m;}}
return modeleTrouve;
}
int nettoyage(int modeleTrouve,int lig,int col)
{
int i,j;
int k;
int g[10]={0};
char x;
int w;
int nbreFruitsSuppr=0;
char caractere=matrice[lig][col];
if (typeNettoyage[modeleTrouve]=='T')
{
for(i=0;i<10;i++)
{
for (j=0;j<15;j++)
{
if (matrice[i][j]==caractere)
{
matrice[i][j]=' ';
nbreFruitsSuppr++;
}
}
}
}
if (typeNettoyage[modeleTrouve]=='M')
{
for(i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
if (modele[modeleTrouve][i][j]=='1')
{
matrice[i+lig][j+col]=' ';
}
}
}
}
for (t=0;t<10;t++)
{
test();
if (q!=0)
{
for (k=0;k<10;k++)
{
for (j=0;j<15;j++)
{
for (i=0; i<10; i++)
{
if(matrice[i][j] == ' ')
{
g[k]=g[k]+1;
}
}
}
w=g[0];
for (k=0;k<10;k++)
{
if (g[k]>w)
{
w=g[k];
}
}
i=0;
for (j=0;j<15;j++)
{
if (matrice[i][j]==' ')
{
x=rand()%5;
switch(x)
{
case 0:
Color(9,16);
x='S';
break;
case 1:
Color(12,16);
x='F';
break;
case 2:
Color(10,16);
x='P';
break;
case 3:
Color(8,16);
x='O';
break;
case 4:
Color(14,16);
x='M';
break;
}
matrice[i][j]=x;
}}
if (lvl==1){actu1();}
else if(lvl==2){actu2();}
else {actu3();}
gravite(matrice,8,0);
}} recherche_combi();
//ralentir l'action pour bien voir le déroulement du phénomène
}
return nbreFruitsSuppr;}
void points_fruits(int cas, int nbreFruitsSuppr, char fruit)
{
int i=0;
while (lettres[i]!=fruit)
i++;
if(nbreFruitsSuppr==0)
score[i]+=bareme[cas];
else score[i]+=nbreFruitsSuppr;
}
void grille1()
{
int i,j;
system("cls" );
system("Color 0F" );
srand(time(NULL));
//Initialisation du niveau
lvl=1;
//Creation matrice
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
{
x=rand()%5;
switch(x)
{
case 0:
Color(9,16);
matrice[i][j]='S';
break;
case 1:
Color(12,16);
matrice[i][j]='F';
break;
case 2:
Color(10,16);
matrice[i][j]='P';
break;
case 3:
Color(8,16);
matrice[i][j]='O';
break;
case 4:
Color(14,16);
matrice[i][j]='M';
break;
}
//Affichage
printf("%c ", matrice[i][j]);
}
//Affichage
printf ("\n\n" );
}
//Interface joueur
printf("\nPlayer : %s \nScore1 : %d /15 Score2 : %d /25 Score3 : %d /30 essais : %d /50 ",nom,score1,score2,score3,essai);
printf("\n\nP pour quitter en sauvegardant et revenir au menu" );
printf("\n\n2 pour aller vers le bas 8 pour aller vers le haut\n4 pour aller a gauche 6 pour aller a droite" );
col= 0;
gotoligcol(0,0);
Color(0,0);
//Contrat niveau 1
//Préparation d'une matrice sans possibilités inexploités... Pure de toute combinaison
souris();
}
void menu()
{
SetConsoleTitle("Plantamiz 2014" );
system("Color F0" );
FILE * fic = NULL;
fic = fopen("sauvegardenom.txt","w" );
if (fic !=0)
{
//Nouvelle Partie
system("cls" );
printf("Attention, une nouvelle partie entrainera le suppression de votre ancienne sauvegarde \nSouhaitez vous continuer ?" );
printf("\n\nTapez 1 pour continuer Tapez 2 pour annuler\n\n" );
z=0;
do
{
//Blindage
if (z==1)
{
system("cls" );
fflush(stdin);
printf("Erreur saisir 1 ou 2 !\n\n" );
printf("\n\nTapez 1 pour continuer Tapez 2 pour annuler\n\n" );
fflush(stdin);
scanf("%c", &h);
printf("\n" );
}
else
{
z=1;
fflush(stdin);
scanf("%c",&h);
}
}
while((h!='1')&&(h!='2'));
switch(h)
{
case '1':
printf("\n\nSaisissez votre nom: " );
fflush(stdin);
gets(nom);
fprintf(fic,"%s",nom);
fclose(fic);
grille1();
break;
case '2':
printf("\n\nAnnulation effectuee, retour menu !\n\n" );
system("PAUSE" );
system("cls" );
menu();
break;}
void souris()
{
int i,j;
a= (lig / 2);
b= (col / 2);
n= 0;
//Test du niveau actuel
gotoligcol(0,0);
while(carret ==0)
{
//recherche_combi(matrice);
if (kbhit())
{
touche=getch();
fflush(stdin);
switch (touche)
{
case '4':
//Si caractère sélectionné en minuscule, on switch sa position avec celui souhaité
if ((matrice[a][b]<123)&&(matrice[a][b]>96)&&(b > 0))
{
essai=essai+1;
//Switch prosition
mem=matrice[a][b-1];
matrice[a][b-1]=matrice[a][b];
matrice[a][b-1]=matrice[a][b-1]-32;
matrice[a][b]=mem;
recherche_combi();
//Recherche combinaisons + affichage
n=n+1;
}
col= col-2;
b= b-1;
if(col <= 0)
{
col= 0;
b= 0;
}
gotoligcol(lig,col);
break;
case '2':
if ((matrice[a][b]<123)&&(matrice[a][b]>96)&&(a < 9))
{
essai=essai+1;
mem=matrice[a+1][b];
matrice[a+1][b]=matrice[a][b];
matrice[a+1][b]=matrice[a+1][b]-32;
matrice[a][b]=mem;
recherche_combi();
n= n+1;
}
lig= lig+2;
a=a+1;
if(lig >= 18)
{
lig= 18;
a= 9 ;
}
gotoligcol(lig,col);
break;
case '8':
if ((matrice[a][b]<123)&&(matrice[a][b]>96)&&(a > 0))
{
essai=essai+1;
mem=matrice[a-1][b];
matrice[a-1][b]=matrice[a][b];
matrice[a-1][b]=matrice[a-1][b]-32;
matrice[a][b]=mem;
recherche_combi();
n= n+1;
}
lig=lig-2;
a=a-1;
if(lig <= 0)
{
lig= 0;
a=0;
}
gotoligcol(lig,col);
break;
case '6':
if ((matrice[a][b]<123)&&(matrice[a][b]>96)&&(b < 14))
{
essai=essai+1;
mem=matrice[a][b+1];
matrice[a][b+1]=matrice[a][b];
matrice[a][b+1]=matrice[a][b+1]-32;
matrice[a][b]=mem;
recherche_combi();
n=n+1;
}
col=col+2;
b=b+1;
if(col >= 28)
{
col= 28;
b= 14;
}
gotoligcol(lig,col);
break;
case 'p':
;
//Sauvegarde
FILE * fic1= fopen("sauvegardenom.txt","w" );
FILE * fic2= fopen("sauvegardescore1.txt","w" );
FILE * fic3= fopen("sauvegardematrice.txt","w" );
FILE * fic4= fopen("sauvegardeessai.txt","w" );
FILE * fic5= fopen("sauvegardescore2.txt","w" );
FILE * fic6= fopen("sauvegardescore3.txt","w" );
FILE * fic7= fopen("sauvegardescore4.txt","w" );
FILE * fic8= fopen("sauvegardescore5.txt","w" );
FILE * fic9= fopen("sauvegardelvl.txt","w" );
if((fic1!=0)&&(fic2!=0)&&(fic3!=0)&&(fic4!=0)&&(fic5!=0)&&(fic6!=0)&&(fic7!=0)&&(fic8!=0)&&(fic9!=0))
{
fprintf(fic1,"%s",nom);
fprintf(fic2,"%d",score1);
fprintf(fic5,"%d",score2);
fprintf(fic6,"%d",score3);
fprintf(fic7,"%d",score4);
fprintf(fic8,"%d",score5);
fprintf(fic4,"%d",essai);
fprintf(fic9,"%d",lvl);
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
{
fputc(matrice[i][j], fic3);
}
}
fclose(fic1);
fclose(fic2);
fclose(fic3);}
else {printf("\nErreur sauvegarde impossible !" );}
system ("cls" );
printf("Progression sauvegardee ! \n\n" );
menu();
break;
//Passage du caractère sélectionné de Majuscule à minuscule
case ' ' :
n=n+1;
if (((n%2) == 0)&&(matrice[a][b]<132)&&(matrice[a][b]>96))
{
matrice[a][b]=matrice[a][b]-32;
if (lvl==1){actu1();}
else if(lvl==2){actu2();}
else {actu3();}
}
if (((n%2) != 0)&&(matrice[a][b]<91)&&(matrice[a][b]>64))
{
matrice[a][b]= matrice[a][b]+32;
if (lvl==1){actu1();}
else if(lvl==2){actu2();}
else {actu3();}
}
break;
case 27 :
z=0;
system("cls" );
system("Color F0" );
printf("ETES VOUS SUR DE VOULOIR QUITTER SANS SAUVEGARDER ?" );
printf("\n\nTapez 1 pour oui Tapez 2 pour non\n\n" );
fflush(stdin);
scanf("%c",&z);
switch (z)
{
case '1':
system("cls" );
printf("Merci d'avoir joue a Plantamiz 2014\n\n\n" );
system("PAUSE" );
exit(0);
break;
default:
system("cls" );
system("Color F0" );
printf("Reprise du jeu\n\n" );
system("PAUSE" );
if (lvl==1){actu1();}
else if(lvl==2){actu2();}
else {actu3();}
souris();
break;
}
break;
}
gotoligcol(lig,col);
}
}
}
void actu1()
{
int i,j;
if ((score1<15)&&(score2<25)&&(score3<30))
{
if (essai<50)
{
system("cls" );
for(i=0; i<10; i++)
{
for(j=0; j<15; j++)
{
switch(matrice[i][j])
{
case 'S' : Color(9,16); break;
case 's' : Color(9,16); break;
case 'F' : Color(12,16); break;
case 'f' : Color(12,16); break;
case 'P' : Color(10,16); break;
case 'p' : Color(10,16); break;
case 'O' : Color(8,16); break;
case 'o' : Color(8,16); break;
case 'M' : Color(14,16); break;
case 'm' : Color(14,16); break;
case ' ' : matrice[i][j]=' '; break;
}
printf("%c ", matrice[i][j]);
}
printf("\n\n" );
}
printf("\nPlayer : %s \nScore1 : %d /15 Score2 : %d /25 Score3 : %d /30 essais : %d /50 ",nom,score1,score2,score3,essai);
printf("\n\nP pour quitter en sauvegardant et revenir au menu" );
printf("\n\n2 pour aller vers le bas 8 pour aller vers le haut\n4 pour aller a gauche 6 pour aller a droite" );
gotoligcol(lig,col);}
else
{
//Echec contrat
system("cls" );
printf("\n\nDommage vous n'avez pas réussi... Allez ressayez !" );
system("PAUSE" );
grille1();
}}
else
//Level up !
{lvl=lvl+1;grille2();}
}
void gravite(char matrice[10][15] , int x, int y)
{
if (x==9)
gravite(matrice,8,y);
if ((matrice[x][y]==' ')||(matrice[x+1][y]!=' '))
{
if (x!=0)
{gravite(matrice,x-1,y);
Sleep(0.01);}
else
{
if(y!=14)
gravite(matrice,8,y+1);
Sleep(0.01);
return;
}
}
else
{
matrice[x+1][y]=matrice[x][y];
Sleep(0.01);
matrice[x][y]=' ';Sleep(0.01);
gravite(matrice,x+1,y);Sleep(0.01);
}
}
//Sous-programme générant de nouveaux caractères losque le haut de la matrice est vide
// sous programme test
void test()
{
int i,j;
q=0;
i=0;
for (j=0;j<15;j++)
{
if (matrice[i][j] != ' ')
{
q=q+1;
}
}
}
//Le main...
int main()
{
menu();
return 0;
}
svp.... merci de votre aide !