这是我以前写的贪吃蛇游戏,会有三个版本,从简陋到还算可以吧。是我分别花了三个晚上的时间逐步完善的。
第一个版本要试玩的话记得全屏。
这一个版本很简陋,就是刷屏,然后不停输出。
想法我都写在注释里了。
/*
我们先要生成一条蛇,那就用一个类来存,这个类应该包括蛇头,
蛇的身子的各个点的坐标,蛇的移动方向,那现在的问题是要在蛇
尾处增加一段如何处理,(现在想到用一个大的数组储存蛇身就行)
除了蛇就是随机生成肉,只要按照位置显示到屏幕上就行。
动态的东西就是如果蛇碰到了肉,就长度加一,碰到墙就游戏结束,
再来四个键控制移动方向就行。
*/
/*
所需要的还是显示,时间,随机数生成,即如何受到键盘传过来的信息
*/
/*
显示现在可以用清屏函数加上printf直接完成
用GetTickCount返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数
用srand(time(NULL))和rand()获取随机数
用kbhit()和getch()检测键盘闯过来的数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
int map[20][167]; //用于显示
int hx[80],hy[80]; //记录蛇身
int x,y; //肉的位置
int die;
int length;
void setfood()
{
x=rand()%20;
y=rand()%167;
map[x][y]=2;
}
void init()
{
int i,j,k;
length=3;
memset(map,0,sizeof(map));
for(i=0;i<length;i++)
{
hx[i]=0;
hy[i]=i+2;
map[0][i+2]=1;
}
setfood();
}
void move(char key)
{
int i,j,k;
int lx=hx[length-1],ly=hy[length-1];
if(key=='a')
{
hx[length-1]=hx[length-1];
hy[length-1]=hy[length-1]-1;
if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
{die=1;return;}
else
map[hx[length-1]][hy[length-1]]=1;
}
else if(key=='d')
{
hx[length-1]=hx[length-1];
hy[length-1]=hy[length-1]+1;
if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
{die=1;return;}
else
map[hx[length-1]][hy[length-1]]=1;
}
else if(key=='w')
{
hx[length-1]=hx[length-1]-1;
hy[length-1]=hy[length-1];
if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
{die=1;return;}
else
map[hx[length-1]][hy[length-1]]=1;
}
else if(key=='s')
{
hx[length-1]=hx[length-1]+1;
hy[length-1]=hy[length-1];
if((map[hx[length-1]][hy[length-1]]==1)||(hx[length-1]==-1||hy[length-1]==-1||hx[length-1]==20||hy[length-1]==167))
{die=1;return;}
else
map[hx[length-1]][hy[length-1]]=1;
}
if(hx[length-1]==x&&hy[length-1]==y)
{
hx[length]=x;
hy[length]=y;
hx[length-1]=lx;
hy[length-1]=ly;
map[x][y]=1;
length++;
setfood();
}
else
{
map[hx[0]][hy[0]]=0;
for(i=0;i<length-2;i++)
{
hx[i]=hx[i+1];
hy[i]=hy[i+1];
}
hx[length-2]=lx;
hy[length-2]=ly;
}
}
void show()
{
int i,j;
system( "cls" );
for(i=0;i<=20;i++)
for(j=0;j<=167;j++)
{
if(map[i][j]==0)
printf(" ");
if(map[i][j]==1)
printf("*");
if(map[i][j]==2)
printf("$");
}
}
char judge(char key,char lastkey)
{
if(key=='a'&&lastkey=='d')
return lastkey;
else if(key=='d'&&lastkey=='a')
return lastkey;
else if(key=='w'&&lastkey=='s')
return lastkey;
else if(key=='s'&&lastkey=='w')
return lastkey;
else
return key;
}
int main()
{
int time=GetTickCount();
int lasttime=time;
srand( (unsigned int)GetTickCount() );
char key='d';
char lastkey=key;
init();
die=0;
while(1)
{
if(kbhit())
{
key=getch();
if(key=='a'||key=='s'||key=='d'||key=='w')
{
key=judge(key,lastkey);
lastkey=key;
move(key);
show();
if(die)
{
printf("YOU lose\n");
break;
}
}
}
else
{
if(GetTickCount()-lasttime<500)
Sleep(1);
lasttime=GetTickCount();
move(lastkey);
show();
if(die)
{
printf("You lose\n");
break;
}
}
}
return 0;
}