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 :

coder un mini jeu snake


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut coder un mini jeu snake
    Bonjour à tous ,
    je suis entrain de m'amuser à programmer un petit snake histoire de pratiquer,bon il ne fonctionne pas trop mal mais j'ai quelques bugs que je ne comprend pas .

    La méthode que j'utilise est la suivante:

    j'ai découpe mon snake en 3 parties .

    1-la tête qui à une position unique .
    2-le corps qui à autant de position différentes que de parties , donc j'utilise un SDL_Rect de type tableau .
    3-la queue qui n'a qu'une position également.

    lorsque je charge ma carte dans un tableau 2d (à partir d'un fichier texte), je récupéré les positions de départ de toutes les parties du bestiaux (à la manière du sokoban).
    Pour ensuite les blitter à l’écran après avoir blitter la carte . toutes les 120 milliseceondes, la boucle refait un tour .

    à ce stade le snake ne bouge pas donc . Si j'appuie sur une des flèches (keyup) , j'initialise un booléen à 1 ,ainsi qu'une direction dans laquelle mon snake doit avancer.

    ensuite, une fois le booléen à 1 est ma direction choisie, j’appelle une fonction qui va modifier les positions des partie de mon snake toutes les 120 milisec.

    J'ai procède de la façon suivante :

    1: j'enregistre la position de la tête, puis selon la direction choisi, la tête prend une nouvelle position x et y ,

    2: j'enregistre la position[0] du corps ,donc de la partie 1 , et je lui donne la position précédente de la tête .

    3: j'enregistre la position[1] du corps (partie2) et lui donne la position précédente de la partie1 .

    4: ainsi de suite pour chaque parties .

    5 :et enfin je donne a la queue la position que possédait la dernière partie du corps .


    Je retourne a ma boucle d’événement et je bitte les images avec leur nouvelles positions .

    Je vais mettre la partie du code qui correspond pour que vous y voyez plus clair .
    ainsi qu'un lien pour télécharger l'exe .

    Les bugs que j'ai sont les suivants :
    Au début j'ai un décalage que je ne m'explique pas , ensuite à chaque fois que le snake mange une pomme, sa queue se blitte à un endroit inexpliqué (mais forcement logique) de la carte pour ensuite continuer à coller au bestiaux ... (ce dernier bug est reglé j'ai modifie le code source)

    Voila merci d'avance à ceux qui auront le courage de lire le pavé ainsi que le code et surtout à ceux qui voudront bien m'aider à résoudre ce petit bug

    voila l'exe http://www.megaupload.com/?d=1M0VQR0C


    Partie qui modifie les positions de la bête
    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
     
    void modifierPositionsSerpent(SDL_Rect *positionTeteSerpent,
    SDL_Rect positionCorps[],SDL_Rect *positionQueue,int* partiesCorps,
    int direction,int carte[][40])
    {
     
     
    int teteX=positionTeteSerpent->x;// je sauvegarde la position de la tete
    int teteY=positionTeteSerpent->y;
    int i=1,j=0;
    int corpsX[40]={NULL},corpsY[40]={NULL};
     
     
    switch(direction) //je modifie la position de la tete selon la direction
    {
       case DROITE:
       positionTeteSerpent->x+=15;
       break;
       case GAUCHE:
       positionTeteSerpent->x-=15;
       break;
       case BAS:
       positionTeteSerpent->y+=15;
       break;
       case HAUT:
       positionTeteSerpent->y-=15;
       break;
    }
     
    int pommeMange=0;
    switch(carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15])
    {
    case POMME2:
    carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15]=VIDE2;
    *partiesCorps=*partiesCorps+1;
     pommeMange=1;
    break;
    case CARRE_OBSTACLE2:
    break;
     
     
    }
     
     
    corpsX[0]=positionCorps[0].x;//je sauvegarde la position du corps
    corpsY[0]=positionCorps[0].y;
     
    positionCorps[0].x=teteX;// donne a la premiere partie du corps la position
    positionCorps[0].y=teteY;// de la tete
     
     
     
      for(i=1;i<*partiesCorps;i++)
      {
      corpsX[i]=positionCorps[i].x,corpsY[i]=positionCorps[i].y;
      //j'enregistre la position du corps avant de la modifier 
      positionCorps[i].x=corpsX[j], positionCorps[i].y=corpsY[j];
     //et je donne a la partie du corps qui suit la position enregistre
      j++;
      }
     
     
     
        if(!pommeMange)
        {
            positionQueue->x=corpsX[j];
            positionQueue->y=corpsY[j];
        }
     
     
    }
    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
    73
    74
    75
    76
    77
    78
    79
     
     
    Boucle principale du jeu 
     
    <code type="c">
    while(continuer)
       {
     
       SDL_PollEvent(&event);
     
            switch(event.type)
            {
            case SDL_QUIT:
            continuer = 0;
            break;
            case SDL_KEYDOWN:
                 switch (event.key.keysym.sym)
                 {
     
                 case SDLK_UP:
                 deplacement=1;
                 direction=HAUT;
                 break;
                 case SDLK_DOWN:
                 deplacement=1;
                 direction=BAS;
                 break;
                 case SDLK_RIGHT:
                 deplacement=1;
                 direction=DROITE;
                 break;
                 case SDLK_LEFT:
                 deplacement=1;
                 direction=GAUCHE;
                 break;
     
                 }
     
            break;
            }
     
     
     
     
          SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format,255, 255, 255));
          map(fenetre,imagesCorps,images,position,carte);
     
     
         tempsActuel = SDL_GetTicks();
         if (tempsActuel - tempsPrecedent > 120)
         {
     
             if(deplacement)//ici j apelle la fonction de modification une fois le boleen à 1
             modifierPositionsSerpent(&positionTeteSerpent,positionCorps,&positionQueue,
             &partiesCorps,direction,carte);
     
         tempsPrecedent = tempsActuel;
         }
         else
         {
         SDL_Delay(120 - (tempsActuel - tempsPrecedent));
         }
     
     
         // je blitte la tete
          SDL_BlitSurface(images[TETE], NULL, fenetre,&positionTeteSerpent);
     
          // je blitte les differentes parties du corps
          for(i=0;i<partiesCorps;i++)
          {
          SDL_BlitSurface(images[CARRE_OBSTACLE], NULL, fenetre,&positionCorps[i]);
          }
         // et enfin le cul
          SDL_BlitSurface(images[QUEUE], NULL, fenetre,&positionQueue);
     
     
        SDL_Flip(fenetre);
     
       }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Dommage que vous ne donniez qu'un .exe. Étant sous GNU/Linux je suis un gêné.
    Si vous pouviez faire une capture d'écran du problème, ou encore expliquez le problème (décalage) avec plus de détails, ça serait bien.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Bonjour , merci pour ta réponse, oui c'est vrai je n'ai pas pensé aux linuxiens ^^ .Voici une petite vidéo ou on voit bien le décalage au début


    le problème se situe a mon avis à cet endroit la du code ou :
    -la position [0] du corps devient la position précédente de la tête
    -la position [1] devient la position [0] ainsi de suite
    - la position de la queue devient la derniere position qu'occupait le corps

    pourtant au début on voit bien que le corps prend des position bizarres ,puis tout rentre dans l'ordre

    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
     
        corpsX[0]=positionCorps[0].x;
        corpsY[0]=positionCorps[0].y;
     
        positionCorps[0].x=teteX;
        positionCorps[0].y=teteY;
     
        for(i=1;i<*partiesCorps;i++)
        {
            corpsX[i]=positionCorps[i].x,corpsY[i]=positionCorps[i].y;
            positionCorps[i].x=corpsX[j], positionCorps[i].y=corpsY[j];
            j++;
        }
     
     
        if(!pommeMange)
        {
            positionQueue->x=corpsX[j];
            positionQueue->y=corpsY[j];
        }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    j'ai finalement réussi à trouver le problème

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Pouvez vous nous expliquer quel était-il ?
    (Et puis n'oubliez pas de mettre la discussion en résolu )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    en fait c'était tout bête et ce n'est pas dans cette partie du code que se trouvait le problème ... Le problème venait au moment ou je chargeait la map via un fichier dans un tableau 2d .

    le tableau de la map est de la forme :

    [0][0],[0][1],[0][2]...[1][0][1][1]... le premier indice pour l'axe des x le second pour l'axe des y . j’enregistre une ligne de haut en bah puis les autres lignes de gauche à droite

    au moment ou je charge la map dans le tableau, j’enregistre les positions du corps du serpent pou ensuite les blitter.

    Avec la position de départ du serpent tel qu on la voit dans la vidéo . la partie qui suit la queue(bleu) avait la position 0 et celle qui précédé la tête (rouge) la position 5 .

    alors que dans mon code de déplacement du serpent c'est l'inverse la position 0 suit la tête et la 5 est la dernière ,d’où le décalage au début de la mise en mouvement .

    J'ai donc du après le chargement de la map, remettre les positions dans le bon ordre pour que ça fonctionne .Désormais j'ai bien un serpent et plus un orvet aux membres détachable

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour pouvoir ammeliorer mon jeu (Snake)
    Par kump_ dans le forum Projets
    Réponses: 24
    Dernier message: 13/08/2008, 02h26
  2. coder un petit jeu : meilleurs biblios graphiques ?
    Par Chatbour dans le forum API graphiques
    Réponses: 3
    Dernier message: 21/12/2007, 00h48
  3. [ancien jeu] Snake deux joueur en ligne?
    Par Extra-Nitro dans le forum Web
    Réponses: 7
    Dernier message: 28/02/2007, 18h59
  4. mini jeu en construction (débutant)
    Par samy100 dans le forum C
    Réponses: 45
    Dernier message: 23/04/2006, 23h36

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