Wednesday 2 March 2011

SNAKE GAME

Code :
# include <stdio.h>
# include <conio.h>
# include <graphics.h>
# include <alloc.h>
# include <dos.h>
# include <stdlib.h>
# define up 72
# define down 80
# define left 75
# define right 77
# define pause 25
# define space 57
# define settings 31
struct body
{
 int x,y;
 struct body *next;
};
typedef struct body body;
void create_snake(body*);
void show_settings();
void draw_borders();
void draw_egg();
void draw_snake();
void status_bar();
void draw_head();
void erase_tail();
void disp_gameover();
int getkey();
int check_snake(int,int);
body *head,*tail;
int dir=1;
int speed=100;
int leftx,rightx,topx,bottomx;
int color = RED,fil_style=1,bor_color=BLACK,size = 10;
int score=0,egg_drawn=0,jump = 9;
int preveggx,preveggy;
void far *egg;
char scr[15];
int eggx,eggy;
void main()
{
 int gm=DETECT,gd;
 int key=0,num;
 struct time tim;
 void move_snake_right();
 void move_snake_down();
 void move_snake_left();
 void move_snake_up();
 initgraph(&gm,&gm,"g:\tc\bgi");
 leftx=(size*2-1);
 rightx=getmaxx()-(size*2);
 topx=(size*2-1);
 bottomx = getmaxy()-40;
 setcolor(YELLOW);
 setfillstyle(SOLID_FILL,YELLOW);
 fillellipse(10,10,size/3,size/2);
 egg = farmalloc(imagesize(10-size/2,10-size/2,10+size/2,10+size/2));
 if(egg ==NULL)
 {
  printf("Insufficient Memory!");
  exit(0);
 }
 getimage(10-size/2,10-size/2,10+size/2,10+size/2,egg);
 draw_borders();
 create_snake(head);
 start:
 fflush(stdin);
 flushall();
 while(!kbhit())
 {
 delay(speed);
 if(egg_drawn==0)
 {
  status_bar();
  eggx=eggy=0;
  repeat:
  gettime(&tim);
  num = (int)(tim.ti_hund)*(int)(tim.ti_sec);
  num = num%(rightx-leftx)/size;
  eggx=num;
  num = (int)(tim.ti_hund)*(int)tim.ti_sec;
  num = num%(bottomx-topx)/size;
  eggy=num;
   if(check_snake(eggx,eggy))
   goto repeat;
  eggx =leftx+(eggx*size);
  eggy =topx+(eggy*size);
  preveggx =leftx+(eggx*size);
  preveggy =topx+(eggy*size);
 }
 draw_egg(eggx,eggy);
  switch(dir)
  {
   case 1:move_snake_right();
 break;
   case 2:move_snake_down();
 break;
   case 3:move_snake_left();
 break;
   case 4:move_snake_up();
  }
 }
 key = getkey();
 switch(key)
 {
  case up:if(dir!=2)
 dir = 4;
 break;
  case down:if(dir!=4)
  dir = 2;
  break;
  case right:if(dir!=3)
    dir = 1;
    break;
  case left:if(dir!=1)
   dir = 3;
   break;
  case pause:getch();
   break;
  case settings:show_settings();
setfillstyle(EMPTY_FILL,color);
bar(leftx,topx,rightx,bottomx);
draw_snake();
break;
  case 1:closegraph();
exit(0);
 }
 goto start;
}
int getkey()
{
 union REGS i,o;
 i.h.ah = 0;
 int86(0x16,&i,&o);
 return o.h.ah;
}
void draw_borders()
{
  setfillstyle(SOLID_FILL,BLUE);
  floodfill(300,300,1);
  setfillstyle(SOLID_FILL,BLACK);
  setcolor(BLACK);
  rectangle(leftx,topx,rightx,bottomx);
  setfillstyle(SOLID_FILL,BLACK);
  floodfill(300,300,BLACK);
  rectangle(leftx,bottomx+5,rightx,getmaxy()-5);
}
void create_snake()
{
 body *x;
 setfillstyle(fil_style,color);
 setcolor(bor_color);
 if((x = malloc(sizeof(body)))==NULL)
 {
  printf("Short of memory!");
  return;
 }
 x->x = size*3+leftx;
 x->y = topx;
 head = x;
 bar(x->x,x->y,x->x+size,x->y+size);
 rectangle(x->x,x->y,x->x+size,x->y+size);
 if((x->next = malloc(sizeof(body)))==NULL)
 {
  printf("Short of memory!");
  return;
 }
 x = x->next;
 x->x = size*2+leftx;
 x->y = topx;
 bar(x->x,x->y,x->x+size,x->y+size);
 rectangle(x->x,x->y,x->x+size,x->y+size);
 if((x->next = malloc(sizeof(body)))==NULL)
 {
  printf("Short of memory!");
  return;
 }
 x = x->next;
 x->x = size+leftx;
 x->y = topx;
 bar(x->x,x->y,x->x+size,x->y+size);
 rectangle(x->x,x->y,x->x+size,x->y+size);
 if((x->next = malloc(sizeof(body)))==NULL)
 {
  printf("Short of memory!");
  return;
 }
 x = x->next;
 x->x = leftx;
 x->y = topx;
 bar(x->x,x->y,x->x+size,x->y+size);
 rectangle(x->x,x->y,x->x+size,x->y+size);
 x->next = NULL;
 tail = x;
}
void move_snake_right()
{
 body *x;
 int nextx,nexty;
 nexty = head->y;
 if(head->x+size>=rightx)
  nextx = leftx;
 else
  nextx = head->x+size;
 if(check_snake(nextx,nexty)==1)
  {
   disp_gameover();
  }
 if(nextx == eggx&&nexty == eggy)
 {
  egg_drawn=0;
  score+=jump;
  x = malloc(sizeof(body));
  if(x==NULL)
  {
   printf("Insufficient Memory!");
   exit(0);
  }
  x->x = nextx;
  x->y = nexty;
  x->next = head;
  head = x;
  draw_head();
 }
 else
  {
   erase_tail();
   x = head;
   while((x->next)->next !=NULL)
   x = x->next;
   x->next = NULL;
   tail->x = nextx;
   tail->y = nexty;
   tail->next = head;
   head = tail;
   tail = x;
   draw_head();
  }
}
void move_snake_left()
{
 body *x;
 int nextx,nexty;
 if(head->x-size<leftx)
  nextx = rightx-size;
 else
  nextx = head->x-size;
 nexty = head->y;
 if(check_snake(nextx,nexty)==1)
  {
   disp_gameover();
  }
 if(nextx==eggx&&nexty==eggy)
 {
  egg_drawn=0;
  score+=jump;
  x = malloc(sizeof(body));
  if(x==NULL)
  {
   printf("Insufficient Memory!");
   exit(0);
  }
  x->x = nextx;
  x->y = nexty;
  x->next = head;
  head = x;
  draw_head();
 }
 else
  {
   erase_tail();
   x = head;
   while((x->next)->next !=NULL)
   x = x->next;
   x->next = NULL;
   tail->x = nextx;
   tail->y = nexty;
   tail->next = head;
   head = tail;
   tail = x;
   draw_head();
  }

}
void move_snake_up()
{
 body *x;
 int nextx,nexty;
 if(head->y-size<topx)
  nexty = bottomx-size;
 else
  nexty = head->y-size;
 nextx = head->x;
 if(check_snake(nextx,nexty)==1)
  {
   disp_gameover();
  }
 if(nextx==eggx&&nexty==eggy)
 {
  egg_drawn=0;
  score+=jump;
  x = malloc(sizeof(body));
  if(x==NULL)
  {
   printf("Insufficient Memory!");
   exit(0);
  }
  x->x = nextx;
  x->y = nexty;
  x->next = head;
  head = x;
  draw_head();
 }
 else
  {
   erase_tail();
   x = head;
   while((x->next)->next !=NULL)
   x = x->next;
   x->next = NULL;
   tail->x = nextx;
   tail->y = nexty;
   tail->next = head;
   head = tail;
   tail = x;
   draw_head();
  }
}
void move_snake_down()
{
 body *x;
 int nextx,nexty;
 if(head->y+size>=bottomx)
  nexty = topx;
 else
  nexty = head->y+size;
 nextx = head->x;
 if(check_snake(nextx,nexty)==1)
  {
   disp_gameover();
  }
 if(nextx==eggx&&nexty==eggy)
 {
  egg_drawn=0;
  score+=jump;
  x = malloc(sizeof(body));
  if(x==NULL)
  {
   printf("Insufficient Memory!");
   exit(0);
  }
  x->x = nextx;
  x->y = nexty;
  x->next = head;
  head = x;
  draw_head();
 }
 else
  {
   erase_tail();
   x = head;
   while((x->next)->next !=NULL)
   x = x->next;
   x->next = NULL;
   tail->x = nextx;
   tail->y = nexty;
   tail->next = head;
   head = tail;
   tail = x;
   draw_head();
  }

}
void draw_egg(int x,int y)
{
 putimage(x,y,egg,COPY_PUT);
 egg_drawn = 1;
}

void status_bar()
{
  setfillstyle(SOLID_FILL,LIGHTGRAY);
  bar(leftx+1,bottomx+4,rightx-1,getmaxy()-6);
  sprintf(scr,"Score:%d",score);
  setcolor(RED);
  settextstyle(2,0,6);
  outtextxy(leftx+5,bottomx+10,scr);
  outtextxy(rightx-75,bottomx+10,"S");
  setcolor(DARKGRAY);
  outtextxy(rightx-66,bottomx+10,"ettings");
  setcolor(RED);
  outtextxy(rightx-150,bottomx+10,"P");
  setcolor(DARKGRAY);
  outtextxy(rightx-142,bottomx+10,"ause");
}
void draw_head()
{
 setfillstyle(fil_style,color);
 bar(head->x,head->y,head->x+size,head->y+size);
 setcolor(bor_color);
 rectangle(head->x,head->y,head->x+size,head->y+size);
}
void erase_tail()
{
 setfillstyle(EMPTY_FILL,color);
 bar(tail->x,tail->y,tail->x+size,tail->y+size);
}
int check_snake(int x,int y)
{
 body *z;
 z = head;
 while(z->next!=NULL)
 {
  if(z->x==x&&z->y==y)
   return 1;
  z=z->next;
 }
  if(z->x==x&&z->y==y)
   return 1;
  return 0;
}
void disp_gameover()
{
 int x1,x2,y1,y2;
 x1 = getmaxx()/2-100;
 y1 = getmaxy()/2-65;
 x2 = getmaxx()/2+100;
 y2 = getmaxy()/2+65;
 setfillstyle(SOLID_FILL,9);
 bar(x1,y1,x2-30,y2-75);
 setcolor(YELLOW);
 settextstyle(3,0,3);
 outtextxy(x1+10,y1+10,"GAME OVER!!");
 getch();
 closegraph();
 exit(0);
}
void show_settings()
{
 int key=0,maxspeed=25,least = 145;
 int x1,y1,x2,y2,width;
 int no,i;
 setfillstyle(SOLID_FILL,LIGHTGRAY);
 x1 = (getmaxx()+1)/2-150;
 x2 = (getmaxx()+1)/2+150;
 y1 = (getmaxy()+1)/2-150;
 y2 = (getmaxy()+1)/2+150;
 setcolor(BLUE);
 bar3d(x1,y1,x2,y2,20,1);
 settextstyle(2,0,6);
 setcolor(RED);
 outtextxy(x1+20,y1+100,"Speed:");
 outtextxy(x1+85,y1+95,"-");
 outtextxy(x2-10,y1+95,"+");
 outtextxy(x1+20,y1+150," Use the left and right");
 outtextxy(x1+20,y1+180,"arrow keys to increase and ");
 outtextxy(x1+20,y1+210,"  decrease the speed ");
 outtextxy(x1+20,y1+240,"Press escape to return");
 outtextxy(x1+20,y1+270,"    to the game");
 setcolor(BLUE);
 line(x1+100,y1+120,x2-20,y1+120);
 line(x1+100,y1+120,x1+100,y1+90);
 line(x2-20,y1+120,x2-20,y1+90);
 width = ((x2-20)-(x1+100))/8;
 start:
 setfillstyle(SOLID_FILL,LIGHTGRAY);
 for(i=1;i<=no;i++)
 {
  bar(x1+100+1,y1+90+1,x1+100+(i*width)-1,y1+120-1);
  setcolor(LIGHTGRAY);
  rectangle(x1+100+1,y1+90+1,x1+100+(i*width)-1,y1+120-1);
 }
 no = (speed-25)/15;
 setfillstyle(SOLID_FILL,BLUE);
 for(i=1;i<=no;i++)
 {
  bar(x1+100+1,y1+90+1,x1+100+(i*width)-1,y1+120-1);
  setcolor(LIGHTGRAY);
  rectangle(x1+100+1,y1+90+1,x1+100+(i*width)-1,y1+120-1);
 }
 def:
 key = getkey();
 switch(key)
 {
  case right:if(speed<least)
    speed+=15;
    goto start;
  case left:if(speed>maxspeed)
   speed-=25;
    goto start;
  case 1:return;
  default:goto def;
 }
}
void draw_snake()
{
 body *x;
 x = head;
 setfillstyle(SOLID_FILL,color);
 setcolor(bor_color);
 while(x->next!=NULL)
 {
  bar(x->x,x->y,x->x+size,x->y+size);
  rectangle(x->x,x->y,x->x+size,x->y+size);
  x = x->next;
 }
}

No comments: