经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言实现贪吃蛇游戏演示
来源:jb51  时间:2021/10/8 17:42:56  对本文有异议

本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

IDE用的是 VS2019

先看效果

 

代码全览

game.h

  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6. #include <time.h>
  7.  
  8. #define PLATFORM 1 //运行的系统 1为win 0为linux
  9. #define MAPWIDTH 15 //地图宽度,包括墙
  10. #define MAPHEIGHT 15 //地图高度,包括墙
  11. #define SNAKELENGTH (MAPHEIGHT - 2) * (MAPWIDTH - 2)
  12. //结构体声明
  13. struct Body
  14. {
  15. int isExist;
  16. int x;
  17. int y;
  18. };
  19. struct Food {
  20. int x;
  21. int y;
  22. };
  23. void game();
  24. void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight);
  25. void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food);
  26. void clearScreen();
  27. void inputProcess(char* pinput);
  28. void initSnake(struct Body snake[SNAKELENGTH], int length);
  29. void generateFood(struct Food* food, struct Body snake[]);
  30. int isWall(int x, int y);
  31. int isSnake(int x, int y, struct Body snake[], int lengh);
  32. void control(char input, struct Body snake[]);
  33. void generateFood(struct Food* food, struct Body snake[]);
  34. int isFood(int x, int y, struct Food* food);
  35. int isEat(struct Body snake[], struct Food* pfood);
  36. void bodyMove(struct Body snake[], int* bodyLength);
  37. int isInBody(struct Body snake[], int lengh);

GameStart.c

  1. #include "game.h"
  2. void displayMenu() {
  3. printf("########################\n");
  4. printf("###### 贪吃蛇游戏 #######\n");
  5. printf("########################\n");
  6. printf("------------------------\n");
  7. printf(" 1.开始游戏 \n");
  8. printf(" 0.退出游戏 \n");
  9. printf("------------------------\n");
  10. printf("请输入选项:>");
  11. char ch;
  12. scanf("%c", &ch);
  13. getchar();
  14. switch (ch)
  15. {
  16. case '1': {
  17. game();
  18. break;
  19. }
  20. case '0': {
  21. exit(0);
  22. break;
  23. }
  24. default:
  25. printf("输入错误,请重新输入:>");
  26. break;
  27. }
  28. }
  29. int main(void) {
  30. while (1) {
  31. clearScreen();
  32. displayMenu();
  33. clearScreen();
  34. }
  35. return 0;
  36. }

game.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3.  
  4. //游戏逻辑
  5. void game() {
  6. //分数
  7. int score = 0;
  8. //游戏状态 0为胜利 1为咬到蛇身 2为撞到墙上
  9. int gameState = 0;
  10. //输入状态
  11. char input = 0;
  12. //墙
  13. char wall[MAPHEIGHT][MAPWIDTH];
  14. //创建蛇结构体数组
  15. struct Body snake[SNAKELENGTH];
  16. //创建食物结构体
  17. struct Food food = { 5,5 };
  18. //初始化蛇
  19. initSnake(snake, SNAKELENGTH);
  20. //初始化墙
  21. initWall(wall, MAPWIDTH, MAPHEIGHT);
  22. //生成食物
  23. generateFood(&food, snake);
  24.  
  25. while (1)
  26. {
  27. //清屏
  28. clearScreen();
  29. control(input, snake);
  30. //显示地图
  31. displayMap(MAPWIDTH, MAPHEIGHT, snake, SNAKELENGTH, food);
  32. printf("得分:%d\n", score);
  33. //printf("food:%d %d\n", food.x, food.y);
  34. //printf("snake:%d %d", snake[0].x, snake[0].y);
  35. //处理输入
  36. inputProcess(&input);
  37.  
  38. //撞到蛇身,游戏失败
  39. if (isInBody(snake, SNAKELENGTH)) {
  40. gameState = 1;
  41. break;
  42. }
  43. //撞到墙上,游戏失败
  44. if (isWall(snake[0].x, snake[0].y)) {
  45. gameState = 2;
  46. break;
  47. }
  48. //吃到食物加分,蛇身加一
  49. if (isEat(snake, &food)) {
  50. score++;
  51. snake[score].isExist = 1;
  52. snake[score].x = snake[score - 1].x;
  53. snake[score].y = snake[score - 1].y;
  54. if (score == SNAKELENGTH - 1) {
  55. //游戏胜利
  56. gameState = 0;
  57. break;
  58. }
  59. generateFood(&food, snake);
  60. }
  61. //蛇身移动
  62. bodyMove(snake, &score);
  63. }
  64. //胜负显示
  65. switch (gameState)
  66. {
  67. case 1: {
  68. printf("咬到蛇身,游戏结束!\n");
  69. break;
  70. }
  71. case 2: {
  72. printf("撞到墙上,游戏结束!\n");
  73. break;
  74. }
  75. case 0: {
  76. printf("游戏胜利!\n");
  77. break;
  78. }
  79. default:
  80. break;
  81. }
  82. printf("按回车键退出");
  83. getchar();
  84. }
  85.  
  86. //清除屏幕
  87. void clearScreen() {
  88. if (PLATFORM) {
  89. system("cls");
  90. }
  91. else {
  92. system("clear");
  93. }
  94. printf("\033c");
  95. }
  96. //输入处理
  97. void inputProcess(char* pinput) {
  98. int t = (int)time(NULL);
  99. while (1) {
  100. if (_kbhit()) {
  101. switch (getch())
  102. {
  103. case 'w': {
  104. if (*pinput != 's') {
  105. *pinput = 'w';
  106. }
  107. break;
  108. }
  109. case 's':
  110. {
  111. if (*pinput != 'w') {
  112. *pinput = 's';
  113. }
  114. break;
  115. }
  116. case 'a': {
  117. if (*pinput != 'd') {
  118. *pinput = 'a';
  119. }
  120. break;
  121. }
  122. case 'd': {
  123. if (*pinput != 'a') {
  124. *pinput = 'd';
  125. }
  126. break;
  127. }
  128. /* case ' ': {
  129. *pinput = ' ';
  130. break;
  131. }*/
  132. default:
  133. break;
  134. }
  135. }
  136. if ((int)time(NULL) - t == 1) {
  137. //printf("%c\n", *pinput);
  138. //一秒一帧
  139. break;
  140. }
  141. /*if (*pinput == ' ') {
  142. continue;
  143. }*/
  144. }
  145. }
  146. //初始化墙
  147. //'#'墙
  148. //' '空
  149. void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight) {
  150. for (int i = 0; i < mapHeight; i++) {
  151. for (int j = 0; j < mapWidth; j++) {
  152. if (i == 0 || i == mapHeight - 1) {
  153. wall[i][j] = '#';
  154. }
  155. else if (j == 0 || j == MAPWIDTH - 1) {
  156. wall[i][j] = '#';
  157. }
  158. else {
  159. wall[i][j] = ' ';
  160. }
  161. }
  162. }
  163. }
  164. //初始化蛇状态,位置
  165. void initSnake(struct Body snake[SNAKELENGTH], int length) {
  166. for (int i = 0; i < length; i++) {
  167. if (i == 0)
  168. {
  169. snake[i].x = MAPWIDTH / 2;
  170. snake[i].y = MAPHEIGHT / 2;//蛇出生位置,即蛇头初始位置
  171. snake[i].isExist = 1;
  172. }
  173. else {
  174. snake[i].isExist = 0;
  175. snake[i].x = 0;
  176. snake[i].y = 0;
  177. }
  178. }
  179. }
  180. //生成食物
  181. void generateFood(struct Food* food, struct Body snake[]) {
  182. int x;
  183. int y;
  184. srand((unsigned int)time(NULL));
  185. do {
  186. x = (rand() % MAPHEIGHT) + 1;
  187. y = (rand() % MAPWIDTH) + 1;
  188. } while (isSnake(x, y, snake, SNAKELENGTH) || isWall(x, y));
  189. (*food).y = y;
  190. (*food).x = x;
  191. }
  192. //判断是否是墙
  193. int isWall(int x, int y) {
  194. if (y <= 1 || y >= MAPHEIGHT || x <= 1 || x >= MAPWIDTH) {
  195. return 1;
  196. }
  197. return 0;
  198. }
  199. //判断是否是蛇
  200. int isSnake(int x, int y, struct Body snake[], int lengh) {
  201. for (int i = 0; i < lengh; i++) {
  202. if (snake[i].isExist == 1 && snake[i].x == x && snake[i].y == y) {
  203. return 1;
  204. }
  205. }
  206. return 0;
  207. }
  208. //判断是否撞到蛇身
  209. int isInBody(struct Body snake[], int lengh) {
  210. for (int i = 1; i < lengh; i++) {
  211. if (snake[i].isExist == 1 && snake[i].x == snake[0].x && snake[i].y == snake[0].y) {
  212. return 1;
  213. }
  214. }
  215. return 0;
  216. }
  217. //判断是否是食物
  218. int isFood(int x, int y, struct Food* food) {
  219. if ((*food).x == x && (*food).y == y) {
  220. return 1;
  221. }
  222. return 0;
  223. }
  224. //显示游戏地图
  225. void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food) {
  226. int x;
  227. int y;
  228. for (int i = 0; i < mapHeight; i++) {
  229. y = i + 1;
  230. for (int j = 0; j < mapWidth; j++) {
  231. x = j + 1;
  232. if (isWall(x, y)) {
  233. printf("# ");
  234. }
  235. else if (isSnake(x, y, snake, snakelength)) {
  236. if (snake[0].x == x && snake[0].y == y) {
  237. printf("@ ");//蛇头
  238. }
  239. else {
  240. printf("* ");//蛇身
  241. }
  242. }
  243. else if (isFood(x, y, &food)) {
  244. printf("+ ");
  245. }
  246. else {
  247. printf(" ");
  248. }
  249. }
  250. printf("\n");
  251. }
  252. }
  253. //方向控制
  254. void control(char input, struct Body snake[]) {
  255. switch (input) {
  256. case 'w': {
  257. snake[0].y -= 1;
  258. break;
  259. }
  260. case 'a': {
  261. snake[0].x -= 1;
  262. break;
  263. }
  264. case 's': {
  265. snake[0].y += 1;
  266. break;
  267. }
  268. case 'd': {
  269. snake[0].x += 1;
  270. break;
  271. }
  272. }
  273. }
  274. //判断是否吃到食物
  275. int isEat(struct Body snake[], struct Food* pfood) {
  276. if (isFood(snake[0].x, snake[0].y, pfood)) {
  277. return 1;
  278. }
  279. return 0;
  280. }
  281. //移动蛇身
  282. void bodyMove(struct Body snake[], int* bodyLength) {
  283. if (*bodyLength) {
  284. for (int i = *bodyLength; i >= 1; i--) {
  285. snake[i].x = snake[i - 1].x;
  286. snake[i].y = snake[i - 1].y;
  287. }
  288. }
  289. }

相关思路有空再写。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号