当前位置:   article > 正文

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享_c语言贪吃蛇

c语言贪吃蛇

贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!

贪吃蛇小程序,主要采用C语言描述,采用数组进行数据存储的图形化操作界面,会涉及一点点C++ 知识(特别少的一点点),但是有C语言基础就够用了,编译器:VS2019,会涉及部分库函数的安装及使用,不过也很简单啦!

效果展示:

看到了这个效果之后,那我们就动手来实现吧!

希望大家都能轻松实现这个项目!另外涉及到的#include <graphics.h>需要额外安装图形库插件easyX哦~

代码如下:

  1. #include <graphics.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <time.h>
  5. #include <stdio.h>
  6. #include "snake.h"
  7. int score = 0;
  8. int gamespeed = 100; //蛇运行速度
  9. static void Init(void); /*图形驱动*/
  10. static void Close(void); /*图形结束*/
  11. static void Game_interface(void); /*游戏界面*/
  12. static void GameOver(void); /*结束游戏*/
  13. static void GamePlay(void); /*游戏过程*/
  14. static void PrScore(void); /*输出成绩*/
  15. /*主函数*/
  16. int main(void)
  17. {
  18. Init();
  19. Game_interface();
  20. GamePlay();
  21. Close();
  22. return 0;
  23. }
  24. /*图形驱动*/
  25. static void Init(void)
  26. {
  27. int gd=9,gm=2;
  28. initgraph(&gd,&gm," ");
  29. cleardevice();
  30. }
  31. /* 开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 */
  32. static void Game_interface(void)
  33. {
  34. int i;
  35. setcolor(LIGHTCYAN); /*setbkcolor(LIGHTGREEN);*/
  36. setlinestyle(PS_SOLID,0,1); /*设置线型*/
  37. for(i=50;i<=600;i+=10) /*画边框*/
  38. {
  39. rectangle(i,40,i+10,49); /*上边框*/
  40. rectangle(i,451,i+10,460); /*下边框*/
  41. }
  42. for(i=40;i<=450;i+=10)
  43. {
  44. rectangle(50,i,59,i+10); /*左边框*/
  45. rectangle(601,i,610,i+10); /*右边框*/
  46. }
  47. }
  48. /* 游戏主函数 */
  49. static void GamePlay(void)
  50. {
  51. int i;
  52. srand(time(NULL)); /*随机数发生器*/
  53. food.yes = 1; /*1表示需要出现新食物,0表示已经存在食物*/
  54. snake.life = 0; /*活着*/
  55. snake.direction = 1; /*方向往右*/
  56. snake.x[0] = 100;
  57. snake.y[0] = 100;
  58. snake.x[1] = 110;
  59. snake.y[1] = 100;
  60. snake.node = 2; /*节数*/
  61. PrScore(); /*输出得分*/
  62. while(1) /*可以重复玩游戏,压ESC键结束*/
  63. {
  64. while( !kbhit() ) /*在没有按键的情况下,蛇自己移动*/
  65. {
  66. if(food.yes == 1) /*需要出现新食物*/
  67. {
  68. food.x = rand()%400 + 60;
  69. food.y = rand()%350 + 60;
  70. while(food.x%10 != 0) /*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
  71. food.x++;
  72. while(food.y%10 != 0)
  73. food.y++;
  74. food.yes = 0; /*画面上有食物了*/
  75. }
  76. if(food.yes == 0) /*画面上有食物了就要显示*/
  77. {
  78. setcolor(GREEN);
  79. rectangle(food.x,food.y,food.x + 10,food.y - 10);
  80. }
  81. for(i=snake.node-1;i>0;i--) /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
  82. {
  83. snake.x[i] = snake.x[i-1];
  84. snake.y[i] = snake.y[i-1];
  85. }
  86. /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
  87. switch(snake.direction)
  88. {
  89. case 1:
  90. snake.x[0] += 10;
  91. break;
  92. case 2:
  93. snake.x[0] -= 10;
  94. break;
  95. case 3:
  96. snake.y[0] -= 10;
  97. break;
  98. case 4:
  99. snake.y[0] += 10;
  100. break;
  101. }
  102. /* 从蛇的第四节开始判断是否撞到自己 */
  103. for(i=3;i<snake.node;i++)
  104. {
  105. if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0]))
  106. {
  107. GameOver(); /*显示失败*/
  108. snake.life = 1;
  109. break;
  110. }
  111. }
  112. if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455)) /*蛇是否撞到墙壁*/
  113. {
  114. GameOver(); /*本次游戏结束*/
  115. snake.life = 1; /*蛇死*/
  116. }
  117. if(snake.life == 1) /*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
  118. break;
  119. if((snake.x[0] == food.x) && (snake.y[0] == food.y)) /*吃到食物以后*/
  120. {
  121. setcolor(BLACK); /*把画面上的食物东西去掉*/
  122. rectangle(food.x,food.y,food.x+10,food.y-10);
  123. snake.x[snake.node] = -20;
  124. snake.y[snake.node] = -20;
  125. /* 新的一节先放在看不见的位置,下次循环就取前一节的位置 */
  126. snake.node++; /*蛇的身体长一节*/
  127. food.yes = 1; /*画面上需要出现新的食物*/
  128. score += 10;
  129. PrScore(); /*输出新得分*/
  130. }
  131. setcolor(RED); /*画出蛇*/
  132. for(i=0;i<snake.node;i++)
  133. rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
  134. Sleep(gamespeed);
  135. setcolor(BLACK); /*用黑色去除蛇的的最后一节*/
  136. rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
  137. snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
  138. } /*endwhile(!kbhit)*/
  139. if(snake.life == 1) /*如果蛇死就跳出循环*/
  140. break;
  141. key=getch(); /*接收按键*/
  142. if (key == ESC) break; /*按ESC键退出*/
  143. switch(key)
  144. {
  145. case UP:
  146. if(snake.direction != 4) /*判断是否往相反的方向移动*/
  147. snake.direction = 3;
  148. break;
  149. case RIGHT:
  150. if(snake.direction != 2)
  151. snake.direction = 1;
  152. break;
  153. case LEFT:
  154. if(snake.direction != 1)
  155. snake.direction = 2;
  156. break;
  157. case DOWN:
  158. if(snake.direction != 3)
  159. snake.direction = 4;
  160. break;
  161. }
  162. }/*endwhile(1)*/
  163. }
  164. /*游戏结束*/
  165. static void GameOver(void)
  166. {
  167. cleardevice();
  168. PrScore();
  169. setcolor(RED);
  170. setfont(56,0,"黑体");
  171. outtextxy(200,200,"GAME OVER");
  172. getch();
  173. }
  174. /*输出成绩*/
  175. static void PrScore(void)
  176. {
  177. char str[10];
  178. setfillstyle(YELLOW);
  179. bar(50,15,220,35);
  180. setcolor(BROWN);
  181. setfont(16,0,"宋体");
  182. sprintf(str,"score:%d",score);
  183. outtextxy(55,16,str);
  184. }
  185. static void Close(void)
  186. {
  187. closegraph();
  188. }
  189. ​​
  190. #ifndef SNAKE_H
  191. #define SNAKE_H
  192. #define LEFT 'a'
  193. #define RIGHT 'd'
  194. #define DOWN 's'
  195. #define UP 'w'
  196. #define ESC 27
  197. #define N 200 /*蛇的最大长度*/
  198. char key; /*控制按键*/
  199. struct Food
  200. {
  201. int x; /*食物的横坐标*/
  202. int y; /*食物的纵坐标*/
  203. int yes; /*判断是否要出现食物的变量*/
  204. }food; /*食物的结构体*/
  205. struct Snake
  206. {
  207. int x[N];
  208. int y[N];
  209. int node; /*蛇的节数*/
  210. int direction; /*蛇移动方向*/
  211. int life; /* 蛇的生命,0活着,1死亡*/
  212. }snake;
  213. #endif

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

 

 整理分享(学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)

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

闽ICP备14008679号