当前位置:   article > 正文

基于c语言easyx库来编写贪吃蛇_c语言贪吃蛇格子

c语言贪吃蛇格子

  easyx库是c语言的一个库,掌握它可以制作很多小游戏和画各种各样的图。

  这是本人学习半年c语言所写的小游戏,希望点进来的朋友们能有所收获。

  1. #include <easyx.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <time.h>
  5. #define NODE_WIDTH 40
  6. // 节点
  7. typedef struct {
  8. int x;
  9. int y;
  10. }node;
  11. // 绘制网格
  12. // 横线(0, y), (800, y) 0 <= y <= 600
  13. // 竖线(x, 0),(x, 600) 0 <= x <= 800
  14. void paintGrid()
  15. {
  16. // 横线
  17. for (int y = 0; y < 600; y += NODE_WIDTH)
  18. {
  19. line(0, y, 800, y);
  20. }
  21. // 竖线
  22. for (int x = 0; x < 800; x += NODE_WIDTH)
  23. {
  24. line(x, 0, x, 600);
  25. }
  26. }
  27. void paintSnake(node* snake, int n)
  28. {
  29. int left, top, right, bottom;
  30. for (int i = 0; i < n; i++)
  31. {
  32. // 左上角:【网格x坐标 * 网格宽度, 网格y坐标 * 网格宽度】
  33. left = snake[i].x * NODE_WIDTH;
  34. top = snake[i].y * NODE_WIDTH;
  35. // 右下角:【(网格x坐标 + 1) * 网格宽度, (网格y坐标 + 1) * 网格宽度】
  36. right = (snake[i].x + 1) * NODE_WIDTH;
  37. bottom = (snake[i].y + 1) * NODE_WIDTH;
  38. // 通过左上角与右下角坐标绘制矩形
  39. solidrectangle(left, top, right, bottom);
  40. }
  41. }
  42. // 方向枚举
  43. enum direction
  44. {
  45. eUp,
  46. eDown,
  47. eLeft,
  48. eRight
  49. };
  50. // 蛇身体移动
  51. node snakeMove(node* snake, int length, int direction)
  52. {
  53. //for (int i = 0; i < length; i++)
  54. // printf("(%d, %d)\n", snake[i].x, snake[i].y);
  55. // 记录尾节点
  56. node tail = snake[length - 1];
  57. // 从尾结点开始,前一个节点覆盖后一个节点
  58. // 0 1 2 3 4 0 1 2 3 4
  59. // E D C B A ---> E E D C B
  60. for (int i = length - 1; i > 0; i--)
  61. {
  62. snake[i] = snake[i - 1];
  63. }
  64. // 下一个头节点
  65. node newHead;
  66. newHead = snake[0];
  67. if (direction == eUp)
  68. {
  69. newHead.y--;
  70. }
  71. else if (direction == eDown)
  72. {
  73. newHead.y++;
  74. }
  75. else if (direction == eLeft)
  76. {
  77. newHead.x--;
  78. }
  79. else // right
  80. {
  81. newHead.x++;
  82. }
  83. // 更新头节点
  84. // E D C B A ---> F E D C B
  85. snake[0] = newHead;
  86. //for (int i = 0; i < length; i++)
  87. // printf("(%d, %d)\n", snake[i].x, snake[i].y);
  88. // 返回尾节点
  89. return tail;
  90. }
  91. // 键盘输入改变direction
  92. void changeDirection(enum direction* pD)
  93. {
  94. // 检查输入缓存区中是否有数据
  95. if (_kbhit() != 0)
  96. {
  97. // _getch函数获取输入缓存区中的数据
  98. char c = _getch();
  99. // 判断输入并转向
  100. switch (c)
  101. {
  102. case 'w':
  103. // 向上移动
  104. if (*pD != eDown)
  105. *pD = eUp;
  106. break;
  107. case 's':
  108. // 向下移动
  109. if (*pD != eUp)
  110. *pD = eDown;
  111. break;
  112. case 'a':
  113. // 向左移动
  114. if (*pD != eRight)
  115. *pD = eLeft;
  116. break;
  117. case 'd':
  118. // 向右移动
  119. if (*pD != eLeft)
  120. *pD = eRight;
  121. break;
  122. }
  123. }
  124. }
  125. // 绘制食物
  126. void paintFood(node food)
  127. {
  128. int left, top, right, bottom;
  129. left = food.x * NODE_WIDTH;
  130. top = food.y * NODE_WIDTH;
  131. right = (food.x + 1) * NODE_WIDTH;
  132. bottom = (food.y + 1) * NODE_WIDTH;
  133. setfillcolor(RED);
  134. solidrectangle(left, top, right, bottom);
  135. setfillcolor(WHITE);
  136. }
  137. // 随机创建食物
  138. node createFood(node* snake, int length)
  139. {
  140. node food;
  141. while (1)
  142. {
  143. food.x = rand() % (800 / NODE_WIDTH);
  144. food.y = rand() % (600 / NODE_WIDTH);
  145. int i;
  146. for (i = 0; i < length; i++)
  147. {
  148. if (snake[i].x == food.x && snake[i].y == food.y)
  149. {
  150. break;
  151. }
  152. }
  153. if (i < length)
  154. continue;
  155. else
  156. break;
  157. }
  158. return food;
  159. }
  160. bool isGameOver(node* snake, int length)
  161. {
  162. // 是否撞墙
  163. if (snake[0].x < 0 || snake[0].x > 800 / NODE_WIDTH)
  164. return true;
  165. if (snake[0].y < 0 || snake[0].y > 600 / NODE_WIDTH)
  166. return true;
  167. // 是否吃到蛇身
  168. for (int i = 1; i < length; i++)
  169. {
  170. if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
  171. return true;
  172. }
  173. return false;
  174. }
  175. void reset(node* snake, int* pLength, enum direction* d)
  176. {
  177. snake[0] = node{ 5, 7 };
  178. snake[1] = node{ 4, 7 };
  179. snake[2] = node{ 3, 7 };
  180. snake[3] = node{ 2, 7 };
  181. snake[4] = node{ 1, 7 };
  182. *pLength = 5;
  183. *d = eRight;
  184. }
  185. int main()
  186. {
  187. initgraph(800, 600);
  188. // 设置背景色
  189. setbkcolor(RGB(204, 204, 214));
  190. // 使用背景色清空窗体
  191. cleardevice();
  192. // 蛇节点坐标
  193. node snake[100] = { {5, 7}, {4, 7}, {3, 7}, {2, 7}, {1, 7} };
  194. // 蛇节点长度
  195. int length = 5;
  196. enum direction d = eRight;
  197. // 食物
  198. srand(unsigned int(time(NULL)));
  199. node food = createFood(snake, length);
  200. while (1)
  201. {
  202. // 清空整个窗体
  203. cleardevice();
  204. // 绘制网格
  205. paintGrid();
  206. // 绘制蛇节点
  207. paintSnake(snake, length);
  208. // 绘制食物
  209. paintFood(food);
  210. // 休眠150ms
  211. Sleep(150);
  212. // 获取键盘输入并将方向存储到变量d
  213. changeDirection(&d);
  214. node lastTail = snakeMove(snake, length, d);
  215. // 新的蛇头节点是否与食物节点重合
  216. if (snake[0].x == food.x && snake[0].y == food.y)
  217. {
  218. // 限制snake节点最大长度
  219. if (length < 100)
  220. {
  221. // 已经吃到食物, 长度+1
  222. snake[length] = lastTail;
  223. length++;
  224. }
  225. // 重新生成新的食物
  226. food = createFood(snake, length);
  227. }
  228. // 游戏是否结束
  229. if (isGameOver(snake, length) == true)
  230. {
  231. // 游戏结束,复位设置,重新生成食物
  232. reset(snake, &length, &d);
  233. food = createFood(snake, length);
  234. }
  235. }
  236. getchar();
  237. closegraph();
  238. return 0;
  239. }

代码见上,自行参考,如有雷同,纯属巧合!

望大佬们纠错,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/94003
推荐阅读
  

闽ICP备14008679号