当前位置:   article > 正文

简单的C语言贪吃蛇_贪吃蛇代码c语言简单

贪吃蛇代码c语言简单

一、源代码

snake.h

  1. #ifndef __SNAKE_H__
  2. #define __SNAKE_H__
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <time.h>
  8. #include <conio.h>
  9. #include <Windows.h>
  10. #define WIDE 60 // 宽度
  11. #define HIGH 20 // 高度
  12. // 一个身体的对象
  13. struct BODY {
  14. int X;
  15. int Y;
  16. };
  17. // 定义蛇对象
  18. struct SNAKE {
  19. struct BODY body[WIDE*HIGH];
  20. int size;
  21. }snake; // 一个蛇对象
  22. // 定义食物对象
  23. struct FOOD {
  24. int X;
  25. int Y;
  26. }food; // 一个食物对象
  27. int score = 0; // 分数
  28. int kx = 0; // 用户按下 asdw 任意一个按键所得到的 坐标值。
  29. int ky = 0;
  30. int lastX = 0; // 蛇尾的坐标。
  31. int lastY = 0;
  32. int sleepSecond = 400;
  33. // 声明函数
  34. void initSnake(void);
  35. void initFood(void);
  36. void initUI(void);
  37. void playGame(void);
  38. void initWall(void);
  39. void showScore(void);
  40. #endif

main.c

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "snake.h" // 引入自定义头文件
  3. int main(void)
  4. {
  5. // 去除光标。
  6. CONSOLE_CURSOR_INFO cci; /*CONSOLE_CURSOR_INFO 是一个结
  7. 构体类型,它定义在 wincon.h 头
  8. 文件中,用来描述控制台窗口光标的
  9. 信息。
  10. dwSize:表示光标的大小,取值范围为 1100
  11. bVisible:表示光标是否可见,如果为 TRUE,则光标可见;
  12. 如果为 FALSE,则光标不可见。
  13. */
  14. cci.dwSize = sizeof(cci);
  15. cci.bVisible = FALSE; // TRUE :
  16. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); 设置控制台窗口光标大小和可见性
  17. srand(time(NULL)); // 播种随机数种子。
  18. initSnake(); // 初始化蛇
  19. initFood(); // 初始化食物
  20. initWall(); // 画墙
  21. initUI(); // 画蛇和食物
  22. playGame(); // 启动游戏
  23. showScore(); // 打印分数
  24. system("pause");
  25. return EXIT_SUCCESS;
  26. }
  27. void showScore(void)
  28. {
  29. // 将光标默认位置移动至 不干扰游戏的任意位置。
  30. COORD coord;
  31. coord.X = 0;
  32. coord.Y = HIGH + 2;
  33. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  34. printf("Game Over!!!\n");
  35. printf("成绩为:%d\n\n\n", score);
  36. }
  37. /*
  38. 这段代码使用嵌套的循环,分别遍历每一行和每一列,
  39. 根据位置情况输出相应的字符。如果到了最后一列,输出一条竖线 |;
  40. 如果到了最后一行,输出一条横线 _;其他情况下,输出一个空格。
  41. 最后,每输出一行,就换一次行。
  42. */
  43. void initWall(void)
  44. {
  45. for (size_t i = 0; i <= HIGH; i++) // 多行
  46. {
  47. for (size_t j = 0; j <= WIDE; j++) // 一行中的多列
  48. {
  49. if (j == WIDE) // 如果到了最后一列,输出一条竖线
  50. {
  51. printf("|");
  52. }
  53. else if (i == HIGH) // 如果到了最后一行,输出一条横线
  54. {
  55. printf("_");
  56. }
  57. else // 其他情况下,输出一个空格
  58. {
  59. printf(" ");
  60. }
  61. }
  62. printf("\n"); // 每输出一行,换行一次
  63. }
  64. }
  65. void playGame(void)
  66. {
  67. char key = 'd'; // 定义一个字符变量 key,表示用户的按键输入,默认是向右移动。
  68. while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
  69. && snake.body[0].Y >= 0 && snake.body[0].Y < HIGH) // 判断蛇是否撞墙
  70. {
  71. initUI(); // 更新蛇的位置,打印出贪吃蛇和食物
  72. if (_kbhit()) // 检测用户是否有按键输入
  73. {
  74. key = _getch(); // 获取用户按下的按键
  75. }
  76. switch (key)
  77. {
  78. case 'w': kx = 0; ky = -1; break; // 如果用户按下 'w',向上移动
  79. case 's': kx = 0; ky = +1; break; // 如果用户按下 's',向下移动
  80. case 'd': kx = +1; ky = 0; break; // 如果用户按下 'd',向右移动
  81. case 'a': kx = -1; ky = 0; break; // 如果用户按下 'a',向左移动
  82. default: break; // 如果用户按下其他键,不进行移动
  83. }
  84. // 碰撞
  85. // 判断蛇头是否撞到身体
  86. for (size_t i = 1; i < snake.size; i++)
  87. {
  88. if (snake.body[0].X == snake.body[i].X
  89. && snake.body[0].Y == snake.body[i].Y)
  90. {
  91. return; // 如果蛇头撞到身体,游戏结束
  92. }
  93. }
  94. // 判断蛇头是否撞到食物
  95. if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
  96. {
  97. initFood(); // 食物被吃掉了,重新生成一个食物
  98. snake.size++; // 蛇的长度增加
  99. score += 10; // 得分增加
  100. sleepSecond -= 100; // 加速游戏
  101. }
  102. // 记录蛇尾的位置
  103. lastX = snake.body[snake.size - 1].X;
  104. lastY = snake.body[snake.size - 1].Y;
  105. // 更新蛇的位置
  106. for (size_t i = snake.size - 1; i > 0; i--)
  107. {
  108. snake.body[i].X = snake.body[i - 1].X; // 后一节身体部位的 X 坐标等于前一节身体部位的 X 坐标
  109. snake.body[i].Y = snake.body[i - 1].Y; // 后一节身体部位的 Y 坐标等于前一节身体部位的 Y 坐标
  110. }
  111. snake.body[0].X += kx; // 蛇头的 X 坐标根据用户按键修改
  112. snake.body[0].Y += ky; // 蛇头的 Y 坐标根据用户按键修改
  113. Sleep(sleepSecond); // 控制游戏速度,让游戏不会太快。
  114. }
  115. return;
  116. }
  117. // 定义初始化蛇函数
  118. void initSnake(void)
  119. {
  120. snake.size = 2;
  121. snake.body[0].X = WIDE / 2; //蛇头初始化
  122. snake.body[0].Y = HIGH / 2;
  123. snake.body[1].X = WIDE / 2 - 1; // 蛇一节身体初始化
  124. snake.body[1].Y = HIGH / 2;
  125. return;
  126. }
  127. // 初始化界面控件
  128. void initUI(void)
  129. {
  130. COORD coord = { 0 }; // 定义一个 COORD 类型的结构体变量,用来表示光标移动的位置。
  131. // 画蛇
  132. for (size_t i = 0; i < snake.size; i++) // 遍历贪吃蛇的每个身体部位
  133. {
  134. coord.X = snake.body[i].X; // 获取当前身体部位的 X 坐标
  135. coord.Y = snake.body[i].Y; // 获取当前身体部位的 Y 坐标
  136. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到当前身体部位所在的位置
  137. if (i == 0) // 如果当前身体部位是蛇头
  138. putchar('@'); // 打印出蛇头
  139. else
  140. putchar('*'); // 否则打印出蛇身
  141. }
  142. // 去除蛇尾
  143. coord.X = lastX; // 获取蛇尾的 X 坐标
  144. coord.Y = lastY; // 获取蛇尾的 Y 坐标
  145. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到蛇尾所在的位置
  146. putchar(' '); // 打印一个空格,相当于去除了蛇尾
  147. // 画食物
  148. coord.X = food.X; // 获取食物的 X 坐标
  149. coord.Y = food.Y; // 获取食物的 Y 坐标
  150. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 将光标移动到食物所在的位置
  151. putchar('#'); // 打印出食物
  152. }
  153. // 食物的初始化函数
  154. void initFood(void)
  155. {
  156. food.X = rand() % WIDE; // 0-59
  157. food.Y = rand() % HIGH; // 0-59
  158. return;
  159. }

 

二、运行结果截图

 

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

闽ICP备14008679号