Friday, 13 September 2013

FREE SOURCE CODE FOR SNAKEMAN

FREE SOURCE CODE FOR SNAKEMAN


                                                                                              
Author: Winston

Email: winsemerson@gmail.com

Category: C++




#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(3,0,3);
  setcolor(RED);
  outtextxy(130,200,"Programmed By:");
  settextstyle(1,0,3);
  setcolor(WHITE);
  outtextxy(330,200,"Manish Jain");
  outtextxy(150,235,"mkj_manishjain@yahoo.co.in");
  outtextxy(150,275,"         +91 9896455735");
  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 UP arrow key is pressed
  {
   if(DIRECTION==4 || DIRECTION==2)
    {
   Pre_Dir=DIRECTION;
   DIRECTION=UP;
    }
  }
  else if(s==80)  //If DOWN arrow key is pressed
  {
   if(DIRECTION==4 || DIRECTION==2)
    {
   Pre_Dir=DIRECTION;
   DIRECTION=DOWN;
    }
  }
  else if(s==77)   ////If RIGHT arrow key is pressed
  {
   if(DIRECTION==1 || DIRECTION==3)
    {
   Pre_Dir=DIRECTION;
   DIRECTION=RIGHT;
    }
  }
  else if(s==75)   ////If LEFT arrow key is pressed
  {
   if(DIRECTION==1 || DIRECTION==3)
    {
   Pre_Dir=DIRECTION;
   DIRECTION=LEFT;
    }
  }
   }
   if(DIRECTION==2)         //Right Key
  head.x++;
   else if(DIRECTION==1)    //Up Key
  head.y--;
   else if(DIRECTION==4)    //Left Key
  head.x--;
   else if(DIRECTION==3)    //Down Key
  head.y++;
   if(maze==1)              //OPEN maze
   {
 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)         //BOX Maze
   {
  if(head.x>50 ||head.y>40 ||head.x<2 ||head.y<2)
   gameover();
   }
   else if(maze==3)        //TWISTED or SPIRAL Maze
   {
 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,"        mkj_manishjain@yahoo.co.in");
 outtextxy(60,345,"        Mobile no.: +91 9896455735 ");
 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);
}
//MAIN FUNCTION
void main()
{
  intro_graphics();
  show_main_menu();
}

0 comments:

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Best Web Hosting Coupons