Else ineffectif dans mini-jeu
Résolu
supermakopok
Messages postés
14
Date d'inscription
Statut
Membre
Dernière intervention
-
supermakopok Messages postés 14 Date d'inscription Statut Membre Dernière intervention -
supermakopok Messages postés 14 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis un peu débutant en C, et je suis actuellement en train de faire un mini jeu dont le principe est simple :
- 1 à 3 pierres sont placées dans 8 colonnes, chaque colonne correspond à une touche du clavier.
- il faut détruire toutes ces pierres une à une le plus vite possible, si l'on appuie sur une touche alors qu'il n'y a pas de pierre à casser on a perdu.
voici la ligne de code correspondant à l'événement "e enfoncée" (troisième colonne, ceci est un exemple, le problème reste le même pour les 8 colonnes)
if (event.key.keysym.sym == SDLK_e)
{
if (pierreTroisUn != NULL){pierreTroisUn=NULL;}
else if (pierreTroisDeux != NULL){pierreTroisDeux=NULL;}
else if (pierreTroisTrois != NULL){pierreTroisTrois=NULL;}
else {return 0;}
}
pierreTroisUn, pierreTroisDeux et pierreTroisTrois sont des surfaces correspondant chacune à une pierre.
Le prog vérifie si la première pierre est présente, si oui il la détruit, sinon il vérifie la deuxième et ainsi de suite...
tout fonctionne, il enlève bien les pierres une par une, mais au moment où il n'y a plus de pierres dans la colonne (donc si les 3 premières conditions sont faussées), le dernier "else" ne marche pas , il ne me retourne pas 0, il ne se passe rien.. :'(
J'ai du faire une erreur quelque part, j'espère être assez clair ^^ et merci d'avance pour les réponses.
Je suis un peu débutant en C, et je suis actuellement en train de faire un mini jeu dont le principe est simple :
- 1 à 3 pierres sont placées dans 8 colonnes, chaque colonne correspond à une touche du clavier.
- il faut détruire toutes ces pierres une à une le plus vite possible, si l'on appuie sur une touche alors qu'il n'y a pas de pierre à casser on a perdu.
voici la ligne de code correspondant à l'événement "e enfoncée" (troisième colonne, ceci est un exemple, le problème reste le même pour les 8 colonnes)
if (event.key.keysym.sym == SDLK_e)
{
if (pierreTroisUn != NULL){pierreTroisUn=NULL;}
else if (pierreTroisDeux != NULL){pierreTroisDeux=NULL;}
else if (pierreTroisTrois != NULL){pierreTroisTrois=NULL;}
else {return 0;}
}
pierreTroisUn, pierreTroisDeux et pierreTroisTrois sont des surfaces correspondant chacune à une pierre.
Le prog vérifie si la première pierre est présente, si oui il la détruit, sinon il vérifie la deuxième et ainsi de suite...
tout fonctionne, il enlève bien les pierres une par une, mais au moment où il n'y a plus de pierres dans la colonne (donc si les 3 premières conditions sont faussées), le dernier "else" ne marche pas , il ne me retourne pas 0, il ne se passe rien.. :'(
J'ai du faire une erreur quelque part, j'espère être assez clair ^^ et merci d'avance pour les réponses.
A voir également:
- Else ineffectif dans mini-jeu
- Opera mini pc - Télécharger - Navigateurs
- 94 jeu - Télécharger - Puzzle & Réflexion
- 94 degrés jeu - Télécharger - Divers Jeux
- Jeu zuma - Télécharger - Jeux vidéo
- Logo jeu - Télécharger - Jeux vidéo
2 réponses
Salut supermakopok,
Ton code exécute le dernier
Si tu veux que ton code retourne 0 dès que les 3 pointeurs sont à passés à
Autres remarques :
- tu peux faire
- si tu fais
- je ne connais pas le reste de ton code, mais vu que tu parles de colonnes, je suppose que tu peux probablement faire un tableau "pierre" à deux dimensions plutôt que des variables individuelles PierreTroisUn, PierreTroisDeux, etc.
Dal
Ton code exécute le dernier
elseà la 4ème exécution du bloc.
Si tu veux que ton code retourne 0 dès que les 3 pointeurs sont à passés à
NULL, tu dois mettre ton
return 0;dans le dernier
else ifet supprimer ton
elsequi ne s'exécute que la 4ème fois.
Autres remarques :
- tu peux faire
if (pierreTroisUn) {au lieu de
if (pierreTroisUn != NULL) {, cela sera plus concis
- si tu fais
pierreTroisUn=NULL;et que "pierreTroisUn" contient un pointeur vers une zone mémoire allouée avec
malloc, tu écrases ton pointeur et tu perds la possibilité de libérer cette mémoire ; s'il s'agit bien d'un tel pointeur, tu dois libérer d'abord la mémoire avec
free, puis mettre le pointeur à NULL, sinon tu crées des fuites de mémoire
- je ne connais pas le reste de ton code, mais vu que tu parles de colonnes, je suppose que tu peux probablement faire un tableau "pierre" à deux dimensions plutôt que des variables individuelles PierreTroisUn, PierreTroisDeux, etc.
Dal
J'ai retrouvé la base de mon problème, comme je m'en doutais, c'était tout c** mais je n'y avais même pas pensé.
En fait j'initialisait toutes les pierres en tant que mon "pierre.bmp", et le fait que je fasse blitter cette pierre ou non l'affichait (ou non)
De ce fait quand une pierre ne s'affichait pas à l'écran, la surface qui y correspondait n'était pas pour autant NULL, juste non blittée >_<
Donc il fallait toujours, même si une seule pierre s'affichait à l'écran, que l'on mette NULL les 3 pierres (dont deux qui ne s'affichaient pas), le else marchait en fait parfaitement.
En tout cas, merci Dal j'ai quand même suivi tes conseils, ça allège salement le code :)
En fait j'initialisait toutes les pierres en tant que mon "pierre.bmp", et le fait que je fasse blitter cette pierre ou non l'affichait (ou non)
De ce fait quand une pierre ne s'affichait pas à l'écran, la surface qui y correspondait n'était pas pour autant NULL, juste non blittée >_<
Donc il fallait toujours, même si une seule pierre s'affichait à l'écran, que l'on mette NULL les 3 pierres (dont deux qui ne s'affichaient pas), le else marchait en fait parfaitement.
En tout cas, merci Dal j'ai quand même suivi tes conseils, ça allège salement le code :)
Voilà un exemple simulé avec deux "pierres" en positions 1 et 3 :
On a bien le "retourne 0" à la 2ème itération.
Mes autres remarques sur la libération de mémoire et la structuration des données sous forme de tableau restent d'actualité.
Dal