经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
使用C语言实现贪吃蛇小游戏
来源:jb51  时间:2022/7/25 19:16:02  对本文有异议

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

前言

控制台的欢乐就是这么简单;

提示:以下是本篇文章正文内容,下面案例可供参考

一、贪吃蛇实现的结构和方式

1.用枚举定义蛇的移动方向

  1. enum Dir
  2. {
  3. ?? ?UP,
  4. ?? ?DOWN,
  5. ?? ?LEFT,
  6. ?? ?RIGHT,//枚举不能用分号;
  7. };
  8. //创建结构体,对蛇的参数进行设置;
  9. struct Snake
  10. {
  11. ?? ?int size;//蛇的节数;
  12. ?? ?int dir;//蛇的方向;
  13. ?? ?int speed;//蛇的移动速度;
  14. ?? ?//用数组来表示蛇的坐标;
  15. ?? ?POINT coor[SNAKE_SIZE];//蛇的最大节数;
  16. }snake;
  17. //食物的结构体;
  18. struct Food
  19. {
  20. ?? ?int x;
  21. ?? ?int y;
  22. ?? ?int r; ? //食物半径;
  23. ?? ?bool flag;//用来判断食物是否被吃;
  24. ?? ?DWORD color;//食物颜色;
  25. }food;

# 2、使用步骤
## 1.引入库
代码如下(示例):

  1. ```c
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. import warnings
  7. warnings.filterwarnings('ignore')
  8. import ?ssl
  9. ssl._create_default_https_context = ssl._create_unverified_context

2.对窗口进行设置;

代码如下(示例):

  1. void GameDraw()
  2. {
  3. ?? ?//双缓冲绘图;
  4. ?? ?BeginBatchDraw();
  5. ?? ?//设置背景颜色;
  6. ?? ?setbkcolor(RGB(28, 115, 119));
  7. ?? ?cleardevice();
  8. ?? ?//绘制蛇;
  9. ?? ?setfillcolor(GREEN);//颜色的改变;
  10. ?? ?for (int i = 0; i < snake.size; i++)
  11. ?? ?{
  12. ?? ??? ?solidcircle(snake.coor[i].x, snake.coor[i].y, 5);//solidcircle函数可以用来描绘无边框填充函数;
  13. ?? ?}
  14. ?? ?//绘制食物;
  15. ?? ?if (food.flag)
  16. ?? ?{
  17. ?? ??? ?solidcircle(food.x, food.y, food.r);//solidcircle代表画圆;
  18. ?? ?}
  19. ?? ?EndBatchDraw();
  20. }

3.对蛇进行初始化;

  1. void GameInit()
  2. {
  3. ?? ?//播放背景音乐;
  4. ?? ?mciSendString("open./mp3.music alias BGM", 0, 0, 0);
  5. ?? ?mciSendString("play BGM repeat", 0, 0, 0);
  6. ?? ?initgraph(640, 480 /*SHOWCONSOLE*/);
  7. ?? ?//设计随机数种子;
  8. ?? ?srand(GetTickCount());//GetTickCount()获取开机到现在的毫秒数;
  9. ?? ?snake.size = 3;
  10. ?? ?snake.speed = 10;
  11. ?? ?snake.dir = RIGHT;
  12. ?? ?for (int i = 0; i <= snake.size - 1; i++)
  13. ?? ?{
  14. ?? ??? ?snake.coor[i].x = 10 * (2 - i) + 20;//向右偏移;
  15. ?? ??? ?snake.coor[i].y = 10;//确保蛇在同一水品线;
  16. ?? ?}
  17. ?? ?//食物的初始化;随机产生一个整数;设置随机种子,头文件是stdlib.h;
  18. ?? ?food.x = rand() % 640;
  19. ?? ?food.y = rand() % 480;
  20. ?? ?food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//颜色值为0到256;
  21. ?? ?food.r = rand() % 10 + 5;
  22. ?? ?food.flag = true;
  23. }

二、源代码

  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<graphics.h>//不是库函数;
  4. #include<stdlib.h>//随机数的产生;
  5. #include<mmsystem.h>//导入背景音乐;
  6. #pragma comment(lib,"winmm.lib")//导入背景音乐;
  7. //结构体对snake初始化.
  8. #define SNAKE_SIZE 500
  9. /*typedef struct tagpoint
  10. {
  11. ?? ?LONG x;
  12. ?? ?LONG y;
  13. }POINT;*/
  14. //用枚举表示蛇的方向;
  15. enum Dir
  16. {
  17. ?? ?UP,
  18. ?? ?DOWN,
  19. ?? ?LEFT,
  20. ?? ?RIGHT,//枚举不能用分号;
  21. };
  22. //创建结构体,对蛇的参数进行设置;
  23. struct Snake
  24. {
  25. ?? ?int size;//蛇的节数;
  26. ?? ?int dir;//蛇的方向;
  27. ?? ?int speed;//蛇的移动速度;
  28. ?? ?//用数组来表示蛇的坐标;
  29. ?? ?POINT coor[SNAKE_SIZE];//蛇的最大节数;
  30. }snake;
  31. //食物的结构体;
  32. struct Food
  33. {
  34. ?? ?int x;
  35. ?? ?int y;
  36. ?? ?int r; ? //食物半径;
  37. ?? ?bool flag;//用来判断食物是否被吃;
  38. ?? ?DWORD color;//食物颜色;
  39. }food;
  40. //数据的初始化;
  41. /*void GameInit()
  42. {
  43. ?? ?//初始化graph图形窗口,SHOWCONSOLE控制台;
  44. ?? ?initgraph(640, 480, SHOWCONSOLE);
  45. ?? ?snake.size = 0;
  46. ?? ?snake.speed = 10;
  47. ?? ?snake.dir;
  48. ?? ?snake.coor[0].x =10;
  49. ?? ?snake.coor[0].y = 10;
  50. }*/
  51. //数据的初始化;
  52. void GameInit()
  53. {
  54. ?? ?//播放背景音乐;
  55. ?? ?mciSendString("open./mp3.music alias BGM", 0, 0, 0);
  56. ?? ?mciSendString("play BGM repeat", 0, 0, 0);
  57. ?? ?initgraph(640, 480 /*SHOWCONSOLE*/);
  58. ?? ?//设计随机数种子;
  59. ?? ?srand(GetTickCount());//GetTickCount()获取开机到现在的毫秒数;
  60. ?? ?snake.size = 3;
  61. ?? ?snake.speed = 10;
  62. ?? ?snake.dir = RIGHT;
  63. ?? ?for (int i = 0; i <= snake.size - 1; i++)
  64. ?? ?{
  65. ?? ??? ?snake.coor[i].x = 10 * (2 - i) + 20;//向右偏移;
  66. ?? ??? ?snake.coor[i].y = 10;//确保蛇在同一水品线;
  67. ?? ?}
  68. ?? ?//食物的初始化;随机产生一个整数;设置随机种子,头文件是stdlib.h;
  69. ?? ?food.x = rand() % 640;
  70. ?? ?food.y = rand() % 480;
  71. ?? ?food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//颜色值为0到256;
  72. ?? ?food.r = rand() % 10 + 5;
  73. ?? ?food.flag = true;
  74. }
  75. //绘制;
  76. void GameDraw()
  77. {
  78. ?? ?//双缓冲绘图;
  79. ?? ?BeginBatchDraw();
  80. ?? ?//设置背景颜色;
  81. ?? ?setbkcolor(RGB(28, 115, 119));
  82. ?? ?cleardevice();
  83. ?? ?//绘制蛇;
  84. ?? ?setfillcolor(GREEN);//颜色的改变;
  85. ?? ?for (int i = 0; i < snake.size; i++)
  86. ?? ?{
  87. ?? ??? ?solidcircle(snake.coor[i].x, snake.coor[i].y, 5);//solidcircle函数可以用来描绘无边框填充函数;
  88. ?? ?}
  89. ?? ?//绘制食物;
  90. ?? ?if (food.flag)
  91. ?? ?{
  92. ?? ??? ?solidcircle(food.x, food.y, food.r);//solidcircle代表画圆;
  93. ?? ?}
  94. ?? ?EndBatchDraw();
  95. }
  96. //蛇的移动;
  97. //坐标的改变;
  98. void snakemove()
  99. {
  100. ?? ?//让头部后面的跟着头走;
  101. ?? ?for (int i = snake.size - 1; i > 0; i--)
  102. ?? ?{
  103. ?? ??? ?snake.coor[i] = snake.coor[i - 1];
  104. ?? ?}
  105. ?? ?switch (snake.dir)
  106. ?? ?{
  107. ?? ?case RIGHT:
  108. ?? ??? ?snake.coor[0].x += snake.speed;
  109. ?? ??? ?if (snake.coor[0].x - 10 >= 640)
  110. ?? ??? ?{
  111. ?? ??? ??? ?snake.coor[0].x = 0;
  112. ?? ??? ?}
  113. ?? ??? ?break;
  114. ?? ?case LEFT:
  115. ?? ??? ?snake.coor[0].x -= snake.speed;
  116. ?? ??? ?if (snake.coor[0].x + 10 <= 0)
  117. ?? ??? ?{
  118. ?? ??? ??? ?snake.coor[0].x = 640;
  119. ?? ??? ?}
  120. ?? ??? ?break;
  121. ?? ?case UP:
  122. ?? ??? ?snake.coor[0].y -= snake.speed;
  123. ?? ??? ?if (snake.coor[0].y + 10 <= 0)
  124. ?? ??? ?{
  125. ?? ??? ??? ?snake.coor[0].y = 480;
  126. ?? ??? ?}
  127. ?? ??? ?break;
  128. ?? ?case DOWN:
  129. ?? ??? ?snake.coor[0].y += snake.speed;
  130. ?? ??? ?if (snake.coor[0].y - 10 >= 480)
  131. ?? ??? ?{
  132. ?? ??? ??? ?snake.coor[0].y = 0;
  133. ?? ??? ?}
  134. ?? ??? ?break;
  135. ?? ?default:
  136. ?? ??? ?break;
  137. ?? ?}
  138. }
  139. //通过按键改变蛇的方向;
  140. void KeyControl()
  141. {
  142. ?? ?//判断有没有按键;
  143. ?? ?if (_kbhit())//检测有没有按键,如果有就返回真,否则返回假;
  144. ?? ?{
  145. ?? ??? ?//72 80 75 77上下左右键值;
  146. ?? ??? ?switch (_getch())
  147. ?? ??? ?{
  148. ?? ??? ?case 'w':
  149. ?? ??? ?case 'W':
  150. ?? ??? ?case 72:
  151. ?? ??? ??? ?if (snake.dir != DOWN)
  152. ?? ??? ??? ?{
  153. ?? ??? ??? ??? ?snake.dir = UP;
  154. ?? ??? ??? ?}
  155. ?? ??? ??? ?break;
  156. ?? ??? ?case 's':
  157. ?? ??? ?case 'S':
  158. ?? ??? ?case 80:
  159. ?? ??? ??? ?if (snake.dir != UP)
  160. ?? ??? ??? ?{
  161. ?? ??? ??? ??? ?snake.dir = DOWN;
  162. ?? ??? ??? ?}
  163. ?? ??? ??? ?break;
  164. ?? ??? ?case 'a':
  165. ?? ??? ?case 'A':
  166. ?? ??? ?case 75:
  167. ?? ??? ??? ?if (snake.dir != RIGHT)
  168. ?? ??? ??? ?{
  169. ?? ??? ??? ??? ?snake.dir = LEFT;
  170. ?? ??? ??? ?}
  171. ?? ??? ??? ?break;
  172. ?? ??? ?case 'd':
  173. ?? ??? ?case 'D':
  174. ?? ??? ?case 77:
  175. ?? ??? ??? ?if (snake.dir != LEFT)
  176. ?? ??? ??? ?{
  177. ?? ??? ??? ??? ?snake.dir = RIGHT;
  178. ?? ??? ??? ?}
  179. ?? ??? ??? ?break;
  180. ?? ??? ?case ' ':
  181. ?? ??? ??? ?while (1)
  182. ?? ??? ??? ?{
  183. ?? ??? ??? ??? ?if (_getch() == ' ');
  184. ?? ??? ??? ??? ?return;
  185. ?? ??? ??? ?}
  186. ?? ??? ??? ?break;
  187. ?? ??? ?}
  188. ?? ?}
  189. }
  190. //吃食物;
  191. void EatFood()
  192. {
  193. ?? ?if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r && snake.coor[0].y <= food.y + food.r && snake.coor[0].y >= food.y - food.r)
  194. ?? ?{
  195. ?? ??? ?snake.size++;
  196. ?? ??? ?food.flag == false;
  197. ?? ?}
  198. ?? ?if (!food.flag)
  199. ?? ?{
  200. ?? ??? ?food.x = rand() % 640;
  201. ?? ??? ?food.y = rand() % 480;
  202. ?? ??? ?food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
  203. ?? ??? ?food.r = rand() % 10 + 5;
  204. ?? ??? ?food.flag = true;
  205. ?? ?}
  206. }
  207.  
  208. int main()
  209. {
  210. ?? ?//init初始化graph ;
  211. ?? ?initgraph(640, 480);
  212. ?? ?//设置背景颜色;
  213. ?? ?setbkcolor(RGB(28, 115, 119));//设置背景绘图颜色;
  214. ?? ?cleardevice();
  215. ?? ?GameInit();
  216. ?? ?while (1)
  217. ?? ?{
  218. ?? ??? ?snakemove();
  219. ?? ??? ?GameDraw();
  220. ?? ??? ?KeyControl();
  221. ?? ??? ?EatFood();
  222. ?? ??? ?Sleep(80);//时间延迟;
  223. ?? ?}
  224. ?? ?return 0;
  225. }

利用学会的知识做点小游戏

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持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号