c4droid语言贪吃蛇代码,【源码】纯C4版贪吃蛇

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

程序的特点是不重画界面,只移动坐标,而且只能在C4中运行。。。。。

下载地址:http://pan.baidu.com/s/1eQOWwAQ

源码如下:

/*

游戏实现:

先将界面画出来,并初始化蛇和食物

每个坐标都有类型,里面是食物、蛇体、或墙体还是背景

在蛇体的坐标内有蛇头的方向,这样蛇尾才能根据蛇头的方向移动

蛇移动是把蛇头前方的坐标改成蛇头,删掉蛇尾,将蛇尾前面的坐标改成蛇尾

*/

#include

#include

#include

#include

#define MAXH 15

#define MAXW MAXH //有bug!长宽必须一样!

#define UP '2'

#define DOWN '8'

#define LEFT '4'

#define RIGHT '6'

#define SNAKELEN 3 //蛇初始长度

#define N 3 //难度

struct {

char type;

char * ch;

}

charwall = {1, "□"}, //墙体

charbg = {2, "■"}, //背景

charfood = {3, "●"}, //食物

charsnake = {4, "★"}; //蛇体

struct xy {

int x;

int y;

}headxy, tailxy; //记录蛇头和蛇尾的坐标

char atlasmap [MAXH] [MAXW]; //地图所有的坐标

char direction [MAXH] [MAXW]; //里面存放蛇尾转弯方向

int score; //分数

int main (void); //声明主函数,死了要调用

void drawmap (void); //创建地图

void createfood (void); //随机坐标生成食物

void createsnake (void); //创建蛇

void loading (void); //伪加载

void init (void); //初始化

void die (void); //死亡

void move (char key); //蛇移动

char nextkey (char key, char inpkey); //判断输入的方向是否符合要求

void drawmap (void) //创建地图

{

int x, y;

for (y = 0; y < MAXH; y++)

{

for (x = 0; x < MAXW; x++)

{

if (x == 0 || y == 0 || x == MAXW - 1 || y == MAXH - 1) //周围一圈是墙体

{

printf ("%s", charwall.ch);

atlasmap [y][x] = charwall.type;

}

else //创建背景

{

atlasmap [y][x] = charbg.type;

printf ("%s", charbg.ch);

}

}

printf ("\n");

}

}

void createfood (void) //随机坐标生成食物

{

int x, y;

srand (time(0));

do

{

x = rand () % (MAXW - 2) + 1;

y = rand () % (MAXH - 2) + 1;

}while (atlasmap[x][y] != charbg.type); //如果该坐标内不是背景,则重新生成

gotoxy (x+1, y+1);

printf ("%s" , charfood.ch);

atlasmap [x][y] = charfood.type; //将该坐标存放为食物类型

}

void createsnake (void) //创建蛇

{

int x_centre, y_centre;

int len;

x_centre = MAXW / 2 + SNAKELEN / 2;

y_centre = MAXH / 2;

for (len = 1; len <= SNAKELEN; len++)

{

gotoxy (x_centre - len + 1, y_centre + 1);

printf ("%s", charsnake.ch);

//判断蛇头和蛇尾

if (len == 1)//蛇头坐标

{

headxy.x = x_centre;

headxy.y = y_centre + 1;

}

else if (len == SNAKELEN) //蛇尾坐标

{

tailxy.x = x_centre - len + 1;

tailxy.y = y_centre + 1;

}

atlasmap[x_centre - len][y_centre] = charsnake.type; //坐标类型改成蛇体

direction [x_centre - len][y_centre] = RIGHT; //初始方向设置为RIGHT

}

}

void loading (void) //伪加载

{

int i;

for (i = 1; i <= 100; i++)

{

printf ("游戏正在加载中……%d%%\n", i);

(i < 50)? usleep(30000): usleep (60000);

clrscr();

}

sleep (1);

printf ("游戏加载成功!正在进入....\n");

sleep (3);

clrscr ();

}

void init (void)

{

loading (); //伪加载

drawmap(); //绘制地图

createsnake (); //初始化贪吃蛇

createfood();//创建食物

gotoxy (0, MAXH + 3);

printf ("分数:%d\n",score = 0);

puts ("BY:一叶成林\n贴吧:C4droid");

gotoxy (0, MAXH + 1); //将坐标移动到图外进行输入

}

void die (void)

{

sleep (1);

clrscr ();

printf ("游戏结束!得分:%d\n任意键继续\n", score);

getch ();

clrscr ();

main (); //应该不是很合理……,就这么粗暴的解决吧!

}

void move (char key) //蛇移动

{

extern struct xy headxy, tailxy; //再次声明

direction[headxy.x - 1][headxy.y - 1] = key; //先将蛇头要去的方向放在该坐标内,蛇尾到这里就能判断去哪

switch (key)

{

case RIGHT :

++headxy.x;

break;

case UP :

--headxy.y;

break;

case LEFT :

--headxy.x;

break;

case DOWN :

++headxy.y;

break;

}

if (atlasmap[headxy.x - 1][headxy.y - 1] == charwall.type

|| atlasmap[headxy.x - 1][headxy.y - 1] == charsnake.type)//判断是否撞墙或咬自己

{

die ();

}

gotoxy (headxy.x, headxy.y);

printf ("%s", charsnake.ch);

//判断是否吃到食物,如果吃到了蛇尾不动,并把该坐标的类型转换成蛇体

if (atlasmap[headxy.x - 1][headxy.y - 1] == charfood.type)

{

createfood ();

score++; //分数加1

gotoxy (0, MAXH + 3);

printf ("分数:%d",score);

atlasmap[headxy.x - 1][headxy.y - 1] = charsnake.type;

}

else //如果没吃到则蛇尾跟上,这里可用goto语句

{

atlasmap[headxy.x - 1][headxy.y - 1] = charsnake.type; //蛇头前移

gotoxy (tailxy.x, tailxy.y); //坐标到蛇尾

atlasmap[tailxy.x-1][tailxy.y - 1] = charbg.type; //将蛇尾改成背景,这样就算前进了

printf ("%s", charbg.ch);

switch (direction[tailxy.x-1][tailxy.y - 1]) //判断蛇头经过这里的时候拐弯了没有

{

case RIGHT:

direction[tailxy.x-1][tailxy.y - 1] = 0; //将该坐标内的方向清空

++tailxy.x; //进行相应的方向

break;

case UP :

direction[tailxy.x-1][tailxy.y - 1] = 0;

--tailxy.y;

break;

case LEFT :

direction[tailxy.x-1][tailxy.y - 1] = 0;

--tailxy.x;

break;

case DOWN :

direction[tailxy.x-1][tailxy.y - 1] = 0;

++tailxy.y;

break;

}

}

gotoxy (0, MAXH+1);//到地图外进行方向输入

}

char nextkey (char key, char inpkey) //判断输入的方向是否符合要求

{

char next;

if (inpkey == ' ') //如果是空格则暂停游戏

{

inpkey = getch();

}

//判断用户的方向是否相反,如果相反或输入非法则采用上次合法方向

if ((inpkey == UP && key != DOWN) || (inpkey == DOWN && key != UP)

|| (inpkey == LEFT && key != RIGHT) || (inpkey == RIGHT && key != LEFT))

next = inpkey;

else

next = key;

return next;

}

int main (void)

{

init (); //初始化游戏

char key = RIGHT, inpkey; //定义方向,默认向右

while (1) //无限循环、、、

{

if (kbhit()) //判断输入流中是否有数据

{

inpkey = getch(); //将输入流中的数据保存下来

key = nextkey (key, inpkey); //返回合法方向

}

move(key); //蛇移动

putchar ('\n'); //更新数据,输出缓冲区

usleep (1000000 / N); //移动速度

}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值