Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/04/2008, à 13:12

Amine2610

Problème avec une boucle FOR dans C

Bonjour,
Je doit réaliser un jeux de l'oie en SDL, dans le cadre d'un projet de l'école.
Mais j'ai rencontré dans la fonction "Nouvelle partie", ça se compile mais ca fonction pas corectement, j'ai passé beaucoup de temps a relire et a débuger a cherché des érreurs mais j'ai rien trouvé.
le problème c'est que les joueur joue aléatoirement sans aucune logique, même si le code me semble trés logique

aide moi s'il vous plait!!
voiçi le code :


typedef struct players players; // Structure qui contient des informations sur les joueurs
struct players
{ int NumeroDuJoueur; // numero du joueur
  int indice;   // la position du joueur dans le chemin
  int jetons;  // nombre des jetons chez le joueur
  int interdiction; // nombre des tours que le joueur ne peut pas joueur
  int bloque; // booléene qui indique si l joueur est bloqué (dans le prison ou le puit) ou non
};


void jeu(SDL_Surface * ecran)
{ int i; // compteurs
  int j;
  int A; // variable de pérmutation
  int continuer=1;  //continuer de la fonction principale du jeu
  int continuerchoiedejoueur=1; // continuer de l'écran du choie de nombre des joueurs
  int nombredesjoueur;
  int MIN=1; // la valeur minimale que le de peut prendre
  int MAX=6; // la valeur maximale que le de peut prendre
  int de1=0; // la valeur du de1
  int de2=0; // la valeur du de2
  int joueuractuel; // le joueur qui a le tour de joueur


  SDL_Event event;

  players joueur[8]; // initialisation des donnée des joueurs
  for(i=0;i<8;i++)
  { joueur[i].indice=1;
    joueur[i].jetons=4;
    joueur[i].NumeroDuJoueur=i+1;
    joueur[i].interdiction=0;
    joueur[i].bloque=0;
  }


  srand(time(NULL)); // initialisation du générateur de nombre aléatoires

  SDL_Surface * background;  //creation des surface des images
  SDL_Surface * dados[6];
  SDL_Surface * pion[8];
  SDL_Surface * NombreJ;


  SDL_Rect positionbackground; // creation des position des surfaces
  SDL_Rect positiondados[6];
  SDL_Rect positionpion[8];
  SDL_Rect positionNombreDeJoueurs;

  positionNombreDeJoueurs.x=0;
  positionNombreDeJoueurs.y=0;

  positionbackground.x=0;
  positionbackground.y=0;

  background=IMG_Load("images/table.png");  //chargement des images
  dados[0]=IMG_Load("images/dados/de1.bmp");
  dados[1]=IMG_Load("images/dados/de2.bmp");
  dados[2]=IMG_Load("images/dados/de3.bmp");
  dados[3]=IMG_Load("images/dados/de4.bmp");
  dados[4]=IMG_Load("images/dados/de5.bmp");
  dados[5]=IMG_Load("images/dados/de6.bmp");
  pion[0]=IMG_Load("images/pions/J1.png");
  pion[1]=IMG_Load("images/pions/J2.png");
  pion[2]=IMG_Load("images/pions/J3.png");
  pion[3]=IMG_Load("images/pions/J4.png");
  pion[4]=IMG_Load("images/pions/J5.png");
  pion[5]=IMG_Load("images/pions/J6.png");
  pion[6]=IMG_Load("images/pions/J7.png");
  pion[7]=IMG_Load("images/pions/J8.png");
  NombreJ=IMG_Load("images/nombredejoueurs.png");

while(continuerchoiedejoueur)
  {
  SDL_WaitEvent(&event);
   switch(event.type)
     { case SDL_QUIT :{ continuermain=0;
                        continuerchoiedejoueur=0;
                      } //si c'est un évenement de type SDL_QUIT, quitter la boucle
       break;
       case SDL_KEYDOWN :
          {switch(event.key.keysym.sym)
            case SDLK_ESCAPE :
            continuermain=0;
            continuerchoiedejoueur=0; //si l'utilisateir appuit sue echap quiter la boucle
          } break;
       case SDL_MOUSEBUTTONUP :    //si c'est un clic de la souris analyser le
         { switch(event.button.button)
           case SDL_BUTTON_LEFT :  //si c'est un clic avec le bouttin gauche, analyser le
           {
           if(((event.button.x>1*TAILLE_BLOC)&&(event.button.x<7*TAILLE_BLOC))&&­;((event.button.y>5*TAILLE_BLOC)&&(event.button.y<6*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 2joueurs
                                  {  nombredesjoueur=2;
                                    continuerchoiedejoueur=0;
                                }
                else if(((event.button.x>1*TAILLE_BLOC)&&(event.button.x<7*TAILLE_BLOC))&&­;((event.button.y>7*TAILLE_BLOC)&&(event.button.y<8*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 3 joueurs
                                   {
                                       nombredesjoueur=3;
                                       continuerchoiedejoueur=0;
                                   }
                     else if(((event.button.x>1*TAILLE_BLOC)&&(event.button.x<7*TAILLE_BLOC))&&­;((event.button.y>9*TAILLE_BLOC)&&(event.button.y<10*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 4 joueurs
                                      {
                                         nombredesjoueur=4;
                                         continuerchoiedejoueur=0;
                                      }
                           else if(((event.button.x>9*TAILLE_BLOC)&&(event.button.x<15*TAILLE_BLOC))&&am­p;((event.button.y>5*TAILLE_BLOC)&&(event.button.y<6*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 5 joueurs
                                          {
                                              nombredesjoueur=5;
                                              continuerchoiedejoueur=0;
                                          }
                                 else if(((event.button.x>9*TAILLE_BLOC)&&(event.button.x<15*TAILLE_BLOC))&&am­p;((event.button.y>7*TAILLE_BLOC)&&(event.button.y<8*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 6 joueurs
                                              {
                                                  nombredesjoueur=6;
                                                  continuerchoiedejoueur=0;
                                              }
                                      else if(((event.button.x>9*TAILLE_BLOC)&&(event.button.x<15*TAILLE_BLOC))&&am­p;((event.button.y>9*TAILLE_BLOC)&&(event.button.y<10*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 7 joueurs
                                                   {
                                                       nombredesjoueur=7;
                                                       continuerchoiedejoueur=0;
                                                   }
                                            else if(((event.button.x>5*TAILLE_BLOC)&&(event.button.x<11*TAILLE_BLOC))&&am­p;((event.button.y>11*TAILLE_BLOC)&&(event.button.y<12*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton 8 joueurs
                                                       {
                                                           nombredesjoueur=8;
                                                           continuerchoiedejoueur=0;
                                                       }
         } break;
     } break;
      }
     SDL_BlitSurface(NombreJ,NULL,ecran,&positionNombreDeJoueurs);
     SDL_Flip(ecran);


  }


  SDL_Rect PositionDeCase[64];


                    // definition des cordonées des cases
   for(i=0;i<6;i++) // cases de 1 jusqu'à 6
   {PositionDeCase[i].y=11*TAILLE_BLOC;
    PositionDeCase[i].x=(7-i)*TAILLE_BLOC;
   }
   for(i=6;i<16;i++) // cases de 7 jusqu'à 16
   {PositionDeCase[i].y=(10-i+6)*TAILLE_BLOC;
    PositionDeCase[i].x=0;
   }
   for(i=16;i<26;i++) // cases de 17 jusqu'à 26
   {PositionDeCase[i].y=0;
    PositionDeCase[i].x=(2+i-16)*TAILLE_BLOC;
   }
   for(i=26;i<34;i++) // cases de 27 jusqu'à 34
   {PositionDeCase[i].y=(1+i-26)*TAILLE_BLOC;
    PositionDeCase[i].x=11*TAILLE_BLOC;
   }
   for(i=34;i<42;i++) // cases de 35 jusqu'à 42
   {PositionDeCase[i].y=9*TAILLE_BLOC;
    PositionDeCase[i].x=(11-i+34)*TAILLE_BLOC;
   }
   for(i=42;i<48;i++) // cases de 43 jusqu'à 48
   {PositionDeCase[i].y=(9-i+42)*TAILLE_BLOC;
    PositionDeCase[i].x=2*TAILLE_BLOC;
   }
   for(i=48;i<54;i++) // cases de 49 jusqu'à 54
   {PositionDeCase[i].y=2*TAILLE_BLOC;
    PositionDeCase[i].x=(3+i-48)*TAILLE_BLOC;
   }
   for(i=54;i<58;i++) // cases de 55 jusqu'à 58
   {PositionDeCase[i].y=(3+i-54)*TAILLE_BLOC;
    PositionDeCase[i].x=9*TAILLE_BLOC;
   }
   for(i=58;i<62;i++) // cases de 59 jusqu'à 62
   {PositionDeCase[i].y=7*TAILLE_BLOC;
    PositionDeCase[i].x=(9-i+58)*TAILLE_BLOC;
   }
   for(i=62;i<64;i++) // cases de 63 jusqu'à 64
   {PositionDeCase[i].y=(7-i+62)*TAILLE_BLOC;
    PositionDeCase[i].x=4*TAILLE_BLOC;
   }




                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 0));
                          SDL_BlitSurface(background,NULL,ecran,&positionbackground);
                          SDL_Flip(ecran);
                            for(i=0;i<nombredesjoueur;i++) // Collage des surfaces
                             { positionpion[i]=PositionDeCase[0];
                              SDL_BlitSurface(pion[i],NULL,ecran,&positionpion[i]);
                             }


while(continuer)
{


  SDL_BlitSurface(background,NULL,ecran,&positionbackground);
  for(i=0;i<nombredesjoueur;i++) // Collage des surfaces
  {
      SDL_BlitSurface(pion[i],NULL,ecran,&positionpion[i]);
  }
  SDL_Flip(ecran);

for(i=0;i<nombredesjoueur;i++)
{ if(joueur[i].interdiction!=0)  // si le joueur est interdit de joueur pour une nombre donné des tours, il ne joue pas, et on réduit le nombre d'interdiction par 1
      { joueur[i].interdiction--;}
  else if(joueur[i].bloque==1) // si le joueur est bloquer il ne vas pas joueur
  { joueur[i].bloque=1; }
       else
      { joueuractuel=joueur[i].NumeroDuJoueur;

        SDL_WaitEvent(&event);
          switch(event.type)
           { case SDL_QUIT : continuermain=0;
            continuer=0; //si c'est un évenement de type SDL_QUIT, quitter la boucle
             break;
              case SDL_KEYDOWN :
                {switch(event.key.keysym.sym)
                  case SDLK_ESCAPE :
                   continuermain=0;
                  continuer=0; //si l'utilisateir appuit sue echap quiter la boucle
                  break;
                } break;
              case SDL_MOUSEBUTTONUP :    //si c'est un clic de la souris analyser le
               { switch(event.button.button)
                 case SDL_BUTTON_LEFT :  //si c'est un clic avec le bouttin gauche, analyser le
                 {if(((event.button.x>14*TAILLE_BLOC)&&(event.button.x<16*TAILLE_BLOC))&&­amp;((event.button.y>12*TAILLE_BLOC)&&(event.button.y<13*TAILLE_BLOC))) //si l'utilisateur a clicé sur le boutton dé
                 { de1=(rand() % (MAX - MIN + 1)) + MIN; // on lance les dés
                   de2=(rand() % (MAX - MIN + 1)) + MIN;

                      joueur[i].indice = joueur[i].indice + ( de1 + de2 ); // le joueur avance avec de1 + de2

                       if(joueur[i].indice==65) {                   // le goueur gagne
                                                   continuer=0;
                                                }



                        else if(joueur[i].indice>65) //si le nombre excéde la distance a parcourire le joueur doit rétrograder
                              {
                                   joueur[i].indice = 65 - ( joueur[i].indice - 65);
                              }


                         for(j=0;j<nombredesjoueur;j++)     // si  il ya un pion dans la case ou je joueur i arrive,  le pion de joueur i remplace le pion du joueur j, et le pion du joueur j revien ou été le pion du joueur i
                          {
                             if((joueur[i].indice==joueur[j].indice)&&(i!=j))
                                { A=joueur[i].indice;
                                  joueur[i].indice=joueur[j].indice;
                                  joueur[j].indice=A;
                                  joueur[j].bloque=0; // anuler le bloquage
                                }

                          }

                           switch (joueur[i].indice)
                          {
                           case 5  : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break; // le joueur redouble les point dee dés
                           case 9  : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 14 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break; // le joueur redouble les point dee dés
                           case 18 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 23 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 27 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 32 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 36 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 41 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 45 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 50 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 54 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés
                           case 59 : joueur[i].indice = joueur[i].indice + ( de1 + de2 ); break;// le joueur redouble les point dee dés


                           case 6  : joueur[i].indice = 20; break;// si la case est une case pont (6) le pion est téléporter à la case 20;

                           case 19 : joueur[i].interdiction = joueur[i].interdiction + 2; break;// si la case est la case auberge, le joueur reste bloqué sans jouer pendant 2 tours

                           case 31 : joueur[i].bloque = 1; break;// le joueur sera bloquer

                           case 52 : joueur[i].bloque = 1; break;// le joueur sera bloquer

                           case 42 : joueur[i].indice = 37; break;// le joueur est renvoié vers la case 37

                           case 58 : joueur[i].indice = 0;  break;// joueur renvoié vers la case du départ
                          }
                          positionpion[i]=PositionDeCase[joueur[i].indice]; // le pion est a la case indice joueur[i].indice


                 } } break;
               } break;
           }

                          SDL_BlitSurface(background,NULL,ecran,&positionbackground);
                          for(i=0;i<nombredesjoueur;i++)
                           {
                               SDL_BlitSurface(pion[i],NULL,ecran,&positionpion[i]);
                           }
                          SDL_Flip(ecran);
      }
}
}
SDL_FreeSurface(NombreJ);  // libération de la mémoire
SDL_FreeSurface(background);

}

#2 Le 26/04/2008, à 13:59

nicolas.sitbon

Re : Problème avec une boucle FOR dans C

Poste un code qui compile!!!

Hors ligne

#3 Le 26/04/2008, à 16:00

amine2610

Re : Problème avec une boucle FOR dans C

Malheureusement je peut pas, car c'est un grand projet sur le quel je travail, avec beaucoup des fichier et beaucoup des image, presque 15mo

#4 Le 26/04/2008, à 16:08

Pygnol

Re : Problème avec une boucle FOR dans C

As-tu essayer de réduire ton code au minimum compilable qui reproduit ton problème. C'est instructif et on trouve souvent l'origine du problème de cette manière. C'est aussi très pratique pour poster sur les forums.

Thierry

Hors ligne

#5 Le 26/04/2008, à 16:21

Amine2610

Re : Problème avec une boucle FOR dans C

Je sais pas comment faire ca, car c'est un projet SDL, donc ca peut pas étre compilé sous la console! sad

#6 Le 26/04/2008, à 17:47

amine2610

Re : Problème avec une boucle FOR dans C

aider moi SVP, c'est urgent

#7 Le 28/04/2008, à 20:25

babakiller85

Re : Problème avec une boucle FOR dans C

je te propose de regarder le code avec un profiler (gprof, gcov, valgrind ou oprofile) qui va te construire ton arbre d'appel et tu pouras vérifier qu'il est correct !
Sinon tu l'exécute en pas à pas avec gdb ou ddd !

Hors ligne

#8 Le 28/04/2008, à 21:51

rniamo

Re : Problème avec une boucle FOR dans C

fallait s'y prendre plu tôt pour ton projet.lol

Mets un lien vers tout ton projet (images comprises si ça te fait plaisir)..via ce site par exemple http://www.badongo.com/fr/


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#9 Le 29/04/2008, à 09:29

Plum

Re : Problème avec une boucle FOR dans C

Bonjour,

Oulala que dire c'est grandement fouillit quand meme, j'ai survolé un peu rapidement le code (faut avouer que ca pique les yeux quand meme) et dans tes else if tu as des problemes de parentheses visiblement.
Les declarations ont l'air un peu bancales.

Pour la lisibilitée je te conseil de decouper tes programmes en fonction et de travailler avec des pointeurs.
Et bien sur d'avancer en compilant a chaque fois ce que tu as.

J'essai d'y regarder d'un peu plus pres.

Hors ligne

#10 Le 29/04/2008, à 14:44

amine2610

Re : Problème avec une boucle FOR dans C

merci pour tout vos réponses!
j'ai trouvé le problème a l'aide du débuger, le problème a été avec l'attente de l'événement!
Merci beaucoup wink

#11 Le 29/04/2008, à 19:02

babakiller85

Re : Problème avec une boucle FOR dans C

Un petit Résolu ??

Hors ligne