当前位置:   article > 正文

200行代码实现简易贪吃蛇_简单代码编程 贪吃蛇

简单代码编程 贪吃蛇

目录

前言

正文解析

 一、构造小蛇

 二、小蛇的移动

三、控制小蛇移动

四、判断游戏失败

五、吃食物增加长度

完整代码

写在最后


前言

实现一个经典的小游戏——贪吃蛇,如图所示。读者可以先自己尝试,主要难点是小蛇数据如何存储、如何实现转弯的效果、吃到食物后如何增加长度。

b8d3b71eb4d247359bc1173f43f84484.png

正文解析

 一、构造小蛇

第一节在画面中显示一条静止的小蛇,如图所示。对于二维数组canvas[High][Width]的对应元素,

值为0输出空格

值为一1输出边框#

值为1输出蛇头@

值为大于1的正数输出蛇身*

在 startup()函数中初始化蛇头,在画布的中间位置(canvas[High/2][Width/2]= 1;),蛇头向左依次生成4个蛇身(for (i=1;i<=4;i++) canvas[High/2][Width/2-i]=i+1;),元素值分别为2、3、4、5。

1a4b568853f043de86c37aeb9c27d35b.png

 二、小蛇的移动

效果实现

实现小蛇的移动是贪吃蛇游戏的难点。图列出了小蛇分别向右、向上运动后对应二维数组元素值的变化,从中我们可以得出实现思路。

8972a1f3f20046e3b1a8e29785752411.png

方法步骤

假设小蛇元素为54321,其中1为蛇头、5432为蛇身、最大值5为蛇尾。首先将所有大于0的元素加1,得到65432;将最大值6变为0,即去除原来的蛇尾;再根据对应的移动方向将2对应方向的元素由0变成1;如此即实现了小蛇的移动。

1182eb23dd284a729d91712be4c86a37.png

      本游戏的第二步为定义变量int moveDirection表示小蛇的移动方向,值为1、2、3、4分别表示小蛇向上、下、左、右方向移动,小蛇的移动在moveSnakeByDirection()函数中实现。

三、控制小蛇移动

第三步的实现比较简单,在updateWithInput()函数中按a、s、d、w 键改变moveDirection的值,然后调用moveSnakeByDirection()实现小蛇向不同方向的移动

四、判断游戏失败

第四步判断游戏失败,当小蛇和边框或自身发生碰撞时游戏失败

五、吃食物增加长度

效果实现

第五步实现吃食物增加长度的功能,当二维数组canvas[High][Width]的元素值为一2时输出食物数值'F',当蛇头碰到食物时长度加1.

方法步骤

其实现思路和小蛇的移动类似,只需保持原蛇尾,不将最大值变为0即可。


完整代码

下面是完整代码,运行之后需要手动调节英文输入w,s,a,d,以实现上下左右移动

  1. #include<stdio.h>
  2. #include<stdlib.h> //使用rand(),返回一个范围在0~ RAND_MAX之间的伪随机数
  3. #include<conio.h> //控制台输入输出,使用getch()
  4. #include<windows.h>//使用system("pause")实现暂停。
  5. //Sleep(200),延迟200毫秒
  6. #define High 20//游戏画面尺寸
  7. #define Width 100
  8. // 全局变量
  9. int moveDirection;// 小蛇移动位置,上下左右分别用1,2,3,4表示
  10. int food_x,food_y; // 食物的位置
  11. int canvas[High][Width] ={0}; // 二维数组存储游戏画布中对应的元素
  12. // 0为空格 ,-1为边框#,-2为食物 F,1为蛇头@,大于1的正数为蛇身*
  13. //光标移动到(x,y)位置
  14. void gotoxy(int x,int y)
  15. {
  16. HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE) ;
  17. COORD pos;
  18. pos.X=x;
  19. pos.Y=y;
  20. SetConsoleCursorPosition(handle,pos);
  21. }
  22. //隐藏光标
  23. void HideCursor()
  24. {
  25. CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
  26. curInfo.dwSize = 1; //如果没赋值的话,光标隐藏无效
  27. curInfo.bVisible = FALSE; //将光标设置为不可见
  28. HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
  29. SetConsoleCursorInfo(handle, &curInfo); //设置光标信息
  30. }
  31. //一、数据初始化 ,构造小蛇
  32. void startup()
  33. {
  34. int i,j;
  35. // 初始化边框
  36. for(i=0;i<High;i++)
  37. {
  38. canvas[i][0]=-1;
  39. canvas[i][Width-1]=-1;
  40. }
  41. for(j=0;j<Width;j++)
  42. {
  43. canvas[0][j]=-1;
  44. canvas[High-1][j]=-1;
  45. }
  46. // 初始化蛇头位置
  47. canvas[High/2][Width/2]=1;
  48. // 初始化蛇身,画布中元素值分别为2,3,4,5....
  49. for(i=1;i<4;i++)
  50. canvas[High/2][Width/2-i]=i+1;
  51. // 初始小蛇向右移动
  52. moveDirection=4;
  53. food_x=rand()%(High-5)+2;
  54. food_y=rand()%(Width-5)+2;
  55. canvas[food_x][food_y]=-2;
  56. }
  57. // 二、移动小蛇
  58. // 第一步扫描数组canvas所有元素,找到正数元素都+1
  59. // 第二步找到最大元素(即蛇尾巴),把其变为0
  60. // 找到=2的元素(即蛇头),再根据输出的上下左右方向,把对应的另一个像素值设为1(新蛇头)
  61. void moveSnakeByDirection()// 移动小蛇
  62. {
  63. // 第一步扫描数组canvas所有元素,找到正数元素都+1
  64. int i,j;
  65. for(i=1;i<High-1;i++)// i=1
  66. for(j=1;j<Width-1;j++)//j=1
  67. if(canvas[i][j]>0)
  68. canvas[i][j]++;
  69. // 第二步找到最大元素(即蛇尾巴),把其变为0
  70. int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
  71. int max=0;
  72. for(i=1;i<High-1;i++)//i=1
  73. for(j=1;j<Width-1;j++)//j=1
  74. if(canvas[i][j]>0)
  75. {
  76. if(max<canvas[i][j])
  77. {
  78. max=canvas[i][j];
  79. oldTail_i=i;
  80. oldTail_j=j;
  81. }
  82. if(canvas[i][j]==2)
  83. {
  84. oldHead_i=i;
  85. oldHead_j=j;
  86. }
  87. }
  88. // 找到=2的元素(即蛇头),再根据输出的上下左右方向,把对应的另一个像素值设为1(新蛇头)
  89. int newHead_i,newHead_j;
  90. if(moveDirection==1) //上
  91. {
  92. newHead_i=oldHead_i-1;
  93. newHead_j=oldHead_j;
  94. }
  95. if(moveDirection==2) //下
  96. {
  97. newHead_i=oldHead_i+1;
  98. newHead_j=oldHead_j;
  99. }
  100. if(moveDirection==3) //左
  101. {
  102. newHead_i=oldHead_i;
  103. newHead_j=oldHead_j-1;
  104. }
  105. if(moveDirection==4) //右
  106. {
  107. newHead_i=oldHead_i;
  108. newHead_j=oldHead_j+1;
  109. }
  110. // 新蛇头如果吃到食物(-2为食物F)
  111. if(canvas[newHead_i][newHead_j]==-2)
  112. {
  113. canvas[food_x][food_y]=0;
  114. //产生一个新的食物
  115. food_x=rand()%(High-5)+2;
  116. food_y=rand()%(Width-5)+2;
  117. canvas[food_x][food_y]=-2;// 原来的旧蛇尾留着,长度自动+1
  118. }
  119. // 否则,原来的旧蛇尾减掉,保持长度不变
  120. else
  121. canvas[oldTail_i][oldTail_j]=0;
  122. // 是否小蛇和自身撞,或者和边框撞,游戏失败
  123. if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
  124. {
  125. printf("game over!\n");
  126. Sleep(2000);
  127. system("pause");
  128. exit(0);
  129. }
  130. else
  131. canvas[newHead_i][newHead_j]=1;
  132. }
  133. //显示画面
  134. void show()
  135. {
  136. gotoxy(0,0); // 光标移动到原点位置,以下重画清屏
  137. int i,j;
  138. for(i=0;i<High;i++)
  139. {
  140. for(j=0;j<Width;j++)
  141. {
  142. if(canvas[i][j]==0)
  143. printf(" ");// 输出空格
  144. else if(canvas[i][j]==-1)
  145. printf("#");// 输出边框#
  146. else if(canvas[i][j]==1)
  147. printf("@");// 输出蛇头@
  148. else if(canvas[i][j]>1)
  149. printf("*");// 输出蛇身*
  150. else if(canvas[i][j]==-2)
  151. printf("F");// 输出食物F
  152. }
  153. printf("\n");
  154. }
  155. Sleep(90);
  156. }
  157. // 与用户输入无关的更新
  158. void updateWithoutInput()
  159. {
  160. moveSnakeByDirection();
  161. }
  162. // 与用户输入有关的更新,控制小蛇移动
  163. void updateWithInput()
  164. {
  165. char input;
  166. if(kbhit())
  167. {
  168. input=getch(); // 判断是否有输入
  169. if(input=='a')
  170. {
  171. moveDirection=3; // 位置左移
  172. moveSnakeByDirection();
  173. }
  174. else if(input=='d')
  175. {
  176. moveDirection=4;// 位置右移
  177. moveSnakeByDirection();
  178. }
  179. else if(input=='w')
  180. {
  181. moveDirection=1;// 位置上移
  182. moveSnakeByDirection();
  183. }
  184. else if(input=='s')
  185. {
  186. moveDirection=2; // 位置下移
  187. moveSnakeByDirection();
  188. }
  189. }
  190. }
  191. int main()
  192. {
  193. startup(); // 数据初始化
  194. while(1) // 游戏循环执行
  195. {
  196. show();// 显示画面
  197. HideCursor(); //隐藏光标
  198. updateWithoutInput();// 与用户输入无关的更新
  199. updateWithInput(); //与用户输入有关的更新
  200. }
  201. return 0;
  202. }

写在最后

创作不易,还希望各位大佬支持!

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