Un petit beug que je n'arrive pas à corriger !

Un petit beug que je n'arrive pas à corriger ! - C - Programmation

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 !
 
 

Reply

Marsh Posté le 03-11-2014 à 16:35:16   

Reply

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

Reply

Marsh Posté le 03-11-2014 à 17:08:00    

http://hiko-seijuro.developpez.com/articles/ddd/


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

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...

Reply

Marsh Posté le 03-11-2014 à 19:13:16    

:hello: !

 

J'ai un peu la flemme de rentrer ton code dans un compilateur :/ [:cupra]

 

Par contre, j'ai 2 remarques quand même [:cupra] :

  • Si tu as une boucle infinie, c'est que tu as surement un while avec une condition qui n'est jamais remplie. Pour moi, cela pourrait être celle-ci  :whistle:  :
Code :
  1. void points_fruits(int cas, int nbreFruitsSuppr, char fruit)
  2. {
  3.      int i=0;
  4.    while (lettres[i]!=fruit)
  5.         i++;
  6. if(nbreFruitsSuppr==0)
  7.      score[i]+=bareme[cas];
  8. else score[i]+=nbreFruitsSuppr;
  9. }


Tu ne testes pas si l'indice de ton tableau est supérieur à la taille maximale de celui-ci  [:er dehy:3]

  • Jai du mal à voir aussi à quel moment tu initialises ton tableau lettres[] :/


 :jap:

Message cité 1 fois
Message édité par Soileh le 03-11-2014 à 19:13:38

---------------
And in the end, the love you take is equal to the love you make
Reply

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :/

Reply

Marsh Posté le 03-11-2014 à 19:44:51    

Soileh a écrit :

:hello: !
 
J'ai un peu la flemme de rentrer ton code dans un compilateur :/ [:cupra]


Surtout qu'il manquer deux }} a la fin de menu pour que cela compile (un simple formatage sous emacs le montre).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-11-2014 à 19:48:09    

ussxflintx a écrit :

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 :/

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-11-2014 à 19:48:25    

Oh ! att je vais vérifier !

Reply

Marsh Posté le 03-11-2014 à 19:48:25   

Reply

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..

Reply

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+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-11-2014 à 20:09:57    

Je pense que le problème vient de ma recher_combi..

Reply

Marsh Posté le 03-11-2014 à 20:40:33    

ton tableau lettres[6] te sert pour faire quoi ? :??:


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 03-11-2014 à 21:10:12    

c'est juste pour rechercher l'indice de la lettre du score

Reply

Marsh Posté le 03-11-2014 à 22:01:25    

On dirait aussi qu'il manque du code dans ce que tu as posté  [:er dehy:3]
Il manque par exemple les fonctions actu2( ), actu3( ),...  [:er dehy:3]


Message édité par Soileh le 03-11-2014 à 22:02:38

---------------
And in the end, the love you take is equal to the love you make
Reply

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 [:er dehy:3]
Par contre, je pense qu'il y a un problème de rafraîchissement, ce qui cause le clignotement de la grille :/


Message édité par Soileh le 03-11-2014 à 23:00:15

---------------
And in the end, the love you take is equal to the love you make
Reply

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  :pt1cable: ).
Pour ce genre de problème, qu'il n'y ait pas une fonction à part dont le seul boulot soit d'afficher la matrice [:mimiax:5] , ç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+,


Message édité par gilou le 04-11-2014 à 11:20:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed