#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))&&((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))&&((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))&&((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))&&((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))&&((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!
#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
#11 Le 29/04/2008, à 19:02
- babakiller85
Re : Problème avec une boucle FOR dans C
Un petit Résolu ??
Hors ligne