C语言设计之贪吃蛇

feizai000 2018-07-17

C语言设计之贪吃蛇

没错这就是我们今天的内容

前言

智慧与美貌并重,英雄与侠义的化身的小编上线了,没错我就是传说中的讲课通俗而不庸俗,说话风流而不下流的小编。百年修得阁下回眸于本文。今天的主题是带着大家吃顿蛇肉,没错C语言设计之贪吃蛇。

C语言设计之贪吃蛇

实话小编看到有点小恶心,请跳过

程序设计流程

C语言设计之贪吃蛇

整个项目只需要三步呦

  • 数据设计

C语言设计之贪吃蛇

代码不多呦

  1. 辅助宏定义:游戏地图的宽和高,以及蛇的最大长度
  2. 食物结构体:食物在地图上x和y上的显示
  3. 蛇结构体:蛇的长度,蛇的每一节的坐标存储,蛇的移动速度
  4. 辅助全局变量:蛇是否变化,蛇的初始移动方向

  • 模块化设计

C语言设计之贪吃蛇

  1. 地图设计:void drawMap(); //绘制游戏地图
  2. 按键处理:void keyDown(); //按键处理
  3. 食物设计:void createFood(); //产生食物
  4. 辅助函数:void gotoxy(int x, int y);//cmd移动辅助函数
  5. 终止游戏:int snakeStaus(); //蛇状态

  • 具体实现

1.辅助函数:void gotoxy(int x, int y);//cmd移动辅助函数

C语言设计之贪吃蛇

这个函数以前淘汰了,需要自己实现呢

2.地图设计:void drawMap(); //绘制游戏地图

C语言设计之贪吃蛇

自己放大看把

3.按键处理:void keyDown(); //按键处理

C语言设计之贪吃蛇

4.食物设计:void createFood(); //产生食物

C语言设计之贪吃蛇

注释自己看哈

5.终止游戏:int snakeStaus(); //蛇状态

C语言设计之贪吃蛇

完整代码,C/C++学习乐园群文件下载:747821062

6.主函数

C语言设计之贪吃蛇

完整代码:更多精彩,关注C/C++学习乐园群:747821062


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <conio.h>
  5. #include <windows.h>
  6. //⊙ ■
  7. ///////////////////////////////////////
  8. //地图的长和宽
  9. #define MAPHEIGHT 25
  10. #define MAPWIDTH 60
  11. #define SNAKESIZE 50
  12. ///////////////////////////////////////
  13. //数据设计
  14. int changeFlag = 0;//蛇变化标记
  15. int key = 'w';
  16. struct food
  17. {
  18. //食物的位置
  19. int x;
  20. int y;
  21. }food;
  22. struct snake
  23. {
  24. int x[SNAKESIZE]; //蛇坐标
  25. int y[SNAKESIZE];
  26. int len;//当前长度
  27. int speed;//移动速度
  28. }mysnake;//mysnake[0] 蛇头
  29. /////////////////////////////////////////
  30. //模块化设计
  31. void drawMap();//绘制游戏地图
  32. void createFood();//产生食物
  33. void keyDown();//按键处理
  34. int snakeStaus();//蛇状态
  35. void gotoxy(int x, int y);//cmd移动辅助函数
  36. int main()
  37. {
  38. drawMap();
  39. while (1)
  40. {
  41. createFood();
  42. Sleep(mysnake.speed);
  43. keyDown();
  44. if (!snakeStaus())
  45. {
  46. break;
  47. }
  48. }
  49. printf("GameOver");
  50. system("pause");
  51. return 0;
  52. }
  53. //////////////////////////////////////
  54. //cmd移动辅助函数
  55. void gotoxy(int x, int y)
  56. {
  57. //获取cmd窗口句柄
  58. HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
  59. //光标坐标
  60. COORD coord;
  61. //设置窗口坐标
  62. coord.X = x;
  63. coord.Y = y;
  64. SetConsoleCursorPosition(handle, coord);
  65. }
  66. ////////////////////////////////////////
  67. // 绘制游戏地图
  68. void drawMap()
  69. {
  70. srand((unsigned int)time(NULL));
  71. //食物
  72. //1.食物属性
  73. food.x = rand() % (MAPWIDTH - 4/*食物图标占用2个字符*/) + 2;
  74. food.y = rand() % (MAPHEIGHT - 2) + 1;
  75. //2.画食物
  76. gotoxy(food.x, food.y);
  77. printf("⊙");
  78. //蛇
  79. //1.蛇属性
  80. mysnake.x[0] = MAPWIDTH / 2;//定位在中间
  81. mysnake.y[0] = MAPHEIGHT / 2;
  82. //2.画蛇
  83. gotoxy(mysnake.x[0], mysnake.y[0]);
  84. printf("■");
  85. mysnake.len = 3;
  86. mysnake.speed = 100;
  87. for (int k = 1; k<mysnake.len; k++)
  88. {
  89. mysnake.x[k] = mysnake.x[k - 1] +2;
  90. mysnake.y[k] = mysnake.y[k - 1];
  91. gotoxy(mysnake.x[k], mysnake.y[k]);
  92. printf("■");
  93. }
  94. //边框
  95. //1.左右
  96. for (int i = 0; i <= MAPHEIGHT; i++)
  97. {
  98. gotoxy(0, i);
  99. printf("■");
  100. gotoxy(MAPWIDTH, i);
  101. printf("■");
  102. }
  103. //2.上下
  104. for (int i = 0; i <= MAPWIDTH; i+=2)
  105. {
  106. gotoxy(i, 0);
  107. printf("■");
  108. gotoxy(i, MAPHEIGHT);
  109. printf("■");
  110. }
  111. }
  112. ////////////////////////////////////////
  113. // 产生食物
  114. void createFood()//产生食物
  115. {
  116. //产生条件:食物被吃
  117. if (mysnake.x[0] == food.x&&mysnake.y[0] == food.y)
  118. {
  119. //完整版本:食物不能是在蛇身
  120. srand((unsigned int)time(NULL));
  121. //x必须为偶数
  122. while (1)
  123. {
  124. int flag = 1;
  125. food.x = rand() % (MAPWIDTH - 4) + 2;
  126. food.y = rand() % (MAPHEIGHT - 2) + 1;
  127. for (int k = 0; k < mysnake.len; k++)
  128. {
  129. if (mysnake.x[k] == food.x&&mysnake.y[k] == food.y)
  130. {
  131. flag = 0;
  132. break;
  133. }
  134. }
  135. //食物坐标要为偶数并且不能再蛇身上
  136. if (flag&&food.x % 2 == 0)
  137. {
  138. break;
  139. }
  140. }
  141. gotoxy(food.x, food.y);
  142. printf("⊙");
  143. mysnake.len++;
  144. changeFlag=1;
  145. }
  146. }
  147. ////////////////////////////////////////
  148. // 按键处理
  149. void keyDown()
  150. {
  151. //无按键处理蛇要移动
  152. if (_kbhit())
  153. {
  154. fflush(stdin);
  155. key = _getch();
  156. }
  157. //没变化
  158. if (!changeFlag)
  159. {
  160. gotoxy(mysnake.x[mysnake.len - 1], mysnake.y[mysnake.len - 1]);
  161. printf(" ");
  162. }
  163. //后面的节数处理:往前移动
  164. for (int i = mysnake.len - 1; i > 0; i--)
  165. {
  166. mysnake.x[i] = mysnake.x[i - 1];
  167. mysnake.y[i] = mysnake.y[i - 1];
  168. }
  169. //有按键处理
  170. switch (key)
  171. {
  172. case 'w':
  173. case 'W':
  174. case 72:
  175. mysnake.y[0]--;
  176. break;
  177. case 's':
  178. case 'S':
  179. case 80:
  180. mysnake.y[0]++;
  181. break;
  182. case 'a':
  183. case 'A':
  184. case 75:
  185. mysnake.x[0]-=2;
  186. break;
  187. case 'd':
  188. case 'D':
  189. case 77:
  190. mysnake.x[0] += 2;
  191. break;
  192. }
  193. gotoxy(mysnake.x[0], mysnake.y[0]);
  194. printf("■");
  195. changeFlag = 0;
  196. gotoxy(MAPHEIGHT+2, 0);
  197. }
  198. int snakeStaus()//蛇状态
  199. {
  200. if (mysnake.x[0] == 0 || mysnake.x[0] == MAPHEIGHT - 2 || mysnake.y[0] == MAPWIDTH - 2 || mysnake.y[0] == 0)
  201. return 0;
  202. for (int k = 1; k<mysnake.len; k++)
  203. if (mysnake.x[k] == mysnake.x[0] && mysnake.y[k] == mysnake.y[0])
  204. return 0;
  205. return 1;
  206. }

相关推荐