12下一页
返回列表 发新帖

小白的搬砖之路------C语言实现简单的贪吃蛇

[复制链接]

65

主题

772

帖子

3213

积分

大学生

Rank: 5Rank: 5

金币
323
好评
73
贡献
2

MT论坛最佳新人MT论坛帅哥考神MT论坛侠客MT论坛活跃会员

QQ
发表于 2019-7-31 07:16:32 来自手机  | 显示全部楼层 | 阅读模式
        开头空两格,讲究。
        就在昨天,我突然开始想学习C++了。于是我就跑到各大论坛里荡來荡去。突然我发现了一位大佬发的帖子。于是我就开始了我的不归路..........
首先标明源码来源地址------百度贴吧里面的一个c4droid吧。吧里的一个ID名为  一叶成林   的大佬。

好了给大家看看代码运行好的效果图。

然后就给大家分享一下源代码。这是c语言的不是C++的。
  1. /*
  2. 游戏实现:
  3.         先将界面画出来,并初始化蛇和食物
  4.         每个坐标都有类型,里面是食物、蛇体、或墙体还是背景
  5.         在蛇体的坐标内有蛇头的方向,这样蛇尾才能根据蛇头的方向移动
  6.   蛇移动是把蛇头前方的坐标改成蛇头,删掉蛇尾,将蛇尾前面的坐标改成蛇尾
  7. */

  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <conio.h>
  11. #include <time.h>

  12. #define MAXH 15
  13. #define MAXW MAXH  //有bug!长宽必须一样!
  14. #define UP '2'  //定义输入2 蛇就向上移动
  15. #define DOWN '8' //输入8 向下
  16. #define LEFT '4' //输入4 向左
  17. #define RIGHT '6' //输入6 向右
  18. #define SNAKELEN 3 //蛇初始长度
  19. #define N 3 //难度

  20. struct {
  21.         char type;
  22.         char * ch;
  23. }
  24. charwall = {1, "□"},  //墙体
  25. charbg = {2, "■"}, //背景
  26. charfood = {3, "●"}, //食物
  27. charsnake = {4, "★"}; //蛇体

  28. struct xy {
  29.         int x;
  30.         int y;
  31. }headxy, tailxy;  //记录蛇头和蛇尾的坐标

  32. char atlasmap [MAXH] [MAXW]; //地图所有的坐标
  33. char direction [MAXH] [MAXW]; //里面存放蛇尾转弯方向
  34. int score; //分数

  35. int main (void); //声明主函数,死了要调用
  36. void drawmap (void);  //创建地图
  37. void createfood (void);  //随机坐标生成食物
  38. void createsnake (void); //创建蛇
  39. void loading (void); //伪加载
  40. void init (void);  //初始化
  41. void die (void); //死亡
  42. void move (char key);  //蛇移动
  43. char nextkey (char key, char inpkey); //判断输入的方向是否符合要求

  44. void drawmap (void)  //创建地图
  45. {
  46.         int x, y;
  47.         for (y = 0; y < MAXH; y++)
  48.         {
  49.                 for (x = 0; x < MAXW; x++)
  50.                 {
  51.                         if (x == 0 || y == 0 || x == MAXW - 1 || y == MAXH - 1)  //周围一圈是墙体
  52.                         {
  53.                                 printf ("%s", charwall.ch);
  54.                                 atlasmap [y][x] = charwall.type;
  55.                         }
  56.                         else //创建背景
  57.                         {
  58.                                 atlasmap [y][x] = charbg.type;
  59.                                 printf ("%s", charbg.ch);
  60.                         }

  61.                 }
  62.                 printf ("\n");
  63.         }

  64. }

  65. void createfood (void)  //随机坐标生成食物
  66. {
  67.         int x, y;
  68.         srand (time(0));
  69.         do
  70.         {
  71.                 x = rand () % (MAXW - 2) + 1;
  72.                 y = rand () % (MAXH - 2) + 1;
  73.         }while (atlasmap[x][y] != charbg.type); //如果该坐标内不是背景,则重新生成
  74.         gotoxy (x+1, y+1);
  75.         printf ("%s" , charfood.ch);
  76.         atlasmap [x][y] = charfood.type; //将该坐标存放为食物类型
  77. }

  78. void createsnake (void) //创建蛇
  79. {
  80.         int x_centre, y_centre;
  81.         int len;
  82.         x_centre = MAXW / 2 + SNAKELEN / 2;
  83.         y_centre = MAXH / 2;

  84.         for (len = 1; len <= SNAKELEN; len++)
  85.         {
  86.                 gotoxy (x_centre - len + 1, y_centre + 1);
  87.                 printf ("%s", charsnake.ch);
  88.                 //判断蛇头和蛇尾
  89.                 if (len == 1)        //蛇头坐标
  90.                 {
  91.                         headxy.x = x_centre;
  92.                         headxy.y = y_centre + 1;
  93.                 }
  94.                 else if (len == SNAKELEN) //蛇尾坐标
  95.                 {
  96.                         tailxy.x = x_centre - len + 1;
  97.                         tailxy.y = y_centre + 1;
  98.                 }
  99.                 atlasmap[x_centre - len][y_centre] = charsnake.type; //坐标类型改成蛇体
  100.                 direction [x_centre - len][y_centre] = RIGHT; //初始方向设置为RIGHT

  101.         }
  102. }

  103. void loading (void) //伪加载
  104. {
  105.         int i;
  106.         for (i = 1; i <= 100; i++)
  107.         {

  108.                 printf ("游戏正在加载中……%d%%\n", i);
  109.                 (i < 50)? usleep(30000): usleep (60000);
  110.                 clrscr();
  111.         }
  112.         sleep (1);
  113.         printf ("游戏加载成功!正在进入....\n");
  114.         sleep (3);
  115.         clrscr ();
  116. }

  117. void init (void)
  118. {
  119.         loading (); //伪加载
  120.         drawmap(); //绘制地图
  121.         createsnake (); //初始化贪吃蛇
  122.         createfood();//创建食物

  123.         gotoxy (0, MAXH + 3);
  124.         printf ("分数:%d\n",score = 0);
  125.         puts ("BY:一叶成林\n贴吧:C4droid");
  126.         gotoxy (0, MAXH + 1); //将坐标移动到图外进行输入
  127. }

  128. void die (void)
  129. {
  130.         sleep (1);
  131.         clrscr ();
  132.         printf ("游戏结束!得分:%d\n任意键继续\n", score);
  133.         getch ();
  134.         clrscr ();
  135.         main (); //应该不是很合理……,就这么粗暴的解决吧!
  136. }

  137. void move (char key)  //蛇移动
  138. {
  139.         extern struct xy headxy, tailxy; //再次声明
  140.         direction[headxy.x - 1][headxy.y - 1] = key; //先将蛇头要去的方向放在该坐标内,蛇尾到这里就能判断去哪
  141.         switch (key)
  142.         {
  143.                 case RIGHT :
  144.                                  ++headxy.x;
  145.                                  break;
  146.                 case UP :
  147.                                  --headxy.y;
  148.                                  break;
  149.                 case LEFT :
  150.                            --headxy.x;
  151.                                  break;
  152.                 case DOWN :
  153.                                  ++headxy.y;
  154.                                  break;
  155.         }

  156.         if (atlasmap[headxy.x - 1][headxy.y - 1] == charwall.type
  157.                 || atlasmap[headxy.x - 1][headxy.y - 1] == charsnake.type)//判断是否撞墙或咬自己
  158.         {
  159.                 die ();
  160.         }

  161.         gotoxy (headxy.x, headxy.y);
  162.         printf ("%s", charsnake.ch);
  163.         //判断是否吃到食物,如果吃到了蛇尾不动,并把该坐标的类型转换成蛇体
  164.         if (atlasmap[headxy.x - 1][headxy.y - 1] == charfood.type)
  165.         {
  166.                 createfood ();
  167.                 score++; //分数加1
  168.                 gotoxy (0, MAXH + 3);
  169.                 printf ("分数:%d",score);
  170.                 atlasmap[headxy.x - 1][headxy.y - 1] = charsnake.type;
  171.         }
  172.         else //如果没吃到则蛇尾跟上,这里可用goto语句
  173.         {
  174.                 atlasmap[headxy.x - 1][headxy.y - 1] = charsnake.type; //蛇头前移
  175.                 gotoxy (tailxy.x, tailxy.y);  //坐标到蛇尾
  176.                 atlasmap[tailxy.x-1][tailxy.y - 1] = charbg.type; //将蛇尾改成背景,这样就算前进了
  177.                 printf ("%s", charbg.ch);
  178.                 switch (direction[tailxy.x-1][tailxy.y - 1]) //判断蛇头经过这里的时候拐弯了没有
  179.                 {
  180.                         case RIGHT:
  181.                                                  direction[tailxy.x-1][tailxy.y - 1] = 0; //将该坐标内的方向清空
  182.                                           ++tailxy.x; //进行相应的方向
  183.                                           break;
  184.                         case UP :
  185.                                           direction[tailxy.x-1][tailxy.y - 1] = 0;
  186.                                           --tailxy.y;
  187.                                           break;
  188.                         case LEFT :
  189.                                           direction[tailxy.x-1][tailxy.y - 1] = 0;
  190.                                           --tailxy.x;
  191.                                           break;
  192.                         case DOWN :
  193.                                           direction[tailxy.x-1][tailxy.y - 1] = 0;
  194.                                           ++tailxy.y;
  195.                                           break;
  196.                 }
  197.         }


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

  200. char nextkey (char key, char inpkey) //判断输入的方向是否符合要求
  201. {
  202.         char next;
  203.         if (inpkey == ' ') //如果是空格则暂停游戏
  204.         {
  205.                 inpkey = getch();
  206.         }
  207.         //判断用户的方向是否相反,如果相反或输入非法则采用上次合法方向
  208.         if ((inpkey == UP && key != DOWN) || (inpkey == DOWN && key != UP)
  209.                  || (inpkey == LEFT && key != RIGHT) || (inpkey == RIGHT && key != LEFT))
  210.                 next = inpkey;
  211.         else
  212.                 next = key;

  213.         return next;
  214. }

  215. int main (void)
  216. {
  217.         init (); //初始化游戏
  218.         char key = RIGHT, inpkey; //定义方向,默认向右
  219.         while (1) //无限循环、、、
  220.         {
  221.                 if (kbhit()) //判断输入流中是否有数据
  222.                 {
  223.                         inpkey = getch(); //将输入流中的数据保存下来
  224.                         key = nextkey (key, inpkey);  //返回合法方向
  225.                 }
  226.                 move(key);  //蛇移动
  227.                 putchar ('\n'); //更新数据,输出缓冲区
  228.                 usleep (1000000 / N); //移动速度
  229.         }

  230.         return 0;
  231. }


复制代码


好了,我继续去浪了。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

65

主题

772

帖子

3213

积分

大学生

Rank: 5Rank: 5

金币
323
好评
73
贡献
2

MT论坛最佳新人MT论坛帅哥考神MT论坛侠客MT论坛活跃会员

QQ
发表于 2019-7-31 10:19:27 来自手机  | 显示全部楼层
其实你自己可以改改代码,我就美化了一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1

主题

914

帖子

3120

积分

大学生

Rank: 5Rank: 5

金币
1079
好评
17
贡献
0
发表于 2019-7-31 07:22:40 来自手机  | 显示全部楼层
抢个沙发 感谢分享
回复

使用道具 举报

63

主题

2348

帖子

1万

积分

博士生

我爱学习

Rank: 7Rank: 7Rank: 7

金币
2595
好评
46
贡献
1

考神MT论坛帅哥MT论坛最佳新人MT论坛活跃会员

发表于 2019-7-31 07:27:09 来自手机  | 显示全部楼层
椅子是我的
回复

使用道具 举报

30

主题

1676

帖子

4856

积分

大学生

学渣

Rank: 5Rank: 5

金币
961
好评
7
贡献
0

MT论坛最佳新人考神MT论坛活跃会员

发表于 2019-7-31 07:56:42 来自手机  | 显示全部楼层
这个可以有
回复

使用道具 举报

29

主题

5402

帖子

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4011
好评
38
贡献
0

考神

发表于 2019-7-31 08:18:59 来自手机  | 显示全部楼层
学习一下
回复

使用道具 举报

278

主题

1万

帖子

3万

积分

版主

一个水怪

Rank: 7Rank: 7Rank: 7

金币
9498
好评
148
贡献
2

MT论坛灌水老大MT论坛最佳新人2019-5.1节快乐考神MT论坛侠客MT论坛活跃会员

发表于 2019-7-31 11:22:45 来自手机  | 显示全部楼层
迷茫
回复

使用道具 举报

3

主题

193

帖子

595

积分

初中生

Rank: 3Rank: 3

金币
6
好评
0
贡献
3
发表于 2019-7-31 12:13:48 来自手机  | 显示全部楼层
学习一下
回复

使用道具 举报

213

主题

4674

帖子

1万

积分

博士生

大水怪在此![#滑稽]

Rank: 7Rank: 7Rank: 7

金币
2498
好评
66
贡献
1

MT论坛活跃会员MT论坛侠客MT论坛美女懒考神

QQ
发表于 2019-7-31 13:09:47 来自手机  | 显示全部楼层
路过看看
回复

使用道具 举报

0

主题

48

帖子

127

积分

小学生

Rank: 2

金币
76
好评
0
贡献
0
发表于 2019-8-2 20:16:41 来自手机  | 显示全部楼层
c语言和c++有点搞不清
回复

使用道具 举报

20

主题

1202

帖子

3868

积分

大学生

红皇

Rank: 5Rank: 5

金币
1249
好评
17
贡献
0

MT论坛帅哥2019-5.1节快乐MT论坛最佳新人考神

发表于 2019-8-2 22:15:06 来自手机  | 显示全部楼层
表示我什么也看不懂。
回复

使用道具 举报

32

主题

583

帖子

2351

积分

大学生

Rank: 5Rank: 5

金币
378
好评
3
贡献
1
发表于 2019-10-29 15:00:35 来自手机  | 显示全部楼层
会写代码的大佬
回复

使用道具 举报

3

主题

164

帖子

484

积分

初中生

Rank: 3Rank: 3

金币
221
好评
0
贡献
0
QQ
发表于 2019-10-29 23:15:32 来自手机  | 显示全部楼层
好玩噢哈哈哈
回复

使用道具 举报

1

主题

255

帖子

571

积分

初中生

Rank: 3Rank: 3

金币
78
好评
0
贡献
1
发表于 2019-10-29 23:49:46 来自手机  | 显示全部楼层
不会太难
回复

使用道具 举报

2

主题

23

帖子

111

积分

小学生

Rank: 2

金币
27
好评
0
贡献
0
QQ
发表于 2019-11-4 15:21:59 | 显示全部楼层
这个有点骚
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表