小言_互联网的博客

贪吃蛇基础·框架版(简单)开头有原码

357人阅读  评论(0)

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。

额,我有点晕了,今天先上框架版,晚上在进行优化,这个代码有点多,还跳来跳去,有F1和F2为实现,重新玩一次效果不佳,咬到自己那里的调用也有问题。

这是贪吃蛇的第一版,后期将会升级,希望可以弄懂每一步,而不是抄代码。

目录

原码,仅供侦错

首先的首先,这次我编译器是下面这个(需要安装包,请私信Q一下小喵),养成一个好习惯。

窗口设置

地图绘制

蛇结点创建

食物创建

键盘事件侦听

蛇的移动

​编辑

 屏幕提示

 结束页面

匹诺曹

结束页面实现及其子函数实现

开始页面

头文件

全局变量

函数声明

主函数

(水字数)贪吃蛇的游戏介绍

背景设定

操作指南

游戏特色

游戏评价


原码,仅供侦错


  
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<windows.h>//要使用windows的api ,lrq
  4. //因为要用到随机数函数,所以要调用time.h文件
  5. #include<time.h>
  6. #include<conio.h>//用来接收键盘的输入输出
  7. //
  8. //预定义
  9. #define U 1
  10. #define D 2
  11. #define L 3
  12. #define R 4
  13. //U上 D下 L左 R右
  14. /
  15. //定义全局变量
  16. typedef struct snake
  17. {
  18. int x;
  19. int y;
  20. struct snake* next;
  21. }snake;
  22. snake *head; //指向蛇头的指针
  23. snake *food; //创建的食物
  24. snake *q; //用来遍历蛇的结点的
  25. int status;
  26. int add= 10; //每个食物的得分
  27. int sumScore= 0; //总得分
  28. int highScore= 0; //最高分
  29. //三种结束状态变量
  30. //1,撞墙 2,自己咬到自己了 3,主动退出
  31. int endGameStatus= 0;
  32. //函数声明
  33. void createMap();
  34. //坐标转换
  35. void gotoXY(int a,int b);
  36. //颜色更换
  37. int color(int x);
  38. //创建蛇
  39. void initSnake();
  40. //创建食物
  41. void createFood();
  42. //侦听键盘事件
  43. void keyboardControl();
  44. //让蛇动起来
  45. int snakeMove();
  46. //撞墙停止
  47. int cantCrossWall();
  48. //自己咬到自己
  49. int biteSelf();
  50. //主页面上小提示
  51. void screenTips();
  52. //结束页面
  53. void endGame();
  54. //匹诺曹绘制
  55. void LostDraw();
  56. void File_In();
  57. void File_Out();
  58. void choose();
  59. void printsnake();
  60. void welcometoGame();
  61. /*
  62. 字符拼成英文图案
  63. */
  64. void printsnake()
  65. {
  66. color( 2);
  67. printf( " \n");
  68. printf( " __________ ___ \n");
  69. printf( " / \\ / \\ \\ |____ __\\__ \n");
  70. printf( " / ________ \\ / ___ \\ _/ __ | | / \n");
  71. printf( " | | |__| _/_ |_| / [|] |/ \n");
  72. printf( " | | | | | / _|_ \\__/ \n");
  73. printf( " \\ \\_______ / \\ |___/ ____ \n");
  74. printf( " \\ \\ ____ ____ ____ __ | | ___ ______ \n");
  75. printf( " \\_______ \\ | |/ \\ / \\_/ / | | / / / \\ \n");
  76. printf( " \\ \\ | ___ \\ / ____ / | |/ / / ____ \\ \n");
  77. printf( " __ | | | / \\ \\ | | | / | / | /____\\ | \n");
  78. printf( " \\ \\_______| | | | | | | |__| | | \\ | ________/ \n");
  79. printf( " \\ / | | | | \\ \\ | |\\ \\ \\ \\____ \n");
  80. printf( " \\__________/ |__| |__| \\___/\\__\\ |__| \\__\\ \\______/ \n");
  81. }
  82. void welcometoGame()
  83. {
  84. int n= 0;
  85. int i= 0;
  86. int j= 0;
  87. gotoXY( 43, 18);
  88. color( 11);
  89. printf( "贪 吃 蛇 游 戏");
  90. color( 14);
  91. for(i= 20;i<= 26;i++)
  92. {
  93. for(j= 27;j<= 74;j++)
  94. {
  95. gotoXY(j,i);
  96. if(i== 20 ||i== 26)
  97. {
  98. printf( "-");
  99. } else if(j== 27||j== 74)
  100. {
  101. printf( "|");
  102. }
  103. }
  104. }
  105. gotoXY( 36, 22);
  106. color( 10);
  107. printf( "1.开始游戏");
  108. gotoXY( 50, 22);
  109. color( 10);
  110. printf( "2.游戏说明");
  111. gotoXY( 36, 24);
  112. color( 10);
  113. printf( "3.退出游戏");
  114. gotoXY( 28, 27);
  115. color( 3);
  116. printf( "请选择[1 2 3]:[ ]\b\b"); //\b是退格使光标处于两个中括号之间
  117. color( 14);
  118. scanf( "%d",&n);
  119. switch(n)
  120. {
  121. case 1:
  122. system( "cls");
  123. File_Out();
  124. sumScore= 0;
  125. createMap();
  126. screenTips();
  127. initSnake();
  128. createFood();
  129. keyboardControl();
  130. break;
  131. case 2:
  132. //游戏说明界面
  133. break;
  134. case 3:
  135. exit( 0);
  136. break;
  137. default:
  138. break;
  139. }
  140. }
  141. void endGame()
  142. {
  143. //清屏操作
  144. system( "cls");
  145. LostDraw();
  146. if(endGameStatus== 1)
  147. {
  148. //TODO
  149. gotoXY( 35, 9);
  150. color( 7);
  151. printf( "对不起,你撞墙了!游戏结束");
  152. } else if(endGameStatus== 2)
  153. {
  154. //TODO
  155. gotoXY( 35, 9);
  156. color( 7);
  157. printf( "对不起,你咬到自己了!游戏结束");
  158. }
  159. else if(endGameStatus== 3)
  160. {
  161. //TODO
  162. gotoXY( 35, 9);
  163. color( 7);
  164. printf( "游戏结束!");
  165. }
  166. gotoXY( 43, 12);
  167. printf( "你的得分是:%d分",sumScore);
  168. //判断得分是否需要存储
  169. if(sumScore>=highScore)
  170. {
  171. color( 10);
  172. gotoXY( 33, 16);
  173. printf( "创纪录了,最高分被你刷新了!");
  174. //最高分存入文件当中
  175. File_In();
  176. } else{
  177. gotoXY( 33, 16);
  178. printf( "继续努力吧~你离最高分还差:%d",highScore-sumScore);
  179. }
  180. //调用选择选项
  181. choose();
  182. }
  183. void choose()
  184. {
  185. int n= 0;
  186. gotoXY( 30, 23);
  187. color( 12);
  188. printf( "重玩一局[1]");
  189. gotoXY( 50, 23);
  190. printf( "溜了溜了[2]");
  191. gotoXY( 43, 25);
  192. printf( "选择:");
  193. scanf( "%d",&n);
  194. switch(n)
  195. {
  196. case 1:
  197. system( "cls");
  198. printsnake();
  199. //开始界面
  200. welcometoGame();
  201. break;
  202. case 2:
  203. exit( 0);
  204. break;
  205. default:
  206. gotoXY( 35, 27);
  207. color( 12);
  208. printf( "你输入的有误,请重新输入");
  209. break;
  210. }
  211. }
  212. //文件读写
  213. void File_In()
  214. {
  215. //定义文件指针
  216. FILE *fp;
  217. //指针关联文件
  218. fp= fopen( "save.txt", "w+");
  219. //通过文件指针向文件写入内容
  220. fprintf(fp, "%d",sumScore);
  221. //关闭文件
  222. fclose(fp);
  223. }
  224. void File_Out()
  225. {
  226. FILE *pp;
  227. pp= fopen( "save.txt", "a+");
  228. fscanf(pp, "%d",&highScore);
  229. fclose(pp);
  230. }
  231. void LostDraw() {
  232. /*
  233. 失败界面
  234. */
  235. system( "cls");
  236. int i;
  237. gotoXY( 45, 1);
  238. color( 6);
  239. printf( " |-----| "); //匹诺曹的帽子
  240. gotoXY( 45, 2);
  241. color( 6);
  242. printf( " | | ");
  243. gotoXY( 43, 3);
  244. color( 6);
  245. printf( "-------------");
  246. gotoXY( 44, 4);
  247. color( 14);
  248. printf( "(");
  249. gotoXY( 47, 4);
  250. color( 15);
  251. printf( " > <"); //眼睛
  252. gotoXY( 54, 4);
  253. color( 14);
  254. printf( ")");
  255. gotoXY( 17, 5);
  256. color( 11);
  257. printf( "+------------------------"); //上边框
  258. gotoXY( 35, 5);
  259. color( 14);
  260. printf( "oOOo");
  261. gotoXY( 39, 5);
  262. color( 11);
  263. printf( "----------"); //上边框
  264. gotoXY( 48, 5);
  265. color( 14);
  266. printf( "| |"); //鼻子
  267. gotoXY( 48, 6);
  268. color( 14);
  269. printf( "|_|");
  270. gotoXY( 51, 5);
  271. color( 11);
  272. printf( "----------"); //上边框
  273. gotoXY( 61, 5);
  274. color( 14);
  275. printf( "oOOo");
  276. gotoXY( 65, 5);
  277. color( 11);
  278. printf( "-----------------+"); //上边框
  279. for (i = 6; i <= 19; i++) { //竖边框
  280. gotoXY( 17, i);
  281. printf( "|");
  282. gotoXY( 82, i);
  283. printf( "|");
  284. }
  285. gotoXY( 17, 20);
  286. printf( "+------------------------------------------"); //下边框
  287. gotoXY( 60, 20);
  288. color( 11);
  289. printf( "----------------------+"); //下边框
  290. }
  291. void screenTips(){
  292. color( 11);
  293. gotoXY( 64, 4);
  294. printf( "☆最高记录是:%d☆",highScore);
  295. color( 14);
  296. gotoXY( 64, 6);
  297. printf( "当前得分:%d",sumScore);
  298. gotoXY( 73, 11);
  299. printf( "小提示");
  300. gotoXY( 60, 13);
  301. color( 6);
  302. printf( "§--------------------§");
  303. gotoXY( 60, 26);
  304. color( 6);
  305. printf( "§--------------------§");
  306. gotoXY( 64, 14);
  307. color( 3);
  308. printf( "每个食物得分:%d分",add);
  309. gotoXY( 64, 16);
  310. printf( "不能撞墙,不能咬到自己");
  311. gotoXY( 64, 18);
  312. printf( "用上,下,左,右箭头分别控制方向");
  313. gotoXY( 64, 20);
  314. printf( "F1键加速,F2键减速");
  315. gotoXY( 64, 22);
  316. printf( "空格键暂停游戏");
  317. gotoXY( 64, 24);
  318. printf( "Esc键退出游戏");
  319. }
  320. int biteSelf()
  321. {
  322. snake *self; //这里不涉及内存分配,它只是涉及只向的内容的变化
  323. self=head->next;
  324. while(self!= NULL)
  325. {
  326. //TODO
  327. if(self->x==head->x&&self->y==head->y)
  328. {
  329. return 1;
  330. }
  331. self = self->next;
  332. }
  333. return 0;
  334. }
  335. int cantCrossWall(){
  336. if(head->x== 0||head->x== 56||head->y== 0||head->y== 26)
  337. {
  338. system( "cls");
  339. gotoXY( 30, 6);
  340. printf( "撞墙了");
  341. return 1;
  342. }
  343. return 0;
  344. }
  345. int snakeMove()
  346. {
  347. snake *newNode;
  348. newNode = (snake*) malloc( sizeof(snake));
  349. if(status==U)
  350. {
  351. newNode->x=head->x;
  352. newNode->y=head->y -1;
  353. }
  354. if (status == D) {
  355. newNode->x = head->x;
  356. newNode->y = head->y + 1;
  357. }
  358. if (status == L) {
  359. newNode->x = head->x - 2;
  360. newNode->y = head->y;
  361. }
  362. if (status == R) {
  363. //TODO
  364. newNode->x = head->x + 2;
  365. newNode->y = head->y;
  366. }
  367. newNode->next=head;
  368. //将新的结点赋值给head
  369. head=newNode;
  370. if( cantCrossWall())
  371. {
  372. status = 0;
  373. endGame();
  374. return 3;
  375. }
  376. //判断新的结点是否有食物
  377. q=head;
  378. if(newNode->x==food->x&&newNode->y==food->y)
  379. {
  380. while(q!= NULL)
  381. {
  382. //TODO
  383. gotoXY(q->x,q->y);
  384. color( 14);
  385. printf( "◆");
  386. q=q->next;
  387. }
  388. //吃掉食物过后总分要加上单个食物的分值
  389. sumScore+=add;
  390. //调用一次
  391. screenTips();
  392. //食物被吃掉了,再创建一个
  393. createFood();
  394. } else{
  395. while(q->next->next!= NULL)
  396. {
  397. //TODO
  398. gotoXY(q->x,q->y);
  399. color( 14);
  400. printf( "◆");
  401. q=q->next;
  402. }
  403. //把倒数第一个变成原来的地图形状
  404. gotoXY(q->next->x,q->next->y);
  405. color( 3);
  406. printf( "■");
  407. //释放内存和指针
  408. free(q->next);
  409. q->next= NULL;
  410. }
  411. if( biteSelf()== 1)
  412. {
  413. endGame();
  414. return 2;
  415. }
  416. return 0;
  417. }
  418. void keyboardControl()
  419. {
  420. status =R; //默认向右走 *
  421. while( 1)
  422. {
  423. //TODO
  424. //侦听所有键盘事件状态
  425. if( GetAsyncKeyState(VK_UP)&&status !=D)
  426. {
  427. //需要一个变量,来接收是哪个键按下去了
  428. status =U;
  429. } else if( GetAsyncKeyState(VK_DOWN)&&status !=U)
  430. {
  431. status=D;
  432. }
  433. else if( GetAsyncKeyState(VK_LEFT)&&status !=R)
  434. {
  435. status=L;
  436. }
  437. else if( GetAsyncKeyState(VK_RIGHT)&&status !=L)
  438. {
  439. status=R;
  440. }
  441. //空格键游戏暂停,蛇停止运动
  442. if( GetAsyncKeyState(VK_SPACE))
  443. {
  444. //TODO
  445. //第一次按空格键,进程挂起,
  446. while( 1)
  447. {
  448. Sleep( 300);
  449. //第二次空格键,进程退出
  450. if( GetAsyncKeyState(VK_SPACE))
  451. {
  452. break;
  453. }
  454. } //按下ESC键,游戏结束
  455. } else if( GetAsyncKeyState(VK_ESCAPE)){
  456. endGameStatus= 3;
  457. endGame();
  458. break;
  459. }
  460. Sleep( 300);
  461. //让蛇动起来
  462. if( snakeMove()!= 0)
  463. {
  464. break;
  465. }
  466. }
  467. }
  468. void createFood()
  469. {
  470. snake* food1;
  471. food1=(snake*) malloc( sizeof(snake));
  472. //加上随机数种子,防止伪随机
  473. srand(( unsigned) time( NULL));
  474. food1->x= rand()% 53+ 2; //2.54没听懂?问问
  475. //【2~54】
  476. while(food1->x% 2!= 0)
  477. {
  478. //TODO
  479. food1->x= rand()% 53+ 2;
  480. }
  481. food1->y= rand()% 23+ 1; //?2.58
  482. //food1->next=NULL;?
  483. q=head;
  484. while(q->next!= NULL)
  485. {
  486. if(q->x==food1->x&&q->y==food1->y)
  487. {
  488. free(food1);
  489. createFood(); //如果和蛇身重合了,就再次创建食物
  490. }
  491. q=q->next;
  492. }
  493. //把食物打出来
  494. gotoXY(food1->x,food1->y);
  495. color( 10);
  496. printf( "●");
  497. food=food1;
  498. }
  499. void initSnake()
  500. {
  501. int i= 1;
  502. color( 15);
  503. snake *ss; //结点
  504. //分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
  505. ss =(snake*) malloc( sizeof(snake)); //?
  506. ss->x= 24;
  507. ss->y= 5;
  508. ss->next= NULL;
  509. //利用头插法,插入剩下的四个结点
  510. for(i= 1;i<= 4;i++)
  511. {
  512. head=(snake*) malloc( sizeof(snake));
  513. head->next=ss;
  514. head->x= 24+i* 2;
  515. head->y= 5;
  516. ss=head; //将蛇头变成蛇尾,然后重复循环
  517. }
  518. //打印蛇身
  519. while(ss!= NULL)
  520. {
  521. //TODO
  522. gotoXY(ss->x,ss->y);
  523. printf( "◆");
  524. ss=ss->next;
  525. }
  526. }
  527. int color(int x)
  528. {
  529. //更改待打印颜色属性
  530. SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE),x);
  531. return 0;
  532. }
  533. void gotoXY(int a,int b)
  534. {
  535. COORD c; //生成c的实例
  536. c.X=a;
  537. c.Y=b;
  538. SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE),c);
  539. }
  540. //函数定义/函数实现
  541. void createMap()
  542. {
  543. int i,j;
  544. color( 6); //0~255
  545. //两个for填边框的色
  546. for(i= 0;i< 58;i+= 2)
  547. {
  548. gotoXY(i, 0);
  549. printf( "□");
  550. gotoXY(i, 26);
  551. printf( "□");
  552. }
  553. for(i= 1;i< 26;i++)
  554. {
  555. gotoXY( 0,i);
  556. printf( "□");
  557. gotoXY( 56,i);
  558. printf( "□");
  559. }
  560. //填中间的色
  561. color( 3);
  562. for(i= 2;i< 56;i+= 2)
  563. {
  564. for(j= 1;j< 26;j++)
  565. {
  566. gotoXY(i,j);
  567. printf( "■");
  568. }
  569. }
  570. }
  571. int main()
  572. {
  573. //设置控制台的宽高
  574. system( "mode con cols=110 lines=30");
  575. printsnake();
  576. welcometoGame();
  577. while( 1)
  578. {
  579. }
  580. return 0;
  581. }

首先的首先,这次我编译器是下面这个(需要安装包,请私信Q一下小喵),养成一个好习惯。

 好习惯:

一切以整体原代码为准,图片介绍仅供参考。没完成一步,建议编译一下,进行阶段性测试,这是一个非常实用的习惯,可以把bug缩小到子程序的范围,保证800来行代码的完成效率,谢谢。

小喵觉得图片能更加直观的展示代码(颜色有直观的区别),便于侦错,但csdn系统希望小喵有更完善的描述,所有小喵会附上局部代码,仅供侦错,难免重复,麻烦谅解,水一水字数了。


窗口设置


地图绘制

局部代码(仅供侦错)


  
  1. void gotoXY(int a,int b)
  2. {
  3. COORD c; //生成c的实例
  4. c.X=a;
  5. c.Y=b;
  6. SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE),c);
  7. }
  8. //函数定义/函数实现
  9. void createMap()
  10. {
  11. int i,j;
  12. color( 6); //0~255
  13. //两个for填边框的色
  14. for(i= 0;i< 58;i+= 2)
  15. {
  16. gotoXY(i, 0);
  17. printf( "□");
  18. gotoXY(i, 26);
  19. printf( "□");
  20. }
  21. for(i= 1;i< 26;i++)
  22. {
  23. gotoXY( 0,i);
  24. printf( "□");
  25. gotoXY( 56,i);
  26. printf( "□");
  27. }
  28. //填中间的色
  29. color( 3);
  30. for(i= 2;i< 56;i+= 2)
  31. {
  32. for(j= 1;j< 26;j++)
  33. {
  34. gotoXY(i,j);
  35. printf( "■");
  36. }
  37. }
  38. }

写一个颜色变换的函数

进行阶段性测试

说明其中的函数


蛇结点创建


  
  1. void initSnake()
  2. {
  3. int i= 1;
  4. color( 15);
  5. snake *ss; //结点
  6. //分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
  7. ss =(snake*) malloc( sizeof(snake)); //?
  8. ss ->x= 24;
  9. ss ->y= 5;
  10. ss ->next=NULL;
  11. //利用头插法,插入剩下的四个结点
  12. for(i= 1;i<= 4;i++)
  13. {
  14. head=(snake*) malloc( sizeof(snake));
  15. head ->next=ss;
  16. head ->x= 24+i* 2;
  17. head ->y= 5;
  18. ss=head; //将蛇头变成蛇尾,然后重复循环
  19. }
  20. //打印蛇身
  21. while(ss!=NULL)
  22. {
  23. //TODO
  24. gotoXY(ss ->x,ss ->y);
  25. printf( "◆");
  26. ss=ss ->next;
  27. }
  28. }


食物创建


  
  1. void createFood()
  2. {
  3. snake* food1;
  4. food1=(snake*)malloc(sizeof(snake));
  5. //加上随机数种子,防止伪随机
  6. srand((unsigned) time(NULL));
  7. food1-> x= rand()%53+ 2; // 2.54没听懂?问问
  8. //【 2~ 54
  9. while(food1-> x%2!= 0)
  10. {
  11. //TODO
  12. food1-> x= rand()%53+ 2;
  13. }
  14. food1-> y= rand()%23+ 1; //? 2.58
  15. //food1-> next=NULL;?
  16. q=head;
  17. while( q-> next!=NULL)
  18. {
  19. if( q-> x==food1-> x&& q-> y==food1-> y)
  20. {
  21. free(food1);
  22. createFood(); //如果和蛇身重合了,就再次创建食物
  23. }
  24. q= q-> next;
  25. }
  26. //把食物打出来
  27. gotoXY(food1-> x,food1-> y);
  28. color( 10);
  29. printf( "●");
  30. food=food1;
  31. }


键盘事件侦听


  
  1. void keyboardControl( )
  2. {
  3. status =R; //默认向右走
  4. while( 1)
  5. {
  6. //TODO
  7. //侦听所有键盘事件状态
  8. if( GetAsyncKeyState( VK_UP)&&status !=D)
  9. {
  10. //需要一个变量,来接收是哪个键按下去了
  11. status =U;
  12. } else if( GetAsyncKeyState( VK_DOWN)&&status !=U)
  13. {
  14. status=D;
  15. }
  16. else if( GetAsyncKeyState( VK_LEFT)&&status !=R)
  17. {
  18. status=L;
  19. }
  20. else if( GetAsyncKeyState( VK_RIGHT)&&status !=L)
  21. {
  22. status=R;
  23. }
  24. Sleep( 500);
  25. //让蛇动起来
  26. snakeMove();
  27. }
  28. }

蛇的移动

  


  
  1. //让蛇动起来
  2. void snakeMove();
  3. void snakeMove()
  4. {
  5. snake *newNode;
  6. newNode = (snake*) malloc( sizeof(snake));
  7. if(status==U)
  8. {
  9. newNode ->x=head ->x;
  10. newNode ->y=head ->y- 1;
  11. }
  12. if (status == D) {
  13. newNode ->x = head ->x;
  14. newNode ->y = head ->y + 1;
  15. }
  16. if (status == L) {
  17. newNode ->x = head ->x - 2;
  18. newNode ->y = head ->y;
  19. }
  20. if (status == R) {
  21. //TODO
  22. newNode ->x = head ->x + 2;
  23. newNode ->y = head ->y;
  24. }
  25. newNode ->next=head;
  26. //将新的结点赋值给head
  27. head=newNode;
  28. //判断新的结点是否有食物
  29. q=head;
  30. if(newNode ->x==food ->x&&newNode ->y==food ->y)
  31. {
  32. while(q!=NULL)
  33. {
  34. //TODO
  35. gotoXY(q ->x,q ->y);
  36. color( 14);
  37. printf( "◆");
  38. q=q ->next;
  39. }
  40. //食物被吃掉了,再创建一个
  41. createFood();
  42. } else{
  43. while(q ->next ->next!=NULL)
  44. {
  45. //TODO
  46. gotoXY(q ->x,q ->y);
  47. color( 14);
  48. printf( "◆");
  49. q=q ->next;
  50. }
  51. //把倒数第一个变成原来的地图形状
  52. gotoXY(q ->next ->x,q ->next ->y);
  53. color( 3);
  54. printf( "■");
  55. //释放内存和指针
  56. free(q ->next);
  57. q ->next=NULL;
  58. }
  59. }

 蛇是可以动起来了,但蛇撞墙后出bug,要进行进一步修改

 屏幕提示

全局变量:

 子程序


  
  1. //主页面上小提示
  2. void screenTips();
  3. void screenTips(){
  4. color( 11);
  5. gotoXY( 64, 4);
  6. printf("☆最高记录是: 53☆");
  7. color( 14);
  8. gotoXY( 64, 6);
  9. printf("当前得分: 20");
  10. gotoXY( 73, 11);
  11. printf("小提示");
  12. gotoXY( 60, 13);
  13. color( 6);
  14. printf("§--------------------§");
  15. gotoXY( 60, 26);
  16. color( 6);
  17. printf("§--------------------§");
  18. gotoXY( 64, 14);
  19. color( 3);
  20. printf("每个食物得分:%d分",add);
  21. gotoXY( 64, 16);
  22. printf("不能撞墙,不能咬到自己");
  23. gotoXY( 64, 18);
  24. printf("用上,下,左,右箭头分别控制方向");
  25. gotoXY( 64, 20);
  26. printf("F1键加速,F2键减速");
  27. gotoXY( 64, 22);
  28. printf("空格键暂停游戏");
  29. gotoXY( 64, 24);
  30. printf("Esc键退出游戏");
  31. }

 结束页面

匹诺曹


  
  1. void LostDraw() {
  2. /*
  3. 失败界面
  4. */
  5. system("cls");
  6. int i;
  7. gotoXY( 45, 1);
  8. color( 6);
  9. printf(" |-----| "); //匹诺曹的帽子
  10. gotoXY( 45, 2);
  11. color( 6);
  12. printf(" | | ");
  13. gotoXY( 43, 3);
  14. color( 6);
  15. printf("-------------");
  16. gotoXY( 44, 4);
  17. color( 14);
  18. printf("(");
  19. gotoXY( 47, 4);
  20. color( 15);
  21. printf(" > <"); //眼睛
  22. gotoXY( 54, 4);
  23. color( 14);
  24. printf(")");
  25. gotoXY( 17, 5);
  26. color( 11);
  27. printf("+------------------------"); //上边框
  28. gotoXY( 35, 5);
  29. color( 14);
  30. printf("oOOo");
  31. gotoXY( 39, 5);
  32. color( 11);
  33. printf("----------"); //上边框
  34. gotoXY( 48, 5);
  35. color( 14);
  36. printf("| |"); //鼻子
  37. gotoXY( 48, 6);
  38. color( 14);
  39. printf("|_|");
  40. gotoXY( 51, 5);
  41. color( 11);
  42. printf("----------"); //上边框
  43. gotoXY( 61, 5);
  44. color( 14);
  45. printf("oOOo");
  46. gotoXY( 65, 5);
  47. color( 11);
  48. printf("-----------------+"); //上边框
  49. for (i = 6; i <= 19; i++) { //竖边框
  50. gotoXY( 17, i);
  51. printf("|");
  52. gotoXY( 82, i);
  53. printf("|");
  54. }
  55. gotoXY( 17, 20);
  56. printf("+------------------------------------------"); //下边框
  57. gotoXY( 60, 20);
  58. color( 11);
  59. printf("----------------------+"); //下边框
  60. }

结束页面实现及其子函数实现


  
  1. void endGame()
  2. {
  3. //清屏操作
  4. system( "cls");
  5. LostDraw();
  6. if(endGameStatus== 1)
  7. {
  8. //TODO
  9. gotoXY( 35, 9);
  10. color( 7);
  11. printf( "对不起,你撞墙了!游戏结束");
  12. } else if(endGameStatus== 2)
  13. {
  14. //TODO
  15. gotoXY( 35, 9);
  16. color( 7);
  17. printf( "对不起,你咬到自己了!游戏结束");
  18. }
  19. else if(endGameStatus== 3)
  20. {
  21. //TODO
  22. gotoXY( 35, 9);
  23. color( 7);
  24. printf( "游戏结束!");
  25. }
  26. gotoXY( 43, 12);
  27. printf( "你的得分是:%d分",sumScore);
  28. //判断得分是否需要存储
  29. if(sumScore>=highScore)
  30. {
  31. color( 10);
  32. gotoXY( 33, 16);
  33. printf( "创纪录了,最高分被你刷新了!");
  34. //最高分存入文件当中
  35. File_In();
  36. } else{
  37. gotoXY( 33, 16);
  38. printf( "继续努力吧~你离最高分还差:%d",highScore-sumScore);
  39. }
  40. //调用选择选项
  41. choose();
  42. }
  43. void choose()
  44. {
  45. int n= 0;
  46. gotoXY( 30, 23);
  47. color( 12);
  48. printf( "重玩一局[1]");
  49. gotoXY( 50, 23);
  50. printf( "溜了溜了[2]");
  51. gotoXY( 43, 25);
  52. printf( "选择:");
  53. scanf( "%d",&n);
  54. switch(n)
  55. {
  56. case 1:
  57. system( "cls");
  58. printsnake();
  59. //开始界面
  60. welcometoGame();
  61. break;
  62. case 2:
  63. exit( 0);
  64. break;
  65. default:
  66. gotoXY( 35, 27);
  67. color( 12);
  68. printf( "你输入的有误,请重新输入");
  69. break;
  70. }
  71. }
  72. //文件读写
  73. void File_In()
  74. {
  75. //定义文件指针
  76. FILE *fp;
  77. //指针关联文件
  78. fp= fopen( "save.txt", "w+");
  79. //通过文件指针向文件写入内容
  80. fprintf(fp, "%d",sumScore);
  81. //关闭文件
  82. fclose(fp);
  83. }
  84. void File_Out()
  85. {
  86. FILE *pp;
  87. pp= fopen( "save.txt", "a+");
  88. fscanf(pp, "%d",&highScore);
  89. fclose(pp);
  90. }

开始页面


  
  1. /*
  2. 字符拼成英文图案
  3. */
  4. void printsnake()
  5. {
  6. color( 2);
  7. printf( " \n");
  8. printf( " __________ ___ \n");
  9. printf( " / \\ / \\ \\ |____ __\\__ \n");
  10. printf( " / ________ \\ / ___ \\ _/ __ | | / \n");
  11. printf( " | | |__| _/_ |_| / [|] |/ \n");
  12. printf( " | | | | | / _|_ \\__/ \n");
  13. printf( " \\ \\_______ / \\ |___/ ____ \n");
  14. printf( " \\ \\ ____ ____ ____ __ | | ___ ______ \n");
  15. printf( " \\_______ \\ | |/ \\ / \\_/ / | | / / / \\ \n");
  16. printf( " \\ \\ | ___ \\ / ____ / | |/ / / ____ \\ \n");
  17. printf( " __ | | | / \\ \\ | | | / | / | /____\\ | \n");
  18. printf( " \\ \\_______| | | | | | | |__| | | \\ | ________/ \n");
  19. printf( " \\ / | | | | \\ \\ | |\\ \\ \\ \\____ \n");
  20. printf( " \\__________/ |__| |__| \\___/\\__\\ |__| \\__\\ \\______/ \n");
  21. }
  22. void welcometoGame()
  23. {
  24. int n = 0;
  25. int i = 0;
  26. int j = 0;
  27. gotoXY( 43, 18);
  28. color( 11);
  29. printf( "贪 吃 蛇 游 戏");
  30. color( 14);
  31. for(i = 20;i <= 26;i ++)
  32. {
  33. for(j = 27;j <= 74;j ++)
  34. {
  35. gotoXY(j,i);
  36. if(i == 20 ||i == 26)
  37. {
  38. printf( "-");
  39. } else if(j == 27 ||j == 74)
  40. {
  41. printf( "|");
  42. }
  43. }
  44. }
  45. gotoXY( 36, 22);
  46. color( 10);
  47. printf( "1.开始游戏");
  48. gotoXY( 50, 22);
  49. color( 10);
  50. printf( "2.游戏说明");
  51. gotoXY( 36, 24);
  52. color( 10);
  53. printf( "3.退出游戏");
  54. gotoXY( 28, 27);
  55. color( 3);
  56. printf( "请选择[1 2 3]:[ ]\b\b"); //\b是退格使光标处于两个中括号之间
  57. color( 14);
  58. scanf( "%d", &n);
  59. switch(n)
  60. {
  61. case 1:
  62. system( "cls");
  63. File_Out();
  64. sumScore = 0;
  65. createMap();
  66. screenTips();
  67. initSnake();
  68. createFood();
  69. keyboardControl();
  70. break;
  71. case 2:
  72. //游戏说明界面
  73. break;
  74. case 3:
  75. exit( 0);
  76. break;
  77. default:
  78. break;
  79. }
  80. }

头文件


  
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<windows.h>//要使用windows的api ,lrq
  4. //因为要用到随机数函数,所以要调用time.h文件
  5. #include<time.h>
  6. #include<conio.h>//用来接收键盘的输入输出
  7. //
  8. //预定义
  9. #define U 1
  10. #define D 2
  11. #define L 3
  12. #define R 4
  13. //U上 D下 L左 R右

全局变量


  
  1. //定义全局变量
  2. typedef struct snake
  3. {
  4. int x;
  5. int y;
  6. struct snake* next;
  7. }snake;
  8. snake *head; //指向蛇头的指针
  9. snake *food; //创建的食物
  10. snake *q; //用来遍历蛇的结点的
  11. int status;
  12. int add= 10; //每个食物的得分
  13. int sumScore= 0; //总得分
  14. int highScore= 0; //最高分
  15. //三种结束状态变量
  16. //1,撞墙 2,自己咬到自己了 3,主动退出
  17. int endGameStatus= 0;

函数声明


  
  1. //函数声明
  2. void createMap();
  3. //坐标转换
  4. void gotoXY(int a,int b);
  5. //颜色更换
  6. int color(int x);
  7. //创建蛇
  8. void initSnake();
  9. //创建食物
  10. void createFood();
  11. //侦听键盘事件
  12. void keyboardControl();
  13. //让蛇动起来
  14. int snakeMove();
  15. //撞墙停止
  16. int cantCrossWall();
  17. //自己咬到自己
  18. int biteSelf();
  19. //主页面上小提示
  20. void screenTips();
  21. //结束页面
  22. void endGame();
  23. //匹诺曹绘制
  24. void LostDraw();
  25. void File_In();
  26. void File_Out();
  27. void choose();
  28. void printsnake();
  29. void welcometoGame();

主函数


  
  1. int main()
  2. {
  3. //设置控制台的宽高
  4. system("mode con cols= 110 lines= 30");
  5. printsnake();
  6. welcometoGame();
  7. while( 1)
  8. {
  9. }
  10. return 0;
  11. }

(水字数)贪吃蛇的游戏介绍

背景设定

编辑 播报

贪食蛇游戏图面(19张)

1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。 听起来有点复杂,其实就是下面这个样子:

基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 GamesDBase 的介绍。

Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。

操作指南

编辑 播报

玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。

游戏特色

编辑 播报

贪吃蛇原型游戏图片

贪食蛇游戏操作简单,可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候,而是开始。那个时候蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小短蛇让人容易走神,失去耐心。由于难度小,你会不知不觉加快调整方向的速度,在游走自如的时候蛇身逐渐加长了,而玩家却没有意识到危险,在最得意洋洋的一刻突然死亡。

贪食蛇的另一个危险期在于游戏开始几十秒之后。由于玩家的注意力高度集中,精神紧张,此时局面稍好,就会不由自主地想放松一下,结果手指一松劲,贪食蛇就死了。所以贪食蛇可以算作一个敏捷型的小游戏。

游戏评价

编辑 播报

贪吃蛇游戏画面

和别的游戏不同,贪食蛇是一个悲剧性的游戏。许多电子游戏都是以操作者的胜利而告终,而贪食蛇的结局却是死亡。不管玩得多么纯熟,技术多么高超,你最终听到的都是贪食蛇的一声惨叫。当手机上的小蛇越长越长,积分越来越高的时候,死亡也就越来越近。那时候忙的不是为了吃豆子长身体,而是为了避免撞墙。你会发现你穷于应付,四处奔忙。贪食蛇最要命的就在一个“贪”字上。

要死,要死,要死,我现在就剩一口气了,啊————。

本来想边敲边写的,可是代码跳来跳去,我的灵魂已经跑出来了,明天再梳理一遍,这一篇博客是16个40分钟的成果,我想一篇博客讲完,脑壳有点疼。希望明天梳理会好用些,今天我已经吐血了。

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,

最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要。


转载:https://blog.csdn.net/ormstq/article/details/128433220
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场