IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Listes chaînées Snake


Sujet :

C

  1. #1
    Membre habitué Avatar de MotorX
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 87
    Points : 134
    Points
    134
    Par défaut Listes chaînées Snake
    Bonjours ,

    Cela fait plus d'un moi que je suis sur ce problème , j'en ai marre .
    Je suis actuellement sur un projet de Snake.
    Collisions pixel par pixel , déplacement pixels par pixels .
    La map est stocker dans un tableau a double [] .

    Tout marche pour l'instant l'affichage de la map etc .
    Mais une fonction que j'ai crée fait quitter le jeu.

    En faite le principe ? :

    Une tête , un corps et une queue .

    La tête est le début de la chaîne , la queue la fin , a chaque fois que le serpent mange un fruit on rajoute un " morceau de corps " .

    La fonction en question sert a définir les positions de tout les " morceaux " .
    Pour l'instant je ne fais aucune variations parce que sa marche pas .

    Je vous montre le code .

    LISTE CHAINNE .H :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include "SDL.h"
     
    #ifndef LISTE_CHAINEE
    #define LISTE_CHAINEE
     
    typedef struct Element Element;
    struct Element
    {
        SDL_Rect posElement;
        int orientation;
        Element *suivant;
    };
     
    typedef Element* Liste;
     
    typedef struct Serpent Serpent;
    struct Serpent
    {
        int direction;
        int vitesse;
        Liste chaine;
     
    };
     
    Liste initialisation();
    void insertion(Serpent serpent);
     
    #endif
    LISTES CHAINNE .C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include "ressource.h"
    #include "listes_chainees.h"
     
    Liste initialisation()
    {
        Liste liste = malloc(sizeof(Element));
        Element *element = malloc(sizeof(element));
     
        liste->orientation = HORIZONTALE;
        liste->posElement.x = 10;
        liste->posElement.y = 10;
     
        element->orientation = liste->orientation;
        element->posElement.x = liste->posElement.x +43 ;
        element->posElement.y = 0;
     
        element->suivant = NULL;
        liste->suivant = element;
     
        return liste;
    }
     
     
    void insertion(Serpent serpent)
    {
        Element *nouveau = malloc(sizeof(Element));
        nouveau->orientation = serpent.chaine->orientation;
        nouveau->posElement.x = serpent.chaine->posElement.x+43;
        nouveau->posElement.y = serpent.chaine->posElement.y;
     
        nouveau->suivant = serpent.chaine->suivant;
        serpent.chaine->suivant = nouveau->suivant;
    }
    Fonction JEU.C : ( Que le début la fin n'es pas importante )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    void jeu (void)
    {
        // Declaration des variables nécessaires
        Input in ;
        Serpent serpent;
     
        int i = 0 , j = 0 , continuer = 1 , nbAleatoire = 60 , tempsActuel = 0, tempsPrecedent = 0;
        char map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {{0}} ;
        SDL_Rect positions , box , posSerpent ;
        SDL_Surface *teteSerpent, *corpSerpent, *queueSerpent, *arbre, *fruit[3], *caisse, *fond ;
     
        // Remplissages des variables
        if(!chargerNiveau(map)) // Chargement de la map , voir : fichier.c
        exit(0);
     
        serpent.chaine = initialisation();
        serpent.vitesse = 1;
        serpent.direction = DROITE;
     
        teteSerpent = init_img("Ressources\\Img\\teteSerpent.png",OUI);
        corpSerpent = init_img("Ressources\\Img\\corpSerpent.png",NON);
        queueSerpent = init_img("Ressources\\Img\\queueSerpent.png",OUI);
     
        fruit[CERISE] = init_img("Ressources\\Img\\cerise.png",NON);
        fruit[POMME] = init_img("Ressources\\Img\\pomme.png",OUI);
        fruit[POIRE] = init_img("Ressources\\Img\\poire.png",OUI);
     
        fond = init_img("Ressources\\Img\\fond.png",NON);
        caisse = init_img("Ressources\\Img\\caisse.png",OUI);
        arbre = init_img("Ressources\\Img\\arbre.png",NON);
     
        nbAleatoire = NB_Aleatoire(0 , 2);
     
        memset(&in,0,sizeof(in));
        while (continuer)
        {
            UpdateEvents(&in);
     
            if(in.quit)
                continuer= 0;
     
            if(in.key[SDLK_ESCAPE])
                continuer = 0 ;
     
            else if(in.key[SDLK_UP])
            {
                serpent.direction = HAUT;
                serpent.chaine->orientation = VERTICALE;
                in.key[SDLK_UP] = 0;
            }
            else if(in.key[SDLK_DOWN])
            {
                serpent.direction = BAS;
                serpent.chaine->orientation = VERTICALE;
                in.key[SDLK_DOWN] = 0;
            }
            else if(in.key[SDLK_LEFT])
            {
                serpent.direction = GAUCHE;
                serpent.chaine->orientation = HORIZONTALE;
                in.key[SDLK_LEFT] = 0;
            }
            else if(in.key[SDLK_RIGHT])
            {
                serpent.direction = DROITE;
                serpent.chaine->orientation = HORIZONTALE;
                in.key[SDLK_RIGHT] = 0;
            }
     
            tempsActuel = SDL_GetTicks();
            mouvementSerpent(serpent, tempsActuel, tempsPrecedent );
            definePosSerpent(serpent); // ICI LA FONCTION QUI BUGGGGGG
    Et la fonction en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void definePosSerpent (Serpent serpent)
    {
        Element *actuel = serpent.chaine->suivant;
        actuel->posElement.x = serpent.chaine->posElement.x +43;
     
        while(actuel!= NULL)
        {
                if( actuel->suivant != NULL)
                    actuel->suivant->posElement.x = actuel->posElement.x + 43;
     
                actuel = actuel->suivant;
        }
    }
    Voila merci , j’espère vous aurez le courage de m'aider .
    Mon twitter: Ici

  2. #2
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour MotorX

    Il y a quelque chose qui me choque dans ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Element *actuel = serpent.chaine->suivant;
    actuel->posElement.x = serpent.chaine->posElement.x +43;
    Est tu sur que actuel ne pas être NULL , sinon cela pourrais expliquer le plantage.
    Page sur Developpez : http://pbriand.developpez.com

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1- ne masque pas un pointeur par un typedef comme dans la définition de Liste : cela rend le code plus obscur et difficile à lire

    2- préfère le passage en argument d'un pointeur sur structure (éventuellement const) plutôt que la structure elle même comme dans insertion() ou mouvementSerpent() ou definePosSerpent(). Cela évite la recopie de la structure et est plus efficace.

    3- void insertion(Serpent serpent)
    Le nouvel Element nouveau est perdu : cette adresse n'est stockée nulle part. Probablement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void insertion(Serpent serpent)
    {
        Element *nouveau = malloc(sizeof(Element));
    ... 
        nouveau->suivant = serpent.chaine->suivant;
        serpent.chaine->suivant = nouveau;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre habitué Avatar de MotorX
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 87
    Points : 134
    Points
    134
    Par défaut
    Bonjour ,

    @bpy1401 :

    J'ai vérifier après ce que tu m'as dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void definePosSerpent (Serpent serpent)
    {
        Element *actuel = serpent.chaine->suivant;
        if(actuel == NULL)
        fprintf(stderr,"actuel est null --'");
        actuel->posElement.x = serpent.chaine->posElement.x +43;
    [...]
    Il n'y a rien d'afficher dans le fichier donc je pense qu'il n'es pas NULL .


    @diogene :

    Je suis encore un grand débutant , au risque de paraître lourd je ne comprends pas tout ce que tu me dis désolée .

    3- void insertion(Serpent serpent)
    Le nouvel Element nouveau est perdu : cette adresse n'est stockée nulle part. Probablement


    C'est a dire que cela est possible que ça ne crée rien ?




    Merci de vos réponses et d'avoir lus jusqu'au bout .
    Mon twitter: Ici

  5. #5
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour MotorX

    Question bête, tu n'aurais pas un debuggeur dans ton environnement de développement. Cela pourrait t'aider à trouver ou cela plante en faisant du pas à pas.

    Tu travail avec quoi ?

    Cordialement.
    Page sur Developpez : http://pbriand.developpez.com

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est a dire que cela est possible que ça ne crée rien ?
    Bien sûr que si, ça le crée (si nouveau n'est pas NULL), mais l'adresse renvoyée est perdue puisqu'elle n'est pas stockée quelque part. Le code que j'ai modifié stocke l'adresse nouveau et place l'Element créé en tête de la liste.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre habitué Avatar de MotorX
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 87
    Points : 134
    Points
    134
    Par défaut
    Bonjour ,

    @bpy1401 :

    Heu je suis sous code blocks ( windows vista ) mais ce n'es pas considérer comme une erreur .

    @diogene :

    Que faudrait-il que je fasse ? Merci comme même mais ne nous écartons pas trop du problème , un problème a la fois :p ( parce que je ne l'ai pas encore utiliser cette fonction ).
    Mon twitter: Ici

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/10/2005, 19h20
  2. Liste chaînée
    Par kilinette dans le forum C
    Réponses: 6
    Dernier message: 17/10/2005, 23h45
  3. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 13h44
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo