Else ineffectif dans mini-jeu

Résolu/Fermé
supermakopok Messages postés 14 Date d'inscription mercredi 11 septembre 2013 Statut Membre Dernière intervention 21 août 2014 - 22 avril 2014 à 12:33
supermakopok Messages postés 14 Date d'inscription mercredi 11 septembre 2013 Statut Membre Dernière intervention 21 août 2014 - 23 avril 2014 à 12:37
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.
A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/04/2014 à 10:40
Salut supermakopok,

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 if
et supprimer ton
else
qui 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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/04/2014 à 10:54
hmm..., je viens de réaliser que les pierreTroisUn, pierreTroisDeux, pierreTroisTrois peuvent, ou non, contenir une "pierre", puisque tu dis "1 à 3 pierres sont placées dans 8 colonnes".
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 23/04/2014 à 11:07
Dans ce cas, il faut sortir le return 0; des enchaînements de else et refaire un test de chaque pointeur.

Voilà un exemple simulé avec deux "pierres" en positions 1 et 3 :

#include <stdio.h>

int main(void)
{
    int * pierreTroisUn;
    int * pierreTroisDeux;
    int * pierreTroisTrois;

    int num = 10;

    pierreTroisUn = &num;
    pierreTroisDeux = NULL;
    pierreTroisTrois = &num;

    printf("Itération 1 : ");
    if (pierreTroisUn){
        pierreTroisUn = NULL; printf("pierreTroisUn = NULL\n");
    } else if (pierreTroisDeux) {
        pierreTroisDeux = NULL; printf("pierreTroisDeux = NULL\n");
    } else if (pierreTroisTrois) {
        pierreTroisTrois = NULL; printf("pierreTroisTrois = NULL\n");
    }
    if (!pierreTroisUn && !pierreTroisDeux && !pierreTroisTrois) {
        printf("retourne 0\n");
    }

    printf("Itération 2 : ");                                                                                                                                                                                      
    if (pierreTroisUn){
        pierreTroisUn = NULL; printf("pierreTroisUn = NULL\n");
    } else if (pierreTroisDeux) {
        pierreTroisDeux = NULL; printf("pierreTroisDeux = NULL\n");
    } else if (pierreTroisTrois) {
        pierreTroisTrois = NULL; printf("pierreTroisTrois = NULL\n");
    }
    if (!pierreTroisUn && !pierreTroisDeux && !pierreTroisTrois) {
        printf("retourne 0\n");
    }

    return 0;
}


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
0
supermakopok Messages postés 14 Date d'inscription mercredi 11 septembre 2013 Statut Membre Dernière intervention 21 août 2014
23 avril 2014 à 12:22
Merci beaucoup des conseils, j'essaye ça tout de suite !
0
supermakopok Messages postés 14 Date d'inscription mercredi 11 septembre 2013 Statut Membre Dernière intervention 21 août 2014
23 avril 2014 à 12:37
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 :)
0