该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//源码如下
/*
贪吃蛇v1.0
for:c4droid(请在Linux平台运行)
by:千百度
date:4.29
*/
//连续转向有时会出现bug,无法转向
#include
#include
#include
#include
//地图范围
#define H 18
#define W 24
//步时
#define N 1000000/3
enum //DIRECTION键:上,下,左,右;5暂停
{
UP = '2',
DOWN = '8',
LEFT = '4',
RIGHT = '6',
PUSS = '5'
};
typedef struct
{
int y[H*W/2];
int x[H*W/2];
int len;
int *head;
}SNAKE;//蛇结构体:坐标,长度,蛇头指针
typedef struct
{
int x;
int y;
}FOOD;//食物结构体:坐标
SNAKE snake;
FOOD food;
FOOD initfood(); //食物函数,返回食物坐标
void initsnake(); //初始化蛇
void initmap(); //初始化地图
void drawmap();//绘制地图
void gameover();//游戏结束
void event();//事件函数,判断输入
int map[H][W];//地图数组
char key,direction=RIGHT;//初始化方向
int k=1,step=1;//k=1前进-1后退;step:步时加速
int t=1;//计时器变量
int main()
{
t=time(NULL);//记录当前时间
snake.x[0]=W/2;//初始化蛇位置居中
snake.y[0]=H/2;
snake.len=2;//初始化长度
snake.head=&snake.x[0];//要移动的蛇头坐标
food=initfood();//生成食物
while (1)
{
usleep(N/step);//系统休眠
initsnake();
clrscr();
drawmap();
}
return 0;
}
void initmap(void)
{
for (int i=0;i<=H;i++)//定义地图
for (int j=0;j<=W;j++)
{
if ((i==0)||(i==H)||(j==0)||(j==W))
map[i][j]=1;
else
map[i][j]=0;
}
map[food.y][food.x]=4;//定义食物
for(int i=0;i
{
if (i==0)
map[snake.y[i]][snake.x[i]]=2;//定义蛇头
else
map[snake.y[i]][snake.x[i]]=3;//定义蛇身
}
}
void initsnake()
{
event();
for(int i=1;i
{
snake.x[snake.len-i]=snake.x[snake.len-i-1];
//身体及尾巴跟上
snake.y[snake.len-i]=snake.y[snake.len-i-1];
}
*snake.head+=k;//蛇头移动
if (map[snake.y[0]][snake.x[0]]==4)
//如果蛇头碰到食物
{
snake.len++;//吃掉后蛇长度+1
snake.x[snake.len-1]=snake.x[snake.len-2];
//新增的蛇身成为尾巴
snake.y[snake.len-1]=snake.y[snake.len-2];
do
food=initfood();//刷新食物
while (map[food.y][food.x]==3);
//食物坐标不和蛇身体坐标重叠
}
if(snake.x[0]==W||snake.x[0]==0||snake.y[0]==0||snake.y[0]==H||map[snake.y[0]][snake.x[0]]==3)
//如果蛇头撞墙或者撞自己则游戏结束
gameover();
}
void event()
{
while (kbhit())//判断输入,有则循环
{
key = getch();//获取按键
switch(key)
{
case UP://上
if (direction==RIGHT||direction==LEFT)
{//如果原来方向为左右
snake.head=&snake.y[0];
//则要移动的蛇头坐标为纵坐标
k=-1;//方向为负方向
direction=key;//保存当前方向
}
else
{
if (direction==UP)
//如果原来方向为上,则步时加速
step=2;
if (direction==DOWN)
//反向,则减速
step=1;
}
break;//下同,注释略
case DOWN:
if (direction==RIGHT||direction==LEFT)
{
snake.head=&snake.y[0];
k=1;
direction=key;
}
else
{
if (direction==DOWN)
step=2;
if (direction==UP)
step=1;
}
break;
case LEFT:
if (direction==UP||direction==DOWN)
{
snake.head=&snake.x[0];
k=-1;
direction=key;
}
else
{
if (direction==LEFT)
step=2;
if (direction==RIGHT)
step=1;
}
break;
case RIGHT:
if (direction==UP||direction==DOWN)
{
snake.head=&snake.x[0];
k=1;
direction=key;
}
else
{
if (direction==RIGHT)
step=2;
if (direction==LEFT)
step=1;
}
break;
case PUSS:
printf("游戏暂停!任意键继续游戏");
getch();
break;
}
}
}
void drawmap()
{
initmap();
for (int i=0;i<=H;i++)//画地图
{
for (int j=0;j<=W;j++)
{
switch(map[i][j])
{
case 0:
printf("\33[47;37m ");
break;
case 1:
printf("\033[41;33m~~\33[40;37m");
break;
case 2:
printf("\033[43;35m🐸 \33[40;37m");
break;
case 3:
printf("\033[42;34m★ \33[40;37m");
break;
case 4:
printf("\033[47;35m💖 \33[40;37m");
break;
}
}
//画游戏数据
if (i==0)
printf("\033[46;30m 蛇头位置");
if (i==1)
printf("\033[47;35m (%d,%d)",snake.x[0],snake.y[0]);
if (i==2)
printf("\033[46;35m 食物位置");
if(i==3)
printf("\033[47;35m (%d,%d)",food.x,food.y);
if (i==4)
printf("\033[40;33m 时间:");
if (i==5)
printf("\033[40;36m %d : %d",(time(NULL)-t)/60,(time(NULL)-t)%60);
if (i==6)
printf("\033[40;33m 分数:");
if (i==7)
printf("\033[40;36m %d",snake.len-2);
if (i==8)
if (step==2)
printf("\033[40;37m加速中……");
printf("\n");
}
}
FOOD initfood()
{
FOOD food;
srand(clock());//初始化伪随机数生成器
food.y = (double)rand()/RAND_MAX*(H-1)+1;
food.x = (double)rand()/RAND_MAX*(W-1)+1;
return food;
}
void gameover()
{
printf(" 💔游戏结束:您的分数为%d,任意键继续……",snake.len-2);
getch();//等待任意键继续,再次初始化
snake.head=&snake.x[0];
if (direction==UP||direction==DOWN)
direction=LEFT;
step=k=1;
t=time(NULL);
snake.x[0]=W/2;
snake.y[0]=H/2;
snake.len=2;
}