Friday 4 September 2015

Snake Game with sound and other settings

Sample Screenshots :

C program to make snake game

C program to make snake game

C program to make snake game

C program to make snake game

C program to make snake game



Program:


#define PAUSED 20
#define RESUME 21
#define RIGHT 1
#define UP 11
#define LEFT 111
#define DOWN 1111
#define MAXSIZE 99
#define INITIALSPEED 50
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
#include<math.h>
#include<stdlib.h>

int snakex[MAXSIZE],snakey[MAXSIZE];
int specialFoodX,specialFoodY,specialScore=0;
int spflag,spFood,dirPaused;
int speedTimer=INITIALSPEED,game,themeColor=6;
int highScore=0,currentScore,firstTime=1,setFlag=0,exitFlag,soundFlag=1,musicFlag=1;
int restartFlag=0,lowSpeed=0,snakeColor=3;
char name[10];
void instructions();
int getDir(char key,int dir);
void motion(int dir,int length);
void check();
int  getFoodX();
int  getFoodY();
void specialFood(int flag, int numFood);
void showFood(int x,int y);
void drawSnake(int length, int color);
void defaultSnake();
void gameOver(int snakeLength);
void specialFoodConsumed();
int angel(int dir,int snakeLength);
void drawBoard();
void settings();
void dead(int snakeLength);
void loading();
void scoreBoard();
void eatSound();
void music();
void main(){
   int gd = DETECT, gm;
   int foodConsumed;
   int dir=RIGHT;
   int snakeLength;
   char keyPressed;
   int food[2];

     foodConsumed=1;
   spflag=0;
   spFood=0;
   specialScore=0;
   currentScore=0;
   game=RESUME;
   speedTimer=INITIALSPEED;

     initgraph(&gd,&gm,"C:\\TurboC3\\BGI");
    if(firstTime==1){
    loading();
       instructions();

      }
       initgraph(&gd,&gm,"C:\\TurboC3\\BGI");

    firstTime=0;
   snakeLength=3;
   defaultSnake();
   setcolor(themeColor);
   rectangle(40,40,620,390);

   setviewport(41,41,619,389,1);



  drawBoard();
  drawSnake(snakeLength,CYAN);
  scoreBoard();
  if(musicFlag==1)
  music();

   start: ;

         if(foodConsumed){
        food[0]=getFoodX();
        food[1]=getFoodY();

         }
  drawBoard();

  while( !kbhit() && snakex[0]<580 && snakex[0]>0 && snakey[0]>0 && snakey[0]<300 ){
  drawBoard();
  foodConsumed=0;
  currentScore=snakeLength-3+specialScore;

   if((snakex[0]>=specialFoodX-1 && snakex[0]<=specialFoodX+10 && snakey[0]>=specialFoodY-1 && snakey[0]<=specialFoodY+10) || ( snakex[0]+5>=specialFoodX-1 && snakex[0]+5<=specialFoodX+5 && snakey[0]+5>=specialFoodY-1 && snakey[0]+5<=specialFoodY+5 )){
     specialFoodX=0;
     specialFoodY=0;
     specialFoodConsumed();

   }

   if((snakex[0]>=food[0]-1 && snakex[0]<=food[0]+5 && snakey[0]>=food[1]-1 && snakey[0]<=food[1]+5) || ( snakex[0]+5>=food[0]-1 && snakex[0]+5<=food[0]+5 && snakey[0]+5>=food[1]-1 && snakey[0]+5<=food[1]+5 ))
  {
   if(soundFlag==1)
   eatSound();
   snakeLength++;
   if((snakeLength-3) %5==0){
      spflag=1;
      spFood=1;
       speedTimer=20;
   }

    food[0]=getFoodX();
   food[1]=getFoodY();

   }
  showFood(food[0],food[1]);
  specialFood(spflag,snakeLength-3);
  drawSnake(snakeLength,snakeColor);
  dir= getDir(keyPressed,dir);
        if(dir==PAUSED){
   dir=angel(dirPaused,snakeLength);
   keyPressed=1;
  }
  if(setFlag==1){
   settings();
    setFlag=0;
   keyPressed=1;

   }
  if(exitFlag==0){
     exitFlag=1;
     keyPressed=1;
  }
  if(restartFlag==1){
     restartFlag=0;
     keyPressed=1;
     main();
  }
  motion(dir,snakeLength);
  scoreBoard();
  delay(speedTimer);
  clearviewport();

  }

  if(snakex[0]+5>=580 || snakex[0]<=0 || snakey[0]<=0 || snakey[0]+5>=300)
  {
    gameOver(snakeLength);
  }
  dead(snakeLength);

   keyPressed=getch();
   goto start;

}

void instructions(){
   char start;
   printf("-----------------ShadowHack's Snake Game----------------\n");
   printf("\nInstructions:\n");
   printf("1. Use left,up,right and down arrow keys to move the snake left, top, right, down respectively.\n");
   printf("2. Press 'e' anytime during the game to exit the game.\n");
   printf("3. Prevent snake from hiting the wall.\n");
   printf("4. Collect as many foods as possible to increase the score.\n");
   printf("5. Special food appears during the game which increases the speed of snake.\n");
   printf("6. To bring snake to normal speed consume special food before normal food.\n");
   printf("7. If special food is not consumed before normal food, it disappears.\n");
   printf("8. Special food increases the score thrice as much as the normal food.\n");
   printf("9. Theme change applies on outer boundary after next restart of game.\n");
   printf("\nPlease Enter your name: ");
   scanf("%s",name);
   printf("Press 's' to start the game or 'e' to exit....");
   while(1){
      start=getch();
      if(start=='s')
  break;
      else if(start=='e')
  exit(0);
      else{
  printf("\nPress 's' key to start the game..\n");
  continue;
      }
   }


}

int getDir(char key,int dir){

   char exits;
   if(key==75 && dir!=RIGHT)
      dir=LEFT;

   else if(key==72 && dir!=DOWN )
      dir=UP;

  else if(key==80 && dir!=UP)
      dir=DOWN;

   else if(key==77 && dir!=LEFT)
      dir=RIGHT;

   else if(key=='e'){
      while(1){
  setfillstyle(SOLID_FILL,BLACK);
  bar(150,100,350,200);
  setcolor(themeColor);
  rectangle(150,100,350,180);
  outtextxy(160,110,"Are you sure to exit ? ");
  outtextxy(175,150,"Yes('y')");
  outtextxy(265,150,"No('n')");
  exits=getch();

   if(exits=='y')
     exit(0);
  else if(exits=='n'){
      exitFlag=0;
      break;
    }
  else
     continue;
       }
      }
   else if(key=='p'){
       // game=PAUSED;
 dirPaused=dir;
 dir=PAUSED;

   }
   else if(key=='s')
   setFlag=1;

   return dir;


}

void motion(int dir,int length){
   int i;

   if(dir==RIGHT){

   for(i=length-1;i>0;i--){
  snakex[i]=snakex[i-1];
  snakey[i]=snakey[i-1];
      }
      snakex[0]+=7; // increased by 7 to keep a 2 pixel distance between each part
   }

   if(dir==UP){
       for(i=length-1;i>0;i--){
   snakex[i]=snakex[i-1];
   snakey[i]=snakey[i-1];
       }
       snakey[0]-=7;
   }

   if(dir==LEFT){
      for(i=length-1;i>0;i--){
  snakex[i]=snakex[i-1];
  snakey[i]=snakey[i-1];
      }

      snakex[0]-=7;
    }

    if(dir==DOWN){
 for(i=length-1;i>0;i--){
    snakex[i]=snakex[i-1];
    snakey[i]=snakey[i-1];
 }

  snakey[0]+=7;
    }

}

void drawSnake(int length,int color){
   int i;
   setfillstyle(11,color);
   for(i=0;i<length;i++){
      if(i)
       setfillstyle(SOLID_FILL,color);

      else
       setfillstyle(11,color);

      bar(snakex[i],snakey[i],snakex[i]+5,snakey[i]+5);

   }
}

void check(){
   delay(200);
   clrscr();
   rectangle(40,40,620,340);
   printf("%d %d",snakex,snakey);

}

int  getFoodX(){
   int foodX;
   foodX= rand()%570;
   return foodX;

}

int  getFoodY(){
   int foodY;
   foodY=rand()%290;
   return foodY;

}


void specialFood(int flag,int numFood){

   if(flag){
      specialFoodX=rand()%570;
      specialFoodY=rand()%290;
   }
   if(numFood%5==0&&spFood==1) {
      flag=0;
      setfillstyle(SOLID_FILL,GREEN);
      bar(specialFoodX,specialFoodY,specialFoodX+10,specialFoodY+10);
      spflag=0;
   }

}


void showFood(int x,int y){

   setfillstyle(SOLID_FILL,RED);
   bar(x,y,x+5,y+5);

}

void defaultSnake(){
   snakex[0]=340;
   snakey[0]=240;
   snakex[1]=333;
   snakey[1]=240;
   snakex[2]=326;
   snakey[2]=240;

}

void gameOver(int snakeLength){
   char score[4],hi_score[4];
   char ex;
   setcolor(RED);
   outtextxy(260,150,"GAME OVER !!");
   setcolor(GREEN);
   score[0]=48+(currentScore)/100;
   score[1]=48+(currentScore)/10;
   score[2]=48+(currentScore)%10;
   score[3]='\0';

    hi_score[0]=48+(highScore)/100;
    hi_score[1]=48+(highScore)/10;
    hi_score[2]=48+(highScore)%10;
    hi_score[3]='\0';

   outtextxy(250,170,"Your Score: ");
   outtextxy(340,170,score);
   if(highScore>currentScore){
      outtextxy(250,190,"High Score: ");
      outtextxy(340,190,hi_score);
     moveto(200,210);
      outtext(name);
      outtext(", you can play better !!");
   }
   else if(highScore!=0){
      outtextxy(250,190,"New High Score: ");
      moveto(250,210);
      outtext("Well done,");
      outtext(name);
      outtext("!");

      }
   setfillstyle(SOLID_FILL,RED);
   drawSnake(snakeLength,RED);
   printf("Press Esc to exit...\n");
   printf("Press 'r' to restart the game..");
   while(1){
     drawBoard();
      ex=getch();
      if(ex==27)
  exit(0);
      else if(ex=='r'){

    cleardevice();
   closegraph();
   main();
  }
      else
  continue;
   }
}

void specialFoodConsumed(){

    if(soundFlag==1)
       eatSound();
   setfillstyle(SOLID_FILL,BLACK);
   bar(specialFoodX,specialFoodY,specialFoodX+10,specialFoodY+10);
   if(lowSpeed==1)
   speedTimer=100;
   else
   speedTimer=50;

   spFood=0;
   specialScore+=2;

}

int angel(int dir,int snakeLength){

   setcolor(themeColor);
   scoreBoard(snakeLength);

   setcolor(themeColor);
   outtextxy(150,100,"Game Paused! Press 'p' to resume");
   while(!('p'==getch()));
   return dir;

}

void scoreBoard(){
   char score[4],hi_score[4];
   score[0]=48+(currentScore)/100;
   score[1]=48+(currentScore)/10;
   score[2]=48+(currentScore)%10;
   score[3]='\0';

   if(currentScore>highScore)
       highScore=currentScore;

    hi_score[0]=48+(highScore)/100;
    hi_score[1]=48+(highScore)/10;
    hi_score[2]=48+(highScore)%10;
    hi_score[3]='\0';

    setcolor(themeColor);

   outtextxy(3,331,"HighScore: ");
   outtextxy(3,311,"Score:");
   outtextxy(150,311,"Pause: 'p' ");
   outtextxy(150,331,"Exit: 'e'");
   outtextxy(250,311,"Settings: 's'");
   rectangle(280,331,580,353);
   moveto(370,311);
   setcolor(YELLOW);
   outtext("Welcome, ");
   outtext(name);
   outtext("!");

   setcolor(themeColor);
   moveto(312,335);
   outtext("www.shadowhackit.blogspot.com");

   outtextxy(51,311,score);
   outtextxy(87,331,hi_score);

}

void drawBoard(){


  setcolor(themeColor);

  line(0,302,578,302);

}


void loading(){
 int i;
 int dot;
 ///settextstyle(1,0,3);
 outtextxy(10,160,"Loading");
 setcolor(LIGHTRED);
 rectangle(10,180,610,200);
 setfillstyle(SOLID_FILL,LIGHTRED);

 for(i=0;i<600;i++)  {
 bar(10,180,10+i,200);
  delay(6);
  if(i%50==0){
  outtextxy(90+dot,160,". ");
   dot+=10;
  }
 }
 cleardevice();
 closegraph();
}


void dead(int snakeLength){
int i,j;
for(i=1;i<snakeLength;i++)
   for(j=1;j<snakeLength;j++){
    if((snakex[0]==snakex[i]||snakey[0]==snakey[i]+5 || snakey[0]==snakey[i]-5) && (snakey[0]==snakey[i] || snakey[0]==snakey[i]+5 ||snakey[0]==snakey[i]-5))
       gameOver(snakeLength);
}



}
void settings(){
    char option,exits;
    int startx=200,starty=40,endx=400,endy=330;
 while(1){

       clearviewport();
    setfillstyle(SOLID_FILL,BLACK);
    setcolor(themeColor);
    rectangle(startx,starty,endx,endy);
     outtextxy(startx+10,starty+10,"        SETTINGS");
    rectangle(startx+5,starty+35,endx-5,starty+60);
    outtextxy(startx+10,starty+43,"Resume Game        'r'");
    rectangle(startx+5,starty+65,endx-5,starty+90);
     outtextxy(startx+10,starty+73,"Restart            't'");
     rectangle(startx+5,starty+95,endx-5,starty+120);
     outtextxy(startx+10,starty+103,"Sound              'o'");
     if(soundFlag==1)
     outtextxy(startx+60,starty+103,"(ON)");
     if(soundFlag==0)
     outtextxy(startx+60,starty+103,"(OFF)");

    rectangle(startx+5,starty+125,endx-5,starty+150);
    outtextxy(startx+10,starty+133,"Music              'm'");
     if(musicFlag==1)
     outtextxy(startx+60,starty+133,"(ON)");
     if(musicFlag==0)
     outtextxy(startx+60,starty+133,"(OFF)");

    rectangle(startx+5,starty+155,endx-5,starty+180);
    outtextxy(startx+10,starty+163,"Theme     ");
    moveto(startx+160,starty+163);
    setcolor(BROWN);
    outtext("1");
    setcolor(MAGENTA);
    outtext("2");
    setcolor(DARKGRAY);
    outtext("3");
    setcolor(LIGHTRED);
    outtext("4");
    setcolor(themeColor);


    rectangle(startx+5,starty+185,endx-5,starty+210);
    outtextxy(startx+10,starty+193,"Speed           'h' 'l'");
    moveto(startx+55,starty+193);
    if(speedTimer==100)
       outtext("(Low)");
    else
      outtext("(Hi)");
    rectangle(startx+5,starty+215,endx-5,starty+240);
    outtextxy(startx+10,starty+223,"Snake Color          ");
    moveto(startx+160,starty+223);
    setcolor(CYAN);
    outtext("5");
    setcolor(LIGHTBLUE);
    outtext("6");
    setcolor(WHITE);
    outtext("7");
    setcolor(LIGHTMAGENTA);
    outtext("8");
    setcolor(themeColor);

    rectangle(startx+5,starty+245,endx-5,starty+270);
    outtextxy(startx+10,starty+253,"Exit Game          'e'");

    while(1){
     option=getch();
     if(option=='r')
     break;
     if(option=='e')
     break;
     if(option=='o')
     break;
     if(option=='m')
     break;
     if(option=='t')
     break;
     if(option=='1'||option=='2'||option=='3'||option=='4')
     break;
     if(option=='5'||option=='6'||option=='7'||option=='7')
     break;

     if(option=='h'||option=='l')
     break;
   }

   if(option=='r')
      break;
   if(option=='t'){
 currentScore=0;
 restartFlag=1;
 break;
   }
   if(option=='o'){
 if(soundFlag==1)
    soundFlag=0;
    else soundFlag=1;
   }
  if(option=='m'){
 if(musicFlag==1)
    musicFlag=0;
    else
    musicFlag=1;
   }

   if(option=='1')
   themeColor=BROWN;
   if(option=='2')
   themeColor=MAGENTA;
   if(option=='3')
   themeColor=DARKGRAY;
   if(option=='4')
   themeColor=LIGHTRED;
   if(option=='5')
   snakeColor=CYAN;
   if(option=='6')
   snakeColor=LIGHTBLUE;
   if(option=='7')
   snakeColor=WHITE;
   if(option=='8')
   snakeColor=LIGHTMAGENTA;


   if(option=='h'){
     lowSpeed=0;
     speedTimer=50;

     }
   if(option=='l'){
     lowSpeed=1;
     speedTimer=100;
     }
   if(option=='e')
 while(1){
  setfillstyle(SOLID_FILL,BLACK);
  bar(150,100,350,200);
  setcolor(themeColor);
  rectangle(150,100,350,180);
  outtextxy(160,110,"Are you sure to exit ? ");
  outtextxy(175,150,"Yes('y')");
  outtextxy(265,150,"No('n')");
  exits=getch();

   if(exits=='y')
     exit(0);
  else if(exits=='n'){
      clearviewport();
      break;
    }
  else
     continue;
       }


    }
}


void eatSound(){
   sound(2000*2);
    delay(5);
    nosound();

}

void music(){

 sound(4000);
 delay(400);
 sound(3400);
 delay(400);
 sound(3000);
 delay(400);
 sound(3600);
  delay(400);
 sound(2400);
  delay(500);
  delay(100);
  nosound();

}


No comments:

Post a Comment