#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#define HEIGHT 30
#define WIDTH 40
#define BLOCK_SIZE 20
int Blocks[HEIGHT][WIDTH]={0};
char moveDirection;
int food_i,food_j;
int isFailure=0;
//移动小蛇及相关处理函数
void moveSnake()
{
int i,j;
for(i=0;i<HEIGHT;i++)
for(j=0;j<WIDTH;j++)
if(Blocks[i][j]>0)
Blocks[i][j]++;
int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
int max=0;
for(i=0;i<HEIGHT;i++)
{
for(j=0;j<WIDTH;j++)
{
if(max<Blocks[i][j])
{
max=Blocks[i][j];
oldTail_i=i;
oldTail_j=j;
}
if(Blocks[i][j]==2)
{
oldHead_i=i;
oldHead_j=j;
}
}
}
int newHead_i=oldHead_i;
int newHead_j=oldHead_j;
if(moveDirection=='W')
newHead_i=oldHead_i-1;
else if(moveDirection=='S')
newHead_i=oldHead_i+1;
else if(moveDirection=='A')
newHead_j=oldHead_j-1;
else if(moveDirection=='D')
newHead_j=oldHead_j+1;
if(newHead_i>=HEIGHT||newHead_i<0||newHead_j>=WIDTH||newHead_j<0||Blocks[newHead_i][newHead_j]>0)
{
isFailure=1;
return;
}
Blocks[newHead_i][newHead_j]=1;
if(newHead_i==food_i&&newHead_j==food_j)
{
food_i=rand()%(HEIGHT-5)+2;
food_j=rand()%(WIDTH-5)+2;
}
else
Blocks[oldTail_i][oldTail_j]=0;
}
//初始化函数
void startup()
{
int i;
Blocks[HEIGHT/2][WIDTH/2]=1;
for(i=1;i<=4;i++)
Blocks[HEIGHT/2][WIDTH/2-i]=i+1;
moveDirection='D';
food_i=rand()%(HEIGHT-5)+2;
food_j=rand()%(WIDTH-5)+2;
initgraph(WIDTHBLOCK_SIZE,HEIGHTBLOCK_SIZE);
setlinecolor(RGB(200,200,200));
BeginBatchDraw();
}
//绘制函数
void show()
{
cleardevice();
int i,j;
for(i=0;i<HEIGHT;i++)
{
for(j=0;j<WIDTH;j++)
{
if(Blocks[i][j]>0)
setfillcolor(HSVtoRGB(Blocks[i][j]10,0.9,1));
else
setfillcolor(RGB(150,150,150));
fillrectangle(jBLOCK_SIZE,i*BLOCK_SIZE,(j+1)BLOCK_SIZE,(i+1)BLOCK_SIZE);
}
}
setfillcolor(RGB(0,255,0));
fillrectangle(food_iBLOCK_SIZE,food_jBLOCK_SIZE,(food_i+1)*BLOCK_SIZE,(food_j+1)*BLOCK_SIZE);
if(isFailure)
{
setbkmode(TRANSPARENT);
settextcolor(RGB(255,0,0));
settextstyle(80,0,_T("宋体"));
outtextxy(240,220,_T("游戏失败"));
}
FlushBatchDraw();
}
//与输入无关的更新函数
void updateWithoutInput()
{
if(isFailure)
return;
static int waitIndex=1;
waitIndex++;
if(waitIndex==10)//每十帧移动一格
{
moveSnake();
waitIndex=1;
}
}
//与输入有关的更新函数
void updateWithInput()
{
if(kbhit()&&isFailure==0)
{
char input=_getch();
if(input=='A'||input=='W'||input=='S'||input=='D')
{
moveDirection=input;
moveSnake();
}
}
}
int main()
{
srand(time(NULL));
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
_getch();
closegraph();
return 0;
}