#include "stdio.h"
#include "stdio.h"
#include "windows.h"
#include "time.h"
#include "setjmp.h"
#define MAXNOD 500
#define UP 1
#define DOWN -1
#define LEFT -2
#define RIGHT 2
#define YES 1
#define NO 0
jmp_buf retry;
typedef struct{
int x;
int y;
int status;
}Food;
typedef struct {
int *px;
int *py;
int direction;
int nodlen;
int score;
}Snack;
int gotoxy(int x, int y)
{
COORD cd;
cd.X = x;
cd.Y = y;
return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd); }
void initialization(Snack *pss)
{
system("color 0e");
pss->px=(int *)malloc(MAXNOD*sizeof(int));
pss->py=(int *)malloc(MAXNOD*sizeof(int));
memset(pss->px,0,MAXNOD);
memset(pss->py,0,MAXNOD);
pss->px[0]=0;pss->py[0]=0;
pss->px[1]=1;pss->py[1]=0;
pss->direction=RIGHT;
pss->nodlen=2;
pss->score=0;
}
void getscoresys(Snack scr)
{
gotoxy(68,7);
cprintf("score: %d",scr.score);
}
int ctrltoi(char ctr)
{
switch(ctr)
{
case 'w':
return UP;
case 's':
return DOWN;
case 'a':
return LEFT;
case 'd':
return RIGHT ;
}
}
void boundary()
{
int cnt,y;
gotoxy(15,3);
for (cnt=0;cnt<45;cnt++)
{
cprintf("%c",4);
}
for (y=4;y<20;y++)
{
gotoxy(15,y);
cprintf("%c",219);
gotoxy(59,y);
cprintf("%c",219);
}
gotoxy(15,20);
for (cnt=0;cnt<45;cnt++)
{
cprintf("%c",4);
}
gotoxy(68,9);
cprintf("UP: W");
gotoxy(68,10);
cprintf("DOWN: S");
gotoxy(68,11);
cprintf("LEFT: A");
gotoxy(68,12);
cprintf("RIGHT: D");
gotoxy(68,14);
cprintf("PAUSE: BLANK");
gotoxy(68,15);
cprintf("EXIT :ESC");
}
int isdead(Snack ts)
{
int i;
char select;
for(i=0;i<ts.nodlen-1;i++)
if
((ts.px[i]==ts.px[ts.nodlen-1]&&ts.py[i]==ts.py[ts.nodlen-1])||((ts.px[ts.nodlen-1]<0))||(ts.px[ts.nodl en-1]>42)||(ts.py[ts.nodlen-1]<0)||(ts.py[ts.nodlen-1]>15))
{
system("cls");
gotoxy(15,12);
cprintf("Game Over! Press ESC to exit, any other key to retry\a\n");
flushall();
select=getch();
if(select==27) exit(0);
system("cls");
longjmp(retry,1);
}
}
void getfood(Snack s,Food *pf)
{
int i;
cnt: do
{
pf->x=rand()%43;
pf->y=rand()%16;
for (i=0;i<s.nodlen;i++)
{
if (s.px[i]==pf->x&&s.py[i]==pf->y)
{
goto cnt;
}
}
break;
}while(1);
pf->status=YES;
}
int main()
{
Snack ss;
Food foo;
int i,j,dire;
char ctrl;
srand((unsigned)time(NULL));
setjmp(retry);
initialization(&ss);
getfood(ss,&foo);
do
{
gotoxy(foo.x+16,foo.y+4);
if (foo.status==NO)
getfood(ss,&foo);
cprintf("%c",3);
boundary();
if(_kbhit())
{
ctrl=getch();
if (ctrl=='w'||ctrl=='s'||ctrl=='a'||ctrl=='d')
{
dire=ctrltoi(ctrl);
if(ss.direction==(0-dire)) ;
else
ss.direction=dire;
}
else if (ctrl==' ')
system("pause");
else if (ctrl==27)
exit(0);
}
for (i=0;i<ss.nodlen-1;i++)
{
ss.px[i]=ss.px[i+1];
ss.py[i]=ss.py[i+1];
}
switch(ss.direction)
{
case UP:
ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]-1;
break;
case DOWN:
ss.py[ss.nodlen-1]=ss.py[ss.nodlen-1]+1;
break;
case LEFT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]-1;
break;
case RIGHT:
ss.px[ss.nodlen-1]=ss.px[ss.nodlen-1]+1;
}
for(i=0;i<ss.nodlen;i++)
{
gotoxy(ss.px[i]+16,ss.py[i]+4);
cprintf("%c",4);
}
isdead(ss);
if (ss.px[ss.nodlen-1]==foo.x&&ss.py[ss.nodlen-1]==foo.y) {
for (j=0;j<ss.nodlen;j++)
{
ss.px[ss.nodlen-j]=ss.px[ss.nodlen-j-1];
ss.py[ss.nodlen-j]=ss.py[ss.nodlen-j-1];
}
ss.score +=10;
ss.nodlen++;
foo.status=NO;
}
getscoresys(ss);
_sleep(199);
system("cls");
flushall();
}while(1);
}。