c语言贪吃蛇运行测试,[源码]又一款经典的贪吃蛇,C语言源码。还在测试阶段有bug...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

//源码如下

/*

贪吃蛇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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值