Snake sous dev c++ en mode texte

Description

Voici un jeu de snake réalisé sous dev c++, on peut choisir les dimensions du terrain ainsi que les niveaux

Source / Exemple :


#include <conio.c>
#include <stdio.h>
#include <time.h>

int i, j;
int ox, oy;
int x, y, avx, avy;
int lignes, colonnes;
char c;
int sens, vitesse;
int snake, avsnake, greffe=5;
int poxal, poyal, pomme=0;
int posx[201];
int posy[201];
int c_fond=62, c_bordure=49 , c_pomme=44, c_normal=15, c_snake=2;
int niveau=1;
int gagne=0;
char recommencer;

void reglages();
void tableau();
void initsnake();
void collision();
void test_clavier();
void affichage_snake();
void test_position();
void creer_pomme();
void test_pomme();
void gagner();
void perdu();
void eff_ecran();

void main(){

   if(gagne!=1) reglages();
   srand(time(NULL));
   tableau();
   creer_pomme();
   initsnake();
   do{
      collision();
      test_pomme();
      test_position();
      affichage_snake();
      test_clavier();

   }while((c!=27) && (x!=ox+(colonnes)) && (x!=ox-1) && (y!=oy+(lignes)) && (y!=oy-1));
   perdu();
}

void reglages(){
   clrscr();
   textcolor(c_normal);
   gotoxy(30,2);printf("---------");
   gotoxy(30,3);printf("| SNAKE |");
   gotoxy(30,4);printf("---------");
   gotoxy(1,9);
   do{
      printf(" lignes (entre 10 et 15) : ");
      scanf("%d",&lignes);
   }while((lignes<10) || (lignes>15));
   do{
      printf("\n colonnes (entre 10 et 60) : ");
      scanf("%d",&colonnes);
   }while((colonnes<10) || (colonnes>60));
   do{
      printf("\n niveau (entre 1 et 6) : ");
      scanf("%d",&niveau);
   }while((niveau<1) || (niveau>6));
   do{
      gotoxy(26,19);
      printf(" appuyer sur une touche");
      Sleep(650);
      gotoxy(26,19);
      printf("                       ");
      Sleep(650);
   }while(kbhit()==0);
   clrscr();
}

void tableau(){
    ox=39-(colonnes/2);
    oy=14-(lignes/2);
    textcolor(c_normal);
    gotoxy(30,2);printf("---------");
    gotoxy(30,3);printf("| SNAKE |");
    gotoxy(30,4);printf("---------");
    textcolor(c_fond);
    for(i=0;i<=colonnes+1;i++){
      for(j=0;j<=lignes+1;j++){
         gotoxy((ox-1)+i,(oy-1)+j);
         if((ox+i==ox)||(ox+i-1==(ox+colonnes))||(oy+j==oy)||(oy+j-1==(lignes+oy))){
            textcolor(c_bordure); 
            printf("%c",178);
         }
         else printf("%c",177);
         textcolor(c_fond);
      }
   }
}

void initsnake(){
   x=35;
   y=14;
   snake=5;
   for(i=0;i<=201;i++){
      posx[i]=0;
      posy[i]=0;
   }
   for(i=snake;i>0;i--,x++){
      posx[i]=x;
      posy[i]=y;
   }
   x--;
   avx=x; avy=y;
   sens=1;
   j=0;
}

void collision(){
   for(i=2;i<=snake;i++){
      if((posx[1]==posx[i])&&(posy[1]==posy[i])) perdu();
   }
}

void creer_pomme(){
   textcolor(c_pomme);
   poxal= ( rand()% colonnes )+ ox ;
   poyal= ( rand()% lignes)+ oy  ;
   for(i=1;i<=snake;i++){
      if((poxal==posx[i])&&(poyal==posy[i])) creer_pomme();
   }
   gotoxy(poxal,poyal); printf("%c",770);
   if(gagne==1)getch();
}

void test_pomme(){
    if((posx[1]==poxal)&&(posy[1]==poyal)){
       pomme++;
       gagner();
       snake+=greffe;
       creer_pomme();
    }
}

void affichage_snake(){
   for(i=snake;i>=0;i--){
      gotoxy(posx[i],posy[i]);
      if(i==0){
         textcolor(c_fond);
         printf("%c",177);
      }else textcolor(c_snake);
         if(i==1)           printf("%c",178);
         if((i!=0)&&(i!=1)) printf("%c",219);
   }
   textcolor (c_normal);
   gotoxy(ox-1,oy+lignes+2);
   printf("niveau: %2.d",niveau);
   gotoxy(ox-1,oy+lignes+2+1);
   printf("pomme(s) :%2.d/%2.d",pomme,(((lignes*colonnes)/30)+6));
   textcolor (c_fond);
}

void test_position(){
   if((avx!=x)||(avy!=y)){
      if(snake==avsnake){
         posx[0]=posx[snake];
         posy[0]=posy[snake];
         for(i=snake;i>1;i--){
            posx[i]=posx[i-1];
            posy[i]=posy[i-1];
         }
      }
      if(snake!=avsnake){

         posx[0]=posx[avsnake];
         posy[0]=posy[avsnake];
         for(i=avsnake;i>1;i--){
            posx[i]=posx[i-1];
            posy[i]=posy[i-1];
         }
         for(i=(avsnake+1);i<=snake;i++){
            posx[i]=posx[i-1];
            posy[i]=posy[i-1];
         }
      }
      if(avx!=x) posx[1]=x;
      if(avy!=y) posy[1]=y;
   }
   avsnake=snake;
   avx=x; avy=y;
}

void test_clavier(){
   if(kbhit()==1){
      c=getch();
      switch(c){
         case 'd' : if(sens!=3){
                       x++ ;
                       sens=1;
                       }else x-- ; break;
         case 'q' : if(sens!=1){
                       x-- ;
                       sens=3;
                       }else x++ ; break;
         case 's' : if(sens!=2){
                       y++ ;
                       sens=4;
                       }else y-- ; break;
         case 'z' : if(sens!=4){
                       y-- ;
                       sens=2;
                       }else y++ ; break;
         case 'p' : getch() ; break;
      }
   }
   else{
      switch(sens){
         case 1 : x++; break;
         case 3 : x--; break;
         case 4 : y++; break;
         case 2 : y--; break;
      }
   }
   switch(niveau){
         case 1: vitesse=120  ; break ;
         case 2: vitesse=90   ; break ;
         case 3: vitesse=65   ; break ;
         case 4: vitesse=40   ; break ;
         case 5: vitesse=20   ; break ;
         case 6: vitesse=15   ; break ;
      }
   Sleep(vitesse);
}

void gagner(){
   if(pomme==(((lignes*colonnes)/30)+6)){
      pomme=0;
      eff_ecran();
      niveau++;
      if(niveau>7){
         gagne=0;
         gotoxy(30,7);
         textcolor(c_normal);
         printf(" Gagne ");
         Sleep(700);
         getch();
         main();
      }
      gagne=1;
      main();
   }
}

void perdu(){
  do{
      pomme=0;
      if(kbhit()==1) exit(1);
      i++;
      textcolor(c_normal);
      gotoxy(32,3);
      printf("PERDU");
      Sleep(700);
      gotoxy(32,3);
      printf("     ");
      Sleep(700);
   }while(kbhit()==0);
   getch();
   Sleep(60);
   textcolor(c_normal);
   gotoxy(30,2);
   printf("         ");
   gotoxy(30,4);
   printf("         ");
   gotoxy(26,3);
   printf("recommencer? (o/n)");
   do{
      recommencer=getch();
      if((recommencer=='o')||(recommencer=='O')){
         lignes=0;
         colonnes=0;
         eff_ecran();
         main();
      }
      if((recommencer=='n')||(recommencer=='N')) exit(1);
   }while((recommencer!='o')||(recommencer!='O')||(recommencer!='n')||(recommencer!='N'));
}

void eff_ecran(){
   textcolor(0);
   for(i=0;i<=70;i++){
      for(j=0;j<=23;j++){
         gotoxy(i,j);
         printf("%c",177);
      }
   }
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.