#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include<iostream.h>
#include<math.h>
#include<string.h>
#include<process.h>
#define PI 3.14
class snake
 {
  private:
  int sx[10000],sy[10000],d,len,score,x,y;
  public:
     void body (int ,int );  //This function makes the body of snake
     void delbody (int ,int ); //This function delete the body of snake
     void food (int ,int );  //This function makes food
     void enemy (int ,int ); //This function makes enemy
     void head (int,char);   //This function makes Head of the snake
     void stack();  //This function stores the co-ordinates of snake
     void test();  //This function Tests the coordinate of snake
     void display();//This function Display the body of snake
     snake()
     {
     d=0;
     len=0;
     score=0;
     x=260;
     y=260;
     }
     void up()
     {
      y=y-13;
     };
     void down()
     {
     y=y+13;
     };
     void left()
     {
     x=x-13;
     };
     void right()
     {
     x=x+13;
     };
 };
class screen
 {
  public:
     void exitwin(); //This function Designe The Exit window
     void scorewin(int);//This function Designe The Score window
     int startwin();//This function Designe The Start window
     void gamewin();//This function Designe The Game window
 };
void main()
{
   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int x1,y1,x2,y2,f1=0,f2=0,f3=0,f4=0,xf,yf,dela;
   char ch;
   snake sobj;
   screen scobj;
   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "");

   /* read result of initialization */
   errorcode = graphresult();
   /* an error occurred */
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }
  dela=scobj.startwin();
  scobj.gamewin();
  randomize();
  xx:
  xf=random (610);
  if (xf<26)
    goto xx;
  yy:
  yf=random (460);
  if (yf<78)
    goto yy;
  sobj.food(13*abs(xf/ 13),13*abs(yf/13));
  label1:
    if ( kbhit() )
     {
	ch=getche();
	switch (ch)
	{
		case 'H' :
		       if(f2==1)
		       {
			sobj.down();
			sobj.test();
			sobj.stack();
			sobj.head(2,'P');
			sobj.display();
			break;
		       }
			sobj.up();
			sobj.test();
			sobj.stack();
			sobj.head(2,'H');
			sobj.display();
			f1=1;
			f2=0;
			f3=0;
			f4=0;
			break;
		case 'P' :
		      if(f1==1)
		      {
			sobj.up();
			sobj.test();
			sobj.stack();
			sobj.head(2,'H');
			sobj.display();
			break;
			}
			sobj.down();
			sobj.test();
			sobj.stack();
			sobj.head(2,'P');
			sobj.display();
			f1=0;
			f2=1;
			f3=0;
			f4=0;
			break;
		case 'K' :
		       if(f4==1)
			{
			sobj.right();
			sobj.test();
			sobj.stack();
			sobj.head(2,'M');
			sobj.display();
			 break;
			 }
			sobj.left();
			sobj.test();
			sobj.stack();
			sobj.head(2,'K');
			sobj.display();
			f1=0;
			f2=0;
			f3=1;
			f4=0;
			break;
		case 'M' :
			if(f3==1)
			{
			sobj.left();
			sobj.test();
			sobj.stack();
			sobj.head(2,'K');
			sobj.display();
			 break;
			 }
			sobj.right();
			sobj.test();
			sobj.stack();
			sobj.head(2,'M');
			sobj.display();
			f1=0;
			f2=0;
			f3=0;
			f4=1;
			break;
		case 'x' :
		case 'X' :
			  exit(1);
			break;
	}
      }
      else
       {
	   if (f1 == 1)
		{
			sobj.up();
			sobj.test();
			sobj.stack();
			sobj.head(2,'H');
			sobj.display();
			f1=1;
			f2=0;
			f3=0;
			f4=0;
		}
	    if( f2==1)
		{
			sobj.down();
			sobj.test();
			sobj.stack();
			sobj.head(2,'P');
			sobj.display();
			f1=0;
			f2=1;
			f3=0;
			f4=0;
		  }
	     if (f3==1)
		 {
			sobj.left();
			sobj.test();
			sobj.stack();
			sobj.head(2,'K');
			sobj.display();
			f1=0;
			f2=0;
			f3=1;
			f4=0;
		   }
	     if (f4==1)
		 {
		       sobj.right();
		       sobj.test();
		       sobj.stack();
		       sobj.head(2,'M');
		       sobj.display();
			f1=0;
			f2=0;
			f3=0;
			f4=1;
		  }
       }
     delay(dela);
     goto label1;
}
void snake::delbody ( int b, int l )
  {
	setcolor ( BLACK ) ;
	circle(b, l, 5);
	circle(b, l, 4);
	circle(b, l, 3);
	circle(b, l, 2);
	circle(b, l, 1);
	circle(b, l, 0);
	line(b, l, b+10, l+5);
	line(b, l, b+10, l-5);
	line(b, l, b-10, l+5);
	line(b, l, b-10, l-5);
	rectangle ( b -4, l-4, b +4,  l + 4) ;
	rectangle ( b -3, l-3, b +3,  l + 3 ) ;
	rectangle ( b -2, l-2, b +2,  l + 2 ) ;
	rectangle ( b -1, l-1, b +1,  l + 1 ) ;
	rectangle ( b , l, b ,  l ) ;
  }
void snake::food ( int b, int l )
  {
	setcolor ( 2 ) ;
	rectangle ( b -2, l-2, b +2,  l + 2 ) ;
	rectangle ( b -1, l-1, b +1,  l + 1 ) ;
	rectangle ( b , l, b ,  l ) ;
	circle(b, l, 4);
	circle(b, l, 3);
	circle(b, l, 2);
	circle(b, l, 1);
	circle(b, l, 0);

  }
void snake::enemy ( int b, int l )
  {
	setcolor (5) ;
	BLINK;
	rectangle ( b -2, l-2, b +2,  l + 2 ) ;
	rectangle ( b -1, l-1, b +1,  l + 1 ) ;
	rectangle ( b , l, b ,  l ) ;
	circle(b, l, 4);
	circle(b, l, 3);
	circle(b, l, 2);
	circle(b, l, 1);
	circle(b, l, 0);
  }
void snake::stack()
  {
      int r,f,xf,yf;
      f=0;
      screen w;
      randomize();
      if (getpixel(x,y)==RED || getpixel(x,y)==MAGENTA)
	 {
	  cout<<"\a";
	  w.scorewin(score);
	  w.exitwin();
	 }
      else if(getpixel(x,y)==GREEN)
	{
	 randomize();
	 sound(2650);
	 delay(40);
	 sound(1455);
	 delay(40);
	 sound(2530);
	 delay(40);
	 nosound();
	 len++;
	 score=score+10;
	 gotoxy(13,3);cout<<score;
     cc:
       xxx:
	  xf=random (610);
	  if (xf < 26)
	    goto xxx;
       yyy:
	  yf=random (460);
	  if (yf < 78)
	    goto yyy;
       if(getpixel(13*abs(xf/13),13*abs(yf/13))==RED || getpixel(13*abs(xf/13),13*abs(yf/13))==GREEN)
	 goto cc;
       r=random(2);
       if( r==0)
	 food(13*abs(xf/13),13*abs(yf/13));
       else if (r==1)
       {
	 if(f==0)
	   enemy(13*abs(xf/ 13),13*abs(yf/13));
	 f=1;
	 goto cc;
	}
     }
 sx[d]=x;
 sy[d]=y;
 if(d<10)
  len++;
 d++;
}
void snake::test()
  {
    if( x > 612 )
       x=26;
    else if(x < 26 )
       x=612;
    else if(y > 455 )
       y=78;
    else if(y < 78 )
       y=455;
  }
void snake::display()
  {
   int xx,yy,c,i;
   c=d-1;
   if((c-(len+1)) >= 0)
     {
      xx=sx[c-(len+1)];
      yy=sy[c-(len+1)];
      delbody ( xx, yy );
     }
   c--;
   for(i=0;i<len;i++)
    {
     if ((sx[c] >= 0) & (sy[c] >= 0))
      {
       xx=sx[c];
       yy=sy[c];
       body ( xx, yy );
      }
      c--;
    }
}
void screen::scorewin(int score1)
  {
    cleardevice();
	int sz=0,dl=100;
	char msg[20];
	sprintf(msg, "%d", score1);
	for(int i=0 ;i<13 ;i++)
	{
		sz++;
		cleardevice();
		setcolor(i+2);
		settextstyle(0,0,sz);
		outtextxy(200,200,msg);
		delay(dl);
	}
     delay(400);
  }
void screen::exitwin()
  {
   cleardevice();
   int i,p=0,q=15;
   char a[10]={"PRAVEEN"},msg[1];
   setcolor(10);
   settextstyle(0, HORIZ_DIR, 2);
   for(i=1;i<=80;i++)
   {
   if(i%2==0)
      {
	  for(int j=0;j<=6;)
	      {
		  if(j==0)
		   q=p+15;
		 sprintf(msg,"%c",a[j++]);
		 outtextxy(p,160,msg);
		 p=p+30;
		 sprintf(msg,"%c",a[j++]);
		 outtextxy(p,180,msg);
		 p=p+30;
	      }
       }
   else
      {
	 for(int j=0;j<=6;)
	     {
		 if(j==0)
		   p=q+15;
		 sprintf(msg,"%c",a[j++]);
		 outtextxy(q,180,msg);
		 q=q+30;
		 sprintf(msg,"%c",a[j++]);
		 outtextxy(q,160,msg);
		 q=q+30;
	     }
       }
     sound(1000+ rand() %4000);
     delay(200);
     nosound();
     cleardevice();
     if(i==39)
       {
       p=0;q=15;
       sprintf(a,"%s","SAXENA ");
       }
  }
		cleardevice();
		setcolor(6);
		settextstyle(0,0,2);
		outtextxy(80,232,"praveen_saxena_ind@yahoo.co.in ");
		delay(500);
 getch();
 exit(1);
  }
void snake::body ( int b, int l )
  {
	setcolor ( 4 ) ;
	circle(b, l, 5);
	circle(b, l, 4);
	circle(b, l, 3);
	circle(b, l, 2);
	circle(b, l, 1);
	circle(b, l, 0);
	rectangle ( b -4, l-4, b +4,  l + 4) ;
	rectangle ( b -3, l-3, b +3,  l + 3 ) ;
	rectangle ( b -2, l-2, b +2,  l + 2 ) ;
	rectangle ( b -1, l-1, b +1,  l + 1 ) ;
	rectangle ( b , l, b ,  l ) ;

  }
void snake::head ( int c,char h)
  {
       int b,l;
       b=sx[d-2];
       l=sy[d-2];
       setcolor(0);
			line(b, l, b-5, l-10);
			line(b, l, b+5, l-10);
			line(b, l, b-5, l+10);
			line(b, l, b+5, l+10);
			line(b, l, b-10, l+5);
			line(b, l, b-10, l-5);
			line(b, l, b+10, l+5);
			line(b, l, b+10, l-5);
	b=sx[d-1];
	l=sy[d-1];
	setcolor (c) ;
	circle(b, l, 5);
	circle(b, l, 4);
	circle(b, l, 3);
	circle(b, l, 2);
	circle(b, l, 1);
	circle(b, l, 0);
	rectangle ( b -4, l-4, b +4,  l + 4) ;
	rectangle ( b -3, l-3, b +3,  l + 3 ) ;
	rectangle ( b -2, l-2, b +2,  l + 2 ) ;
	rectangle ( b -1, l-1, b +1,  l + 1 ) ;
	rectangle ( b , l, b ,  l ) ;
	switch(h)
	{
		case 'H' :
			line(b, l, b-5, l-10);
			line(b, l, b+5, l-10);
			break;
		case 'P' :
			line(b, l, b-5, l+10);
			line(b, l, b+5, l+10);
			break;
		case 'K' :
			line(b, l, b-10, l+5);
			line(b, l, b-10, l-5);
			break;
		case 'M' :
			line(b, l, b+10, l+5);
			line(b, l, b+10, l-5);
			break;
		case 'x' :
		case 'X':
			  exit(1);
			break;
	}
  }
void screen::gamewin()
  {
    float aa,xx,yy;
    int i,a;
    snake s;
	setcolor(RED);
	settextstyle(0, 0, 2);
	outtextxy(20,10,"KING COBRA");
	settextstyle(0, 0, 1);
	setcolor(15);
	gotoxy(5,3);
	cout<<"SCORE : 0";
	settextstyle(7,0,1);
	setcolor(LIGHTGRAY);
	outtextxy(300,0,"Written by :Praveen Saxena / using C++");
	outtextxy(300,20,"praveen_saxena_ind@yahoo.co.in");
	setcolor(15);
	outtextxy(300,40,"FOOD:   ENEMY:     Press X or x to EXIT");
	s.food(13*27,13*(3.3));
	s.enemy(13*33,13*(3.3));
	setcolor(BLUE);
	rectangle(13,63,623,467);
	rectangle(10,60,626,470);
  }
int screen::startwin()
  {
    int del,i,y,tx,ty,bx,by,x;
    char ch,c,msg[80];
     yy:
	cleardevice();
	setcolor(BLUE);
	rectangle(13,7,623,467);
	rectangle(10,4,626,470);
	setcolor(WHITE);
	settextstyle(0, 0, 3);
	outtextxy(200,50,"KING COBRA");
	setcolor(RED);
	settextstyle(0, 0, 2);
	outtextxy(220,150,"1.NEW GAME");
	outtextxy(220,200,"2.CONTORALS");
	outtextxy(220,250,"3.ABOUT");
	outtextxy(220,300,"4.EXIT");
	ch=getch();
	switch(ch)
	{
	case '1':
		 cleardevice();
		 setcolor(BLUE);
		 rectangle(13,7,623,467);
		 rectangle(10,4,626,470);
		 settextstyle(0, 0, 3);
		 setcolor(15);
		 outtextxy(200,50,"LEVEL");
		 tx=100;
		 ty=125;
		 bx=300;
		 by=150;
		 y=0;
		 x=0;
		 for (i=1; i<=5; i++)
		     {
			setcolor(6);
			rectangle(tx,ty,bx,by);
			rectangle(tx+1,ty+1,bx-1,by-1);
			rectangle(tx+2,ty+2,bx-2,by-2);
			rectangle(tx+3,ty+3,bx-3,by-3);
			rectangle(tx+4,ty+4,bx-4,by-4);
			rectangle(tx+5,ty+5,bx-5,by-5);
			rectangle(tx+6,ty+6,bx-6,by-6);
			rectangle(tx+7,ty+7,bx-7,by-7);
			rectangle(tx+8,ty+8,bx-8,by-8);
			rectangle(tx+9,ty+9,bx-9,by-9);
			rectangle(tx+10,ty+10,bx-10,by-10);
			rectangle(tx+11,ty+11,bx-11,by-11);
			rectangle(tx+12,ty+12,bx-12,by-12);
			settextstyle(0, HORIZ_DIR, 2);
			sprintf(msg,"%d",i);
			setcolor(2);
			outtextxy(320+x,130+y, msg);
			y += 50;
			x += 50;
			ty=by+25;
			by=ty+25;
			bx=bx+50;
		      }
	      xx:
		 c=getch();
		 switch(c)
		 {
		   case '1':
			 del=60;
			 break;
		   case '2':
			 del=50;
			 break;
		   case '3':
			 del=40;
			 break;
		   case '4':
			 del=30;
			 break;
		   case '5':
			 del=20;
			 break;
		   default:
			 goto xx;
		 }
		 cleardevice();
		 return del;
	case '2':
		 cleardevice();
		 setcolor(BLUE);
		 rectangle(13,7,623,467);
		 rectangle(10,4,626,470);
		 settextstyle(0, 0, 3);
		 setcolor(15);
		 outtextxy(200,50,"CONTROLS");
		 settextstyle(0, HORIZ_DIR, 3);
		 setcolor(9);
		 sprintf(msg, "%c", 26);
		 outtextxy(200,150,msg);
		 settextstyle(0, HORIZ_DIR, 2);
		 outtextxy(250,150," = RIGHT");
		 settextstyle(0, HORIZ_DIR, 3);
		 sprintf(msg, "%c", 27);
		 outtextxy(200,200,msg);
		 settextstyle(0, HORIZ_DIR, 2);
		 outtextxy(250,200," = LEFT");
		 settextstyle(0, HORIZ_DIR, 3);
		 sprintf(msg, "%c", 24);
		 outtextxy(200,250,msg);
		 settextstyle(0, HORIZ_DIR, 2);
		 outtextxy(250,250," = UP");
		 settextstyle(0, HORIZ_DIR, 3);
		 sprintf(msg, "%c", 25);
		 outtextxy(200,300,msg);
		 settextstyle(0, HORIZ_DIR, 2);
		 outtextxy(250,300," = DOWN");
		 getch();
		 goto yy;
	case '3':
		 cleardevice();
		 setcolor(BLUE);
		 settextstyle(0, 0, 2);
		 rectangle(13,7,623,467);
		 rectangle(10,4,626,470);
		 setcolor(YELLOW);
		 outtextxy(100,150,"Written by :Praveen Saxena ");
		 outtextxy(220,200,"using C++");
		 outtextxy(60,250,"praveen_saxena_ind@yahoo.co.in");
		 getch();
		 goto yy;
	case '4':
		 exit(1);
	default:
		goto yy;
       }
}