probleme avec mon serpent

probleme avec mon serpent - C - Programmation

Marsh Posté le 03-06-2006 à 15:25:13    

j'ai un petit problème de programmation de mon serpent voici le code.... Si quelqu'un pouvait maider à comprndre pourquoi il n'avance pas ...
 
Merci d'avance
 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
 
 
#define GAUCHE 75
#define DROITE 77
#define HAUT 72
#define BAS 80
#define ESC 27
/*============================================================================*/
/* Variables globales */
/*============================================================================*/
int vitesse = 90;
int Niv[80][23];
int score = 0; //score à 0
int taille = 3;
int nb_pomme=0;//nb de pommes mangées
int sens;  
/*============================================================================*/
/* Structure */
/*============================================================================*/
typedef struct {
    int x; //coordonnées en x
    int y; //coordonnées en y
}Coord;  
/*============================================================================*/
/* Affichage et interface */
/*============================================================================*/
  void efface_menu()  
{
    int i;
    gotoxy(1,1);
    for(i=1; i<79; i++)
        printf(" " );
}
 
void message(char* mess1)
{
    gotoxy(50,1);
    printf("%s",mess1);
    getch();
}
 
 
void gameOver()
{  
    message("===== GAME OVER =====" );
}  

 

int affiche(int taille, Coord p, Coord snak[], int score,int nb_pomme, Coord s)
{
   
    int i, j, t, h;
 
               
        //si snake mange sa queue
        for(i = 2; i < taille; i++)
        {
            if(snak[0].x == snak[i].x && snak[0].y == snak[i].y)
            {
                gameOver();
                exit(0);
                return 0;
            }
        }
     
     
         //teste les collisions avec des paroies
         for(i=2; i<23; i++)
         {
         for(j=0; j<80; j++)
         {
            if(Niv[j][i]==1)
            {
                if(snak[0].x==(j+1) && snak[0].y==(i+3))
                {
                    gameOver();
                    exit(0);
                    return 0;
                }
            }
        }
        }
   
          //dessine le snake
    for(i = 0; i < taille; i++)
    {        
        gotoxy(snak[i].x, snak[i].y);
        if(i == 0)
        {  
                printf("\x2" ); //dessine la tête
        }
        if(i !=0 && i<taille)
        {
                printf("\xf" ); //dessine le corps
        }
     }
     
    //dessine le score, le record, le nombre de pommes mangées
    gotoxy(1, 2);
    for(i = 0; i < 80; i++)
    printf("\xC4" );
    gotoxy(2,1);    
    printf(" Score: %d|", score);  
    printf(" Pomme(s): %d|", nb_pomme);
     
return 1;
}
 
/*============================================================================*/
/* Moteur du jeu */
/*============================================================================*/
   
 
void cherche_pomme(Coord snak[], Coord p, int taille)
{
    int x, y, i, j;
    int exit, ind;
    do
    {
        exit = 1;
        x = (rand() % 79) + 1;
        y = (rand() % 22) + 1;
        ind = 0;
                //verifie si la pomme n'est pas ds le serpent
            while(ind <= taille && exit)
                    {
                if(x == snak[ind].x && y == snak[ind].y)      
                exit = 0;
                ind++;
                    }
                //verifie si la pomme n'est pas ds le mur
                        for(i=2; i<22; i++)
                                {
                                            for(j=0; j<79; j++)
                                            {
                                            if(x==(j+1) && y==(i+3))
                                            exit=0;
                                            }
                                            if(!exit) break;
                                }
                        if(!exit) break;
                        }  
    while(! exit);
    p.x = x;
    p.y = y;  
    //dessine la pomme
    gotoxy(p.x, p.y);
    printf("\x9d" );
}
 
 
void initialisationJeu(Coord snak[], Coord s, Coord p, int taille)
{
    int i;
    clrscr();
    cherche_pomme(snak, p, taille);
    //initialisation du snake
    s.x = 10, s.y = 10;
    snak[0].x = s.x;
    snak[0].y = s.y;
    for(i = 1; i < taille; i++)
    {
        snak[i].x = s.x -i ;
        snak[i].y = s.y ;
    }
    sens = DROITE;
}
 
 
//fonction qui gere le jeu
void jeu()
{
    Coord snak[1000];//coord du snake
    Coord p;//coord de la pomme
    Coord s;//coord de la tete du snake
    char c;
    int exit = 0, v, m, i;
    message("===== PRET? =====" );
     
     initialisationJeu( snak, s, p, taille);
   
    //grande boucle du jeu
    do
    {  
    affiche( taille, p, snak, score, nb_pomme, s);
             
             //qd on frappe pas de touches
        if(!kbhit())
        {    
                       
        //si le snake mange la pomme
        if(snak[0].x == p.x && snak[0].y == p.y)
            {
                gotoxy(p.x, p.y);
                printf(" " );
                score = (score+5);
                taille = (taille+1);
                nb_pomme =(nb_pomme+1);
                cherche_pomme(snak, p, taille);
                affiche( taille, p, snak, score, nb_pomme, s);
            }
           
        //deplace le snake dans telle direction    
              switch(sens)
              {
              case HAUT:
                snak[0].x = s.x;
                snak[0].y = s.y--;
              case BAS:
                snak[0].x = s.x;
                snak[0].y = s.y++;
              case GAUCHE:
                snak[0].x = s.x--;
                snak[0].y = s.y;
              case DROITE:
                snak[0].x = s.x++;
                snak[0].y = s.y;
              }
              Sleep(120);          
               affiche( taille, p, snak, score, nb_pomme, s);
             }
 
                 //qd on frappe une touche
          if(kbhit())
             {                    
                   c=getch();
                   switch(c)
                   {
         case 'd' : if(sens!=GAUCHE){
                       s.x++ ;
                       sens=DROITE;
                       }else s.x-- ; break;
         case 'q' : if(sens!=DROITE){
                       s.x-- ;
                       sens=GAUCHE;
                       }else s.x++ ; break;
         case 's' : if(sens!=HAUT){
                       s.y++ ;
                       sens=BAS;
                       }else s.y-- ; break;
         case 'z' : if(sens!=BAS){
                       s.y-- ;
                       sens=HAUT;
                       }else s.y++ ; break;
         case 'p' : getch() ; break;
                        }
         }
         
         }    

 

    while(!exit);  
}  
 
 
/*============================================================================*/
/* FONCTION PRINCIPALE */
/*============================================================================*/
 
int main()
{  
    system("title SNAKE 2006 par redrum261" );  
     
    jeu();
 
    return 0;
}

Reply

Marsh Posté le 03-06-2006 à 15:25:13   

Reply

Marsh Posté le 03-06-2006 à 15:33:37    

redrum261 a écrit :

j'ai un petit problème [avec] mon serpent


http://greensboring.com/pod/viagra.gif
 
A part ça, apprend à regler ton compilateur correctement, ça fait le ménage...  
 
Pour gcc  (au minimum) : -Wall -Wextra -O2
 
exit() est une fonction standard. Ne pas donner le nom 'exit' à une variable. Masquage (shadowing), risque de confusion...
 
Mise en ordre des données (suppression des globales, contexte, suppression des copies...).  
 
Mise au point de la détection correcte des fleches.
 
Le serpent s'est animé (ben oui, les variables changent, maintenant...). Par contre, il ne suit pas les regles. Il manque une fifo... Dans 2 directions, il ne bouge pas... Je te laisse mettre ton programme au point. J'espère que tu as compris que
 
1 - On n'utilise pas de globales mais un contexte.
2 - On ne passe pas de structure à une variable, mais son adresse.
3 - Si une variable doit être modifiée, on passe son adresse.
 
Nota... La donnée constante 'taille' pourrait être intégrée dans le contexte... Ca ferait un paramètre de moins...

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio2.h>
  4. #include <windows.h>
  5. #define GAUCHE 75
  6. #define DROITE 77
  7. #define HAUT 72
  8. #define BAS 80
  9. #define ESC 27
  10. /*============================================================================*/
  11. /* Variables globales */
  12. /*============================================================================*/
  13. /*============================================================================*/
  14. /* Structure */
  15. /*============================================================================*/
  16. typedef struct
  17. {
  18.    int x;                       //coordonnées en x
  19.    int y;                       //coordonnées en y
  20. }
  21. Coord;
  22. typedef struct
  23. {
  24.    int Niv[80][23];
  25.    int sens;
  26.    Coord p;
  27.    Coord s;
  28.    Coord snak[1000];            //coord du snake
  29. }
  30. game_s;
  31. /*============================================================================*/
  32. /* Affichage et interface */
  33. /*============================================================================*/
  34. #if 0
  35. static void efface_menu (void)
  36. {
  37.    int i;
  38.    gotoxy (1, 1);
  39.    for (i = 1; i < 79; i++)
  40.       putch (' ');
  41. }
  42. #endif
  43. static void message (char const *mess1)
  44. {
  45.    clrscr();
  46.    gotoxy (50, 1);
  47.    cprintf ("%s", mess1);
  48.    getch ();
  49. }
  50. static void gameOver (void)
  51. {
  52.    message ("===== GAME OVER =====" );
  53. }
  54. static int affiche (game_s *this
  55.                     , int const taille
  56.                     , int const score
  57.                     , int const nb_pomme)
  58. {
  59.    int i, j;
  60.    //si snake mange sa queue
  61.    for (i = 2; i < taille; i++)
  62.    {
  63.       if (this->snak[0].x == this->snak[i].x && this->snak[0].y == this->snak[i].y)
  64.       {
  65.          gameOver ();
  66.          exit (0);
  67.          return 0;
  68.       }
  69.    }
  70.    //teste les collisions avec des paroies
  71.    for (i = 2; i < 23; i++)
  72.    {
  73.       for (j = 0; j < 80; j++)
  74.       {
  75.          if (this->Niv[j][i] == 1)
  76.          {
  77.             if (this->snak[0].x == (j + 1) && this->snak[0].y == (i + 3))
  78.             {
  79.                gameOver ();
  80.                exit (0);
  81.                return 0;
  82.             }
  83.          }
  84.       }
  85.    }
  86.    //dessine le snake
  87.    for (i = 0; i < taille; i++)
  88.    {
  89.       gotoxy (this->snak[i].x, this->snak[i].y);
  90.       if (i == 0)
  91.       {
  92.          cprintf ("\x2" );        //dessine la tête
  93.       }
  94.       if (i != 0 && i < taille)
  95.       {
  96.          cprintf ("\xf" );        //dessine le corps
  97.       }
  98.    }
  99.    //dessine le score, le record, le nombre de pommes mangées
  100.    gotoxy (1, 2);
  101.    for (i = 0; i < 80; i++)
  102.       printf ("\xC4" );
  103.    gotoxy (2, 1);
  104.    printf (" Score: %d|", score);
  105.    printf (" Pomme(s): %d|", nb_pomme);
  106.    return 1;
  107. }
  108. /*============================================================================*/
  109. /* Moteur du jeu */
  110. /*============================================================================*/
  111. static void cherche_pomme (game_s *this, int const taille)
  112. {
  113.    int out;
  114.    int x;
  115.    int y;
  116.    do
  117.    {
  118.       int ind = 0;
  119.       out = 1;
  120.       x = (rand () % 79) + 1;
  121.       y = (rand () % 22) + 1;
  122.       //verifie si la pomme n'est pas ds le serpent
  123.       while (ind <= taille && out)
  124.       {
  125.          if (x == this->snak[ind].x && y == this->snak[ind].y)
  126.             out = 0;
  127.          ind++;
  128.       }
  129.       //verifie si la pomme n'est pas ds le mur
  130.       {
  131.          int i;
  132.          for (i = 2; i < 22; i++)
  133.          {
  134.             int j;
  135.             for (j = 0; j < 79; j++)
  136.             {
  137.                if (x == (j + 1) && y == (i + 3))
  138.                   out = 0;
  139.             }
  140.             if (!out)
  141.                break;
  142.          }
  143.          if (!out)
  144.             break;
  145.       }
  146.    }
  147.    while (!out)
  148.       ;
  149.    this->p.x = x;
  150.    this->p.y = y;
  151.    //dessine la pomme
  152.    gotoxy (this->p.x, this->p.y);
  153.    cprintf ("\x9d" );
  154. }
  155. static void initialisationJeu (game_s *this, int const taille)
  156. {
  157.    int i;
  158.    clrscr ();
  159.    cherche_pomme (this, taille);
  160.    //initialisation du snake
  161.    this->s.x = 10, this->s.y = 10;
  162.    this->snak[0].x = this->s.x;
  163.    this->snak[0].y = this->s.y;
  164.    for (i = 1; i < taille; i++)
  165.    {
  166.       this->snak[i].x = this->s.x - i;
  167.       this->snak[i].y = this->s.y;
  168.    }
  169.    this->sens = DROITE;
  170. }
  171. //fonction qui gere le jeu
  172. static void jeu (void)
  173. {
  174.    int taille = 3;
  175.    int score = 0;                  //score à 0
  176.    int nb_pomme = 0;               //nb de pommes mangées
  177.    int out = 0;
  178.    game_s game =
  179.       {
  180.          0
  181.       };
  182.    message ("===== PRET? =====" );
  183.    initialisationJeu (&game, taille);
  184.    //grande boucle du jeu
  185.    do
  186.    {
  187.       affiche (&game, taille, score, nb_pomme);
  188.       //qd on frappe pas de touches
  189.       //si le snake mange la pomme
  190.       if (game.snak[0].x == game.p.x && game.snak[0].y == game.p.y)
  191.       {
  192.          gotoxy (game.p.x, game.p.y);
  193.          printf (" " );
  194.          score = (score + 5);
  195.          taille = (taille + 1);
  196.          nb_pomme = (nb_pomme + 1);
  197.          cherche_pomme (&game, taille);
  198.          affiche (&game, taille, score, nb_pomme);
  199.       }
  200.       //deplace le snake dans telle direction
  201.       switch (game.sens)
  202.       {
  203.       case HAUT:
  204.          game.snak[0].x = game.s.x;
  205.          game.snak[0].y = game.s.y--;
  206.       case BAS:
  207.          game.snak[0].x = game.s.x;
  208.          game.snak[0].y = game.s.y++;
  209.       case GAUCHE:
  210.          game.snak[0].x = game.s.x--;
  211.          game.snak[0].y = game.s.y;
  212.       case DROITE:
  213.          game.snak[0].x = game.s.x++;
  214.          game.snak[0].y = game.s.y;
  215.       }
  216.       Sleep (120);
  217.       affiche (&game, taille, score, nb_pomme);
  218.       //qd on frappe une touche
  219.       if (kbhit ())
  220.       {
  221.          int c = getch ();
  222.          switch (c)
  223.          {
  224.          case 224:
  225.          case 0:
  226.             {
  227.                if (kbhit())
  228.                {
  229.                   c = getch();
  230.                   switch (c)
  231.                   {
  232.                   case DROITE:
  233.                      if (game.sens != GAUCHE)
  234.                      {
  235.                         game.s.x++;
  236.                         game.sens = DROITE;
  237.                      }
  238.                      else
  239.                         game.s.x--;
  240.                      break;
  241.                   case GAUCHE:
  242.                      if (game.sens != DROITE)
  243.                      {
  244.                         game.s.x--;
  245.                         game.sens = GAUCHE;
  246.                      }
  247.                      else
  248.                         game.s.x++;
  249.                      break;
  250.                   case BAS:
  251.                      if (game.sens != HAUT)
  252.                      {
  253.                         game.s.y++;
  254.                         game.sens = BAS;
  255.                      }
  256.                      else
  257.                         game.s.y--;
  258.                      break;
  259.                   case HAUT:
  260.                      if (game.sens != BAS)
  261.                      {
  262.                         game.s.y--;
  263.                         game.sens = HAUT;
  264.                      }
  265.                      else
  266.                         game.s.y++;
  267.                      break;
  268.                   }
  269.                }
  270.             }
  271.             break;
  272.          case 'p':
  273.             getch ();
  274.             break;
  275.          }
  276.       }
  277.    }
  278.    while (!out)
  279.       ;
  280. }
  281. /*============================================================================*/
  282. /* FONCTION PRINCIPALE */
  283. /*============================================================================*/
  284. int main ()
  285. {
  286.    puts ("title SNAKE 2006 par redrum261" );
  287.    jeu ();
  288.    return 0;
  289. }


Message édité par Emmanuel Delahaye le 03-06-2006 à 16:37:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 03-06-2006 à 16:19:00    

une centaine de lignes de code pour un truc qui pourrait etre fait  en 10....

Reply

Marsh Posté le 03-06-2006 à 16:37:56    

red faction a écrit :

une centaine de lignes de code pour un truc qui pourrait etre fait  en 10....


En C? Je demande à voir...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 03-06-2006 à 18:55:08    

ok cetait une facon de parler mais ya quand même beaucoup de code pour pas grand chose

Reply

Marsh Posté le 20-06-2006 à 11:21:08    

salut.je voudrai savoir si vous pouvez mettre le code courigé svp.

Reply

Marsh Posté le 20-06-2006 à 11:22:27    

max0072 a écrit :

salut.je voudrai savoir si vous pouvez mettre le code courigé svp.


 

Citation :

[0C] On ne fait pas le boulot à votre place.
 
    * Les demandes du style "vous pouvez faire un programme faisant [...] pour moi ?" sont assez mal vues et n'obtiennent que très rarement de réponses.


Message édité par _darkalt3_ le 20-06-2006 à 11:22:50
Reply

Marsh Posté le 20-06-2006 à 11:54:09    

je voudrai seulement voire la source ,et si tu sais pourquoi hhhhh.j'ai déja programmer un serpent il y a 3 ans quand j'avais 16 ans.toi t'étais en trai de jouer à cache cache.si j'ai demmandé qu'on me le donne je l'ai pas demmandé à toi.tu sais quand tu paurras programmer un rootkit sous unix viens me parler.tu sais rien de moi si tu veux en savoir va dans le site http://www.zone-h.org/index.php?op [...] 3&filter=1 et tu saurras à qui t'as affaire.et salut à tout les autres.
si je réspectais pas l'objectif de ce forum il ne sera plus disponible.dommage que les mec comme toi existe encore

Reply

Marsh Posté le 20-06-2006 à 11:57:34    

oho un warlordz [:totoz]
Apprend à écrire et reviens ensuite stp, tu me fais mal aux yeux.  
 

Citation :

dommage que les mec comme toi existe encore


 :pfff:  

Reply

Marsh Posté le 20-06-2006 à 12:14:51    

tu te croix en train de me fouttre la rage hhhhh,tu viens de me prouver que t'es qu'un salop
tu sais que tu dis n’importe quoi et que tu me fais pitié, tu n’as aucun savoir en informatique un vrai nul comme toi ne peut rien faire dans cette vie que de dire n’importe quoi
je peux pas perdre du temps avec un idiot comme toi,j’ai autres choses à faire,
et en ce qui concerne mon écriture je ne suis pas en train d’écrire à quelqu’un que je respecte
je ne le fais qu’un à un idiot un seul idiot c’est toi,alors je m’en fou j’écris comme je veux
(tous mes respects aux autres)    

Reply

Marsh Posté le 20-06-2006 à 12:14:51   

Reply

Marsh Posté le 20-06-2006 à 12:17:19    

Allez, va rendre le pécé de ton papa !
 
Au revoir [:ban]


Message édité par _darkalt3_ le 20-06-2006 à 12:19:17
Reply

Marsh Posté le 20-06-2006 à 13:03:00    

http://pix.nofrag.com/fa/70/64316e14c93d2445a28a7722ac16.jpeg


Message édité par Elmoricq le 20-06-2006 à 13:12:48
Reply

Marsh Posté le 20-06-2006 à 13:09:52    

max0072 a écrit :

et en ce qui concerne mon écriture je ne suis pas en train d’écrire à quelqu’un que je respecte


 
[:rofl2] [:rofl2] [:rofl2]
[:rofl2] [:rofl2] [:rofl2]
[:rofl2] [:rofl2] [:rofl2]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 20-06-2006 à 13:11:51    

Je dirais même plus : hhhhh


---------------
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Reply

Marsh Posté le 20-06-2006 à 13:13:47    

Encore un qui a suivi tous les conseils de TroU du CUlz  
so

Spoiler :

http://tholdan.free.fr/4chan/1142851059604.gif



Message édité par tholdan le 20-06-2006 à 13:20:16

---------------
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Reply

Marsh Posté le 20-06-2006 à 13:16:46    

allez hop, ban à durée indéterminée [:papatte]


Message édité par Harkonnen le 20-06-2006 à 13:18:58

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-06-2006 à 13:18:30    

je laisse ouvert pour que redrum261 puisse poser des questions, évitez de polluer svp :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-06-2006 à 13:29:52    

MDR qu'est ce qu on rigole ici, j'adore le coup du salop, mais j'ai pas compris pouquoi l'avoir placé ici  ! Un fou ce gars !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed