#include<easyx.h>
#include<stdio.h>
#include<time.h>
#include<conio.h>
#define width 20
#define height 20
#define unit 20
enum draw
{
tou,
sheng,
shi,
clear
};
enum cmd
{
up,
left,
right,
down,
quit
};
struct block
{
char x,y;
}g_curblock,g_nextblock;
struct node
{
char x,y;
struct node *next;
};
struct node n1,n2,m1;
struct node *p,*q,*k,*t,*h;
struct node f[500];
byte g_world[width][height]={0};
int zuobiao[1000];
int wei[2];
DWORD oldtime,newtime;
bool checkblock(int x,int y);
void dispatchcmd(cmd _cmd);
void Down();
void drawblock(block _block,draw _draw);
void eat();
void g_worbian(node _node);
cmd getcmd();
void init();
void Left();
void newblock();
void newgame();
cmd qiangetcmd();
void qianQuit();
void Quit();
void Right();
void shengbian(node _node);
void Up();
void weizuo(node _node);
void gameover();
void clearqian(node _node);
void drawhou(node _node);
void kong();
void main()
{
init();
while(true)
{
if(kbhit())
{
switch(getch())
{
case 'w':
case 'W':
Up();
goto qfy;
case 'a':
case 'A':
Left();
goto qfy;
case 'd':
case 'D':
Right();
goto qfy;
case 27:
qianQuit();
}
}
}
qfy:
cmd e;
while(true)
{
e=getcmd();
dispatchcmd(e);
if(n1.x==g_nextblock.x&&n1.y==g_nextblock.y)
eat();
}
}
void init()
{
initgraph(640,480);
setbkcolor(WHITE);
cleardevice();
setorigin(120,40);
setlinecolor(LIGHTGREEN);
setfillstyle(BS_HATCHED,HS_DIAGCROSS);
setfillcolor(LIGHTGREEN);
fillrectangle(-1*unit,-1*unit,(width+1)*unit,(height+1)*unit);
setfillcolor(WHITE);
setfillstyle(BS_SOLID);
fillrectangle(-1,-1,width*unit,height*unit);
newgame();
}
void newgame()
{
ZeroMemory(g_world,width*height);
setfillcolor(WHITE);
solidrectangle(0,0,width*unit-1,height*unit-1);
n1.x=width/2;
n1.y=height/2;
n1.next=&n2;
g_world[n1.x][n1.y]=1;
n2.x=width/2;
n2.y=height/2-1;
n2.next=NULL;
g_world[n2.x][n2.y]=1;
g_curblock.x=n1.x;
g_curblock.y=n1.y;
drawblock(g_curblock,tou);
g_curblock.x=n2.x;
g_curblock.y=n2.y;
drawblock(g_curblock,sheng);
newblock();
}
void newblock()
{
srand((unsigned) time(NULL));
while(true)
{
g_nextblock.x=rand()%40;
g_nextblock.y=rand()%40;
if(checkblock(g_nextblock.x,g_nextblock.y))
{
drawblock(g_nextblock,shi);
break;
}
}
oldtime=GetTickCount();
}
cmd getcmd()
{
while(true)
{
newtime=GetTickCount();
if(kbhit())
{
switch(getch())
{
case 'w':
case 'W':
return up;
case 's':
case 'S':
return down;
case 'a':
case 'A':
return left;
case 'd':
case 'D':
return right;
case 27:
return quit;
}
}
if(newtime-oldtime>=200)
{
if(n1.x==n2.x+1) return right;
else if(n1.x==n2.x-1) return left;
else if(n1.y==n2.y+1) return up;
else if(n1.y==n2.y-1) return down;
}
}
}
void dispatchcmd(cmd _cmd)
{
switch(_cmd)
{
case up:
Up();
break;
case down:
Down();
break;
case left:
Left();
break;
case right:
Right();
break;
case quit:
Quit();
break;
}
}
void drawblock(block _block,draw _draw)
{
int left=_block.x*unit;
int top=(height-_block.y-1)*unit;
int right=(_block.x+1)*unit-1;
int buttom=(height-_block.y)*unit-1;
switch(_draw)
{
case sheng:
setfillcolor(DARKGRAY);
solidrectangle(left+1,top+1,right-1,buttom-1);
break;
case clear:
setfillcolor(WHITE);
solidrectangle(left,top,right,buttom);
break;
case shi:
setfillcolor(LIGHTRED);
solidrectangle(left+1,top+1,right-1,buttom-1);
break;
case tou:
if(n1.x==n2.x+1)
{
setfillcolor(BLACK);
solidrectangle(left+1,top+1,right-1,buttom-1);
setfillcolor(WHITE);
solidrectangle(right-1-8,top+1+3,right-1-5,top+1+6);
solidrectangle(right-1-8,buttom-1-3,right-1-5,buttom-1-6);
}
else if(n1.y==n2.y+1)
{
setfillcolor(BLACK);
solidrectangle(left+1,top+1,right-1,buttom-1);
setfillcolor(WHITE);
solidrectangle(left+1+3,top+1+5,left+1+6,top+1+8);
solidrectangle(right-1-3,top+1+5,right-1-6,top+1+8);
}
else if(n1.x==n2.x-1)
{
setfillcolor(BLACK);
solidrectangle(left+1,top+1,right-1,buttom-1);
setfillcolor(WHITE);
solidrectangle(left+1+5,top+1+3,left+1+8,top+1+6);
solidrectangle(left+1+5,buttom-1-3,left+1+8,buttom-1-6);
}
else if(n1.y==n2.y-1)
{
setfillcolor(BLACK);
solidrectangle(left+1,top+1,right-1,buttom-1);
setfillcolor(WHITE);
solidrectangle(left+1+3,buttom-1-5,left+1+6,buttom-1-8);
solidrectangle(right-1-3,buttom-1-5,right-1-6,buttom-1-8);
}
break;
}
}
bool checkblock(int x,int y)
{
if(x<0||x>=width||y<0||y>=height)
return false;
else if(g_world[x][y]==1)
return false;
else return true;
}
void qianQuit()
{
HWND wnd=GetHWnd();
if(MessageBox(wnd,"您要退出游戏吗?","退出游戏",MB_YESNO|MB_ICONQUESTION)==IDYES)
Quit();
}
void Quit()
{
closegraph();
exit(0);
}
void Up()
{
if(checkblock(n1.x,n1.y+1))
{
clearqian(n1);
weizuo(n1);
shengbian(n1);
n1.y++;
g_worbian(n1);
drawhou(n1);
}
else if(n1.y+1==n2.y) return;
else gameover();
oldtime=GetTickCount();
}
void Down()
{
if(checkblock(n1.x,n1.y-1))
{
clearqian(n1);
weizuo(n1);
shengbian(n1);
n1.y--;
g_worbian(n1);
drawhou(n1);
}
else if(n1.y-1==n2.y) return;
else gameover();
oldtime=GetTickCount();
}
void Left()
{
if(checkblock(n1.x-1,n1.y))
{
clearqian(n1);
weizuo(n1);
shengbian(n1);
n1.x--;
g_worbian(n1);
drawhou(n1);
}
else if(n1.x-1==n2.x) return;
else gameover();
oldtime=GetTickCount();
}
void Right()
{
if(checkblock(n1.x+1,n1.y))
{
clearqian(n1);
weizuo(n1);
shengbian(n1);
n1.x++;
g_worbian(n1);
drawhou(n1);
}
else if(n1.x+1==n2.x) return;
else gameover();
oldtime=GetTickCount();
}
cmd qiangetcmd()
{
if(kbhit())
{
switch(getch())
{
case 'w':
case 'W':
return up;
case 'a':
case 'A':
return left;
case 's':
case 'S':
return down;
case 'd':
case 'D':
return right;
case 27:
return quit;
}
}
}
void shengbian(node _node)
{
ZeroMemory(zuobiao,1000);
int i=0;
p=&_node;
while(p->next!=NULL)
{
zuobiao[i++]=p->x;
zuobiao[i++]=p->y;
p=p->next;
}
i=0;
p=_node.next;
while(p->next!=NULL)
{
p->x=zuobiao[i++];
p->y=zuobiao[i++];
p=p->next;
}
p->x=zuobiao[i++];
p->y=zuobiao[i];
}
void g_worbian(node _node)
{
ZeroMemory(g_world,width*height);
p=&_node;
while(p->next!=NULL)
{
g_world[p->x][p->y]=1;
p=p->next;
}
g_world[p->x][p->y]=1;
}
void xiaowei(node _node)
{
p=&_node;
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,clear);
drawblock(g_curblock,sheng);
p=p->next;
while(p->next!=NULL)
{
p=p->next;
}
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,clear);
}
void toubian(node _node)
{
p=&_node;
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,clear);
drawblock(g_curblock,sheng);
}
void weizuo(node _node)
{
k=&_node;
while(k->next!=NULL)
{
k=k->next;
}
wei[0]=k->x;
wei[1]=k->y;
}
int w=0;
void eat()
{
drawblock(g_nextblock,clear);
printf("\a");
f[w].x=wei[0];
f[w].y=wei[1];
f[w].next=NULL;
t=&n1;
while(t->next!=NULL)
{
t=t->next;
}
t->next=&f[w++];
ZeroMemory(g_world,width*height);
t=&n1;
while(t->next!=NULL)
{
g_world[t->x][t->y]=1;
t=t->next;
}
g_world[t->x][t->y]=1;
t=&n1;
g_curblock.x=t->x;
g_curblock.y=t->y;
drawblock(g_curblock,tou);
t=t->next;
while(t->next!=NULL)
{
g_curblock.x=t->x;
g_curblock.y=t->y;
drawblock(g_curblock,sheng);
t=t->next;
}
g_curblock.x=t->x;
g_curblock.y=t->y;
drawblock(g_curblock,sheng);
newblock();
}
void gameover()
{
HWND wnd=GetHWnd();
if(MessageBox(wnd,"游戏结束,还要来一局吗?","游戏结束",MB_YESNO|MB_ICONQUESTION)==IDYES)
kong();
else Quit();
}
void clearqian(node _node)
{
p=&_node;
while(p->next!=NULL)
{
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,clear);
p=p->next;
}
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,clear);
}
void drawhou(node _node)
{
p=&_node;
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,tou);
p=p->next;
while(p->next!=NULL)
{
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,sheng);
p=p->next;
}
g_curblock.x=p->x;
g_curblock.y=p->y;
drawblock(g_curblock,sheng);
}
void kong()
{
newgame();
while(true)
{
if(kbhit())
{
switch(getch())
{
case 'w':
case 'W':
Up();
goto qfy;
case 'a':
case 'A':
Left();
goto qfy;
case 'd':
case 'D':
Right();
goto qfy;
case 27:
qianQuit();
}
}
}
qfy:
cmd e;
while(true)
{
e=getcmd();
dispatchcmd(e);
if(n1.x==g_nextblock.x&&n1.y==g_nextblock.y)
eat();
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复