Snake game using C language under Turbo C++ compiler

Snake game using C language under Turbo C++ compiler
In this C language IT project, we present one of the oldest and widely playing snake game. This snake game is coded under TURBO C++ compiler using graphics.

HEADER FILES:

This game code contains so many header files to include large number of functions used in game design. We use file header to save users name, high score, rank etc in a text file. Text file is save in users computer under Turbo
C++ folder. This text file is save permanently while user quit game. This game also include time header to display current time and date at playing screen. This include graphic header to include graphic functions to add color files, text style files, screen border and other so many functions. This also includes many other header files like dos.h, string.h, iomanip.h, stdlib.h etc to add more functions. This game also shows our coders name at first screen.


GRAPHICS UNDER C LANGUAGE:

We use graphics in this game which is most important in games design. Graphic files are included in this game by adding header file graphics.h. This header file includes large number of functions like setcolor(), settextstyle(), rectangle(), outtextxy() etc.




SNAKE GAME DESCRIPTION:

After running this game under TURBO C++ you see first screen that shows
our coders name. You can press any key to continue to game options. There are five options are available for users like playing, view high score, change levels, change mage and others. Our coder add three mazes that are simple with no boundary, simple with boundary and third one is obstacle mage. There are also different levels for beginners, intermediate and for expert. Users can select level according to his expertise. There are also so many features available that you feel after running this game.




C LANGUAGE CODE:

#include<fstream.h>
#include<stdlib.h>
#include<process.h>
#include<stdio.h>
#include<time.h>
#include<dos.h>
#include<string.h>
#include<graphics.h>
#include<bios.h>
#include<conio.h>
#include<iomanip.h>

unsigned key;
int len=0,count=0,foodtype=0,d,m,food_flag=0,j=0,i=0,display_count=10,
hscore_pos=0,x_index=0,y_index=0,mx,my,maze=1,speed=100;
long score=0,ti_elap=0,ti_rem=15,tot_ti=15,ti_init;
char *main_menu[]={{"1. Play"},{"2. Options"},{"3. Instruction"},{"4. Hi-Score"},{"5. Exit"}};
char *game_menu[]={{"1. Mazes"},{"2. Level"},{"3. Back to Main menu"}};
char *maze_menu[]={{"1. Open"},{"2. Box"},{"3. Twisted"},{"4. Return to Main menu"}};
char *level_menu[]={{"1. Beginner"},{"2. Intermediate"},{"3. Expert"},{"4. Return to Main menu"}};
char *m_m[]={"P","O","I","H","E"};
char *g_m[]={"M","L","B"};
char *mm[]={"O","B","T","R"};
char *lm[]={"B","I","E","R"};
int maze3_x[][14]={{2,3,4,5,6,7,8,9,10,11,12,13,14,15},{25},{30},{37,38,39,40,41,42,43,44,45,46,47,48,49,50}};
int maze3_y[][14]={{30},{2,3,4,5,6,7,8,9,10,11,12,13,14,15},{27,28,29,30,31,32,33,34,35,36,37,38,39,40},{20}};

  void showfood();
  void end();
  void show_game_menu();
  void show_main_menu();
enum{UP=1,RIGHT=2,DOWN=3,LEFT=4}DIRECTION,Pre_Dir;
struct
{
 unsigned x:7 ;
 unsigned y:7 ;
}coordinate[1000],tail,head,food;
inline void initialise()
{

  d=DETECT;
  initgraph(&d,&m,"e:\tc\bgi");
  cleardevice();
  mx=getmaxx();
  my=getmaxy();
}
void RESET()
{
  len=count=foodtype=food_flag=i=j=hscore_pos=x_index=y_index=0;
  display_count=10,
  speed=100;
  score=ti_elap=0;ti_rem=tot_ti=15;
  head.x=head.y=tail.x=tail.y=food.x=food.y=0;
  for(i=0;i<1000;i++)
  coordinate[i].x=coordinate[i].y=0;
}
 void showoff_food()
  {
   gotoxy(food.x,food.y);
   cout<<" ";
   food.x=food.y=0;
   showfood();
  }
int showfoodtimer(int fo_fl)
{
 if(fo_fl==1)
 {
  if(ti_rem<=0)
   {
             showoff_food();
             ti_rem=15;
             food_flag=0;
   }
  else
  {
   ti_elap=((biostime(0,0L)-ti_init)/(speed/16));
   ti_rem=(tot_ti-(ti_elap));
   gotoxy(7,46);
   if(ti_rem<10)
            cout<<"0"<<ti_rem;
   else
            cout<<ti_rem;
  }
 }
 else
  {
   gotoxy(7,46);
   cout<<"  ";
  }
  return 0;
}
void showfood()
{
 int flag=0;
 re:
 food.x=random(49)+2;
 food.y=random(39)+2;
 for(i=0;i<len;i++)
 {
  if(food.x==coordinate[i].x && food.y==coordinate[i].y)
            goto re;
 }
 if(maze==3)
  {
   for(i=0;i<4;i++)
   {
            for(j=0;j<14;j++)
            {
             if(food.x==maze3_x[i][j])
              flag=1;
            }
            for(j=0;j<14;j++)
            {
             if(food.y==maze3_y[i][j] && flag==1)
                        goto re;
            }
   }
  }
 gotoxy(food.x,food.y);
 textcolor(RED);
 cprintf("@");
}
void showbigfood()
{
 re1:
 food.x=random(49)+2;
 food.y=random(39)+2;
 for(int j=0;j<len;j++)
 {
 if(food.x==coordinate[j].x && food.y==coordinate[j].y)
 goto re1;
 }
  textcolor(YELLOW);
  gotoxy(food.x,food.y);
  cprintf("é");
}
void exit()
{
             delay(50);
             textmode(4);
             gotoxy(10,8);
             cout<<"Exiting the program";
             delay(2000);
             exit(0);
}
void border()
{
  setcolor(GREEN);
  rectangle(2,2,mx-2,my-2);
  setcolor(RED);
  rectangle(4,4,mx-4,my-4);
  setcolor(GREEN);
  rectangle(6,6,mx-6,my-6);
  settextstyle(4,0,5);
  outtextxy(180,40,"SNAKEMAN");
  setcolor(YELLOW);
  line(165,88,440,88);
  setcolor(RED);
  line(165,90,440,90);
}
void intro_graphics()
{
  clrscr();
  initialise();
  border();
  settextstyle(6,0,3);
  setcolor(RED);
  outtextxy(130,200,"Programmed By:");
  settextstyle(1,0,3);
  setcolor(WHITE);
  outtextxy(330,200,"Faisal Malik");
  outtextxy(150,235,"Itianz.Com");
  //outtextxy(150,275,"");
  settextstyle(1,0,4);
  setcolor(RED);
  outtextxy(120,360,"Press any key to play");
  getch();
}
void showtime()
{
  char datebuf[9];
  char timebuf[9];
  _strdate(datebuf);
  _strtime(timebuf);
  gotoxy(30,45);
  cout<<" DATE TIME";
  gotoxy(30,46);
  cout<<datebuf<<" "<<timebuf;
}
inline void showscore()
{
  gotoxy(15,45);
  cout<<"SCORE";
  gotoxy(16,46);
  cout<<score;
}
char *return_maze()
{
 switch(maze)
 {
  case 1: return ("OPEN");
  case 2: return ("BOX");
  case 3: return ("TWISTED");
 }
 return "OPEN";
}
void init()
{
  DIRECTION=Pre_Dir=RIGHT;
  gotoxy(60,30);
  cout<<"M A Z E";
  gotoxy(60,32);
  cout<<return_maze();
  gotoxy(5,45);
  cout<<"Timer";
  randomize();
  _setcursortype(_NOCURSOR);
  showtime();
  showscore();
  tail.x=10;
  tail.y=10;
  for(int i=10;i<15;i++)
  {
   coordinate[len].x=i;
   coordinate[len].y=10;
   gotoxy(coordinate[len].x,coordinate[len].y);
   cout<<char(223);
   len++;
  }
  head.x=14;
  head.y=10;
  textcolor(BLUE);
  for(i=1;i<=50;i++)
   {
              j=1;
              gotoxy(i,j);
               cprintf("");
              gotoxy(i,j+40);
               cprintf("");
   }
  for(i=1;i<=41;i++)
   {
              j=1;
              gotoxy(j,i);
               cprintf("");
              gotoxy(j+50,i);
               cprintf("");
   }
  showfood();
}
void show_snake(int DIRECTION)
{
   gotoxy(head.x,head.y);
   textcolor(GREEN);
   switch(DIRECTION)
   {
            case UP   :
                        if(Pre_Dir==LEFT)
                          cprintf("Ý");
                        else
                          cprintf("Þ");
                        break;
            case RIGHT:
                        if(Pre_Dir==DOWN)
                          cprintf("Ü");
                        else
                          cprintf("ß");
                        break;
            case DOWN :
                        if(Pre_Dir==RIGHT)
                          cprintf("Þ");
                        else
                          cprintf("Ý");
                        break;
            case LEFT :
                        if(Pre_Dir==UP)
                          cprintf("ß");
                        else
                          cprintf("Ü");
                        break;
   }
}
inline void showoff()
{
 gotoxy(tail.x,tail.y);
 cout<<" ";
}
inline void SOUND()
{
 sound(1500);
 delay(55);
 nosound();
}
void gameover()
{
 sound(1220);
 delay(500);
 nosound();

 initialise();
 border();
 settextstyle(1,0,5);
 setcolor(RED);
 outtextxy(130,180,"GAME  OVER");

 settextstyle(1,0,5);
 setcolor(BLUE);
 outtextxy(140,250,"SCORE");

 gotoxy(48,16);
 char *s;
 ltoa(score,s,10);
 outtextxy(325,250,s);

 settextstyle(4,0,5);
 setcolor(WHITE);
 outtextxy(65,350,"Wish to continue:(Y/N):");
 char ch=getche();

 if(ch=='y'||ch=='Y')
 {
  outtextxy(510,350,"Y");
  getch();
  RESET();
  initialise();
  show_main_menu();
 }
 else if(ch=='n'||ch=='N')
  {
   outtextxy(510,350,"N");
   free(maze_menu);
   free(main_menu);
   free(level_menu);
   free(game_menu);
   free(m_m);
   free(mm);
   free(lm);
   free(g_m);
   exit();
  }
}
void loadmaze()
{
 if(maze==3)
 {
  textcolor(WHITE);
  for(i=1;i<15;i++)
  {
   gotoxy(i+1,30);
   cprintf("²");
   gotoxy(25,i+1);
   cprintf("²");
   gotoxy(36+i,20);
   cprintf("²");
   gotoxy(30,26+i);
   cprintf("²");
  }
 }
}
void game()
{
  init();
  loadmaze();
  sleep(2);
  while(1)
  {
   if(bioskey(1))
   {
             key=bioskey(0);
             int s=key>>8;
             if(s==1)
              exit();
             else
             if(s==72)
             {
              if(DIRECTION==4 || DIRECTION==2)
               {
                         Pre_Dir=DIRECTION;
                         DIRECTION=UP;
               }
             }
             else if(s==80)
             {
              if(DIRECTION==4 || DIRECTION==2)
               {
                         Pre_Dir=DIRECTION;
                         DIRECTION=DOWN;
               }
             }
             else if(s==77)
             {
              if(DIRECTION==1 || DIRECTION==3)
               {
                         Pre_Dir=DIRECTION;
                         DIRECTION=RIGHT;
               }
             }
             else if(s==75)
             {
              if(DIRECTION==1 || DIRECTION==3)
               {
                         Pre_Dir=DIRECTION;
                         DIRECTION=LEFT;
               }
             }
   }

   if(DIRECTION==2)
             head.x++;
   else if(DIRECTION==1)
             head.y--;
   else if(DIRECTION==4)
             head.x--;
   else if(DIRECTION==3)
             head.y++;

   if(maze==1)
   {
            if(head.x>50)
               head.x=2;
            else if(head.x<=1)
               head.x=50;
            if(tail.x>50)
               tail.x=2;
            else if(tail.x<=1)
               tail.x=50;
            if(head.y>40)
               head.y=2;
            else if(head.y<=1)
               head.y=40;
            if(tail.y>40)
               tail.y=2;
            else if(tail.y<=1)
               tail.y=40;
   }

   else if(maze==2)
   {
             if(head.x>50 ||head.y>40 ||head.x<2 ||head.y<2)
              gameover();
   }
   else if(maze==3)
   {
            for(i=2;i<16;i++)
            {
             if((head.x==25 && head.y==i)||(head.x==i && head.y==30)
                        ||(head.x==35+i && head.y==20)||(head.x==30 && head.y==25+i))
              {
                                    gameover();
              }
            }
   if(head.x>50)
               head.x=2;
   else if(head.x<=1)
               head.x=50;
   if(tail.x>50)
               tail.x=2;
   else if(tail.x<=1)
               tail.x=50;
   if(head.y>40)
               head.y=2;
   else if(head.y<=1)
               head.y=40;
   if(tail.y>40)
               tail.y=2;
   else if(tail.y<=1)
               tail.y=40;
 }


   for(int i=0;i<len;i++)
             {
              if(head.x==coordinate[i].x && head.y==coordinate[i].y)
                        {
                          gameover();
                        }
             }

            show_snake(DIRECTION);

            if(head.x==food.x && head.y==food.y)
             {
                         count++;
                         if(ti_rem>5)
                           score+=(foodtype*8)+2+(foodtype*((ti_rem*3)/2));
                         else
                           score+=(foodtype*8)+2;

              ti_rem=15;
              SOUND();
              food.x=food.y=0;

              if(count==5)
               {
                         showbigfood();
                         food_flag=1;
                         ti_init=biostime(0,0);
                         showfoodtimer(1);
                         foodtype=1;
                         count=0;
               }
              else
               {
                         showfood();
                         food_flag=0;
                         foodtype=0;
               }
              len++;
             }
            else
             {
              tail.x=coordinate[0].x;
              tail.y=coordinate[0].y;

              showoff();

                        for(int k=0;k<len-1;k++)
                         {
                                    coordinate[k].x=coordinate[k+1].x;
                                    coordinate[k].y=coordinate[k+1].y;
                         }
             }

            coordinate[len-1].x=head.x;
            coordinate[len-1].y=head.y;

            delay(speed);
            showtime();
            showscore();
            showfoodtimer(food_flag);

            gotoxy(64,14);
            cout<<"X-Cor Y-Cor";

            gotoxy(65,15);
            cout<<head.x<<"    "<<head.y;
  }
}

void get_level_choice()
{
 get:
 int cho=bioskey(0);
 cho=cho>>8;
 switch(cho)
 {
  case 2:
  case 48:
  case 28:
  case 79: speed=125;
                           show_main_menu();
                           break;
  case 3:
  case 23:
  case 80: speed=90;
                           show_main_menu();
                           break;
  case 4:
  case 18:
  case 81: speed=55;
                           show_main_menu();
                           break;
  case 5:
  case 19:
  case 75: show_game_menu();
                           break;
  default: goto get;
 }
}

void get_maze_choice()
{
 get:
 int cho=bioskey(0);
 cho=cho>>8;
 switch(cho)
 {
  case 2:
  case 28:
  case 24:
  case 79: maze=1;
                           show_main_menu();
                           break;
  case 3:
  case 48:
  case 80: maze=2;
                           show_main_menu();
                           break;
  case 4:
  case 20:
  case 81: maze=3;
                           show_main_menu();
                           break;
  case 5:
  case 19:
  case 75:         show_game_menu();
                           break;
  default: goto get;
 }
}

void getlevel()
{
  cleardevice();
  border();

  settextstyle(1,0,5);
  setcolor(RED);
  outtextxy(50,140,"L E V E L");

  settextstyle(3,0,5);
  for(i=0;i<4;i++)
  {
   setcolor(WHITE);
   outtextxy(67,190+(45*i),level_menu[i]);
   setcolor(RED);
   outtextxy(130,190+(45*i),lm[i]);
  }
  get_level_choice();
}


void getmaze()
{
  cleardevice();
  border();

  settextstyle(1,0,5);
  setcolor(RED);
  outtextxy(50,140,"M A Z E S");
  settextstyle(3,0,5);

  for(i=0;i<4;i++)
  {
   setcolor(WHITE);
   outtextxy(67,190+(45*i),maze_menu[i]);
   setcolor(RED);
   outtextxy(130,190+(45*i),mm[i]);
  }
  get_maze_choice();
}

void get_gm_choice()
{
 get:
 int cho=bioskey(0);
 cho=cho>>8;
 switch(cho)
 {
  case 2:
  case 50:
  case 28:
  case 79: getmaze();
                           break;
  case 3:
  case 38:
  case 80: getlevel();
                           break;
  case 4:
  case 48:
  case 81: show_main_menu();
                           break;
  default: goto get;
 }
}

void show_game_menu()
 {
  cleardevice();
  border();
  settextstyle(1,0,5);
  setcolor(RED);
  outtextxy(50,140,"G A M E  M E N U");

  settextstyle(3,0,5);

  for(i=0;i<3;i++)
  {
   setcolor(WHITE);
   outtextxy(67,190+(45*i),game_menu[i]);
   setcolor(RED);
   outtextxy(130,190+(45*i),g_m[i]);
  }
   get_gm_choice();
 }

void play()
{
 cleardevice();
 restorecrtmode();
 textmode(64);
 game();
}

void options()
{
 show_game_menu();
}

void instruction()
{
 cleardevice();
 border();
 setcolor(RED);
 settextstyle(1,0,5);
 outtextxy(50,140,"I N S T R U C T I O N S");
 settextstyle(3,0,3);
 setcolor(WHITE);
 outtextxy(60,190,"1. Move the snake using Arrow Keys -> ");
 outtextxy(60,230,"   UP, DOWN, LEFT, RIGHT");
 outtextxy(60,270,"2. Eat food (@,é) and make snake grow longer.");
 outtextxy(60,300,"3. You will get 2 points for (@) and");
 outtextxy(60,330,"   more points for Bonus food(é)");
 outtextxy(60,365,"4. Don't let it hit the walls or its tail");
 settextstyle(4,0,4);
 setcolor(RED);
 outtextxy(140,425,"Press any key to Continue");
 getch();
 show_main_menu();
}

void hiscore()
{
 cleardevice();
 border();
 setcolor(RED);
 settextstyle(1,0,5);
 outtextxy(50,140,"    H I   S C O R E");
 settextstyle(3,0,3);
 setcolor(WHITE);
 outtextxy(60,220,"Sorry! This feature is not available in this version");
 outtextxy(60,270,"For further details, Contact  :  ");
 setcolor(GREEN);
 outtextxy(60,310,"prince.nsit111@gmail.com");
 outtextxy(60,345,"+91 9013397845");
 settextstyle(4,0,4);
 setcolor(RED);
 outtextxy(140,425,"Press any key to Continue");
 getch();
 show_main_menu();
}
void get_mm_choice()
{
 get:
 int cho=bioskey(0);
 cho=cho>>8;
 switch(cho)
 {
  case 2:
  case 25:
  case 28:
  case 79: play();
  break;
  case 3:
  case 24:
  case 80: options();
  break;
  case 4:
  case 23:
  case 81: instruction();
  break;
  case 5:
  case 35:
  case 75: hiscore();
  break;
  case 6:
  case 18:
  case 76: exit();
  break;
  default: goto get;
 }
}
void show_main_menu()
{
 cleardevice();
 border();
 settextstyle(1,0,5);
 setcolor(GREEN);
 outtextxy(60,130,"M A I N  M E N U");
 settextstyle(3,0,5);
 for(i=0;i<5;i++)
 {
 setcolor(WHITE);
 outtextxy(67,180+(35*i),main_menu[i]);
 setcolor(RED);
 outtextxy(130,180+(35*i),m_m[i]);
 }
 get_mm_choice();
}
void end()
{
  initialise();
  for(j=0;j<=2;j++)
  {
   setcolor(RED+j);
   circle(mx/2,my/2,150+j*2);
  }
  settextstyle(4,0,5);
  outtextxy(mx/2-65,my/2-20,"The End");
  getch();
  closegraph();
  restorecrtmode();
  exit(0);
}
void main()
{
  intro_graphics();
  show_main_menu();
}


No comments:

Powered by Blogger.