利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉,

1.预编译

2.很多关于系统的头文件也不是很熟悉

3.关于内存

第一个是.h头文件

  1. #ifndef _SNAKE_H_H_H
  2. #define _SNAKE_H_H_H
  3.  
  4. //调节游戏界面大小,这里设置为15*15
  5. int const COL=15;
  6. int const ROW=15;
  7.  
  8. //蛇结点
  9. typedef struct Node
  10. {
  11. //data域
  12. int x;
  13. int y;
  14.  
  15. //指针域
  16. struct Node* pre;
  17. struct Node* next;
  18. }NODE,*pNODE;
  19.  
  20. //食物
  21. typedef struct Food
  22. {
  23. int x;
  24. int y;
  25. char c;
  26. }FOOD,*pFOOD;
  27.  
  28. //初始化函数
  29.  
  30. //初始化蛇链表,创建蛇的第一节
  31. pNODE InitSnake();
  32.  
  33. //初始化食物
  34. FOOD InitFood(void);
  35.  
  36. //其它函数
  37.  
  38. //蛇运动函数
  39. int MoveSnake(pNODE pHead,char c);
  40.  
  41. //检查键盘按键
  42. char KbHit(char orient);//函数重载
  43.  
  44. //蛇吃到食物时的处理函数
  45. pNODE SnakeEatFood(pNODE pHead,pFOOD pFood);
  46.  
  47. //打印游戏界面函数
  48. void Print(pNODE pHead,FOOD food);
  49.  
  50. //游戏结束,释放内存函数
  51. void FreeMemory(pNODE *ppHead);
  52.  
  53. #endif

  

第二个是.cpp文件

  1. #include "stdafx.h"
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<conio.h>//windows/dos界面下可以用来生成一些漂亮的字符,另外getchar(),getch()等函数包含在其中
  6. #include<Windows.h>
  7. #include"Snake.h"
  8.  
  9. //主函数
  10. int main(void)
  11. {
  12. char orien = 'a', get_char;
  13. int game_over = 0;
  14.  
  15. FOOD food = InitFood();
  16. pNODE head = InitSnake();
  17.  
  18. while (1)
  19. {
  20. head = SnakeEatFood(head, &food);
  21. get_char = KbHit(orien);
  22. if (27 == get_char)
  23. {
  24. game_over = 1;
  25. break;
  26. }
  27. else
  28. orien = get_char;
  29. game_over = MoveSnake(head, orien);
  30. if (game_over)
  31. break;
  32.  
  33. system("cls");
  34. Print(head, food);
  35. Sleep(200); //ms级,刷屏间隔时间
  36. }
  37. if (game_over)
  38. {
  39. printf("游戏结束!\n");
  40.  
  41. FreeMemory(&head);
  42. if (NULL == head)
  43. printf("内存释放成功!\n");
  44. else
  45. printf("内存释放失败!\n");
  46. }
  47. _getch();
  48. return 0;
  49. }
  50. //初始化,创建蛇的第一节
  51. pNODE InitSnake(void)
  52. {
  53. pNODE pHead = (pNODE)malloc(sizeof(NODE));
  54. srand((unsigned)(time(NULL)+1));
  55.  
  56. if (NULL == pHead)
  57. {
  58. printf("内存分配失败!\n");
  59. exit(-1);
  60. }
  61.  
  62. pHead->x = rand() % ROW;
  63. pHead->y = rand() % COL;
  64. pHead->next = NULL;
  65. pHead->pre = NULL;
  66.  
  67. return pHead;
  68. }
  69. //初始化食物成员
  70. FOOD InitFood(void)
  71. {
  72. FOOD food;
  73. srand((unsigned)time(NULL));
  74.  
  75. food.x = rand() % ROW;
  76. food.y = rand() % COL;
  77. food.c = 65 + rand()%26;
  78.  
  79. return food;
  80. }
  81. //蛇吃到食物处理函数
  82. pNODE SnakeEatFood(pNODE pHead, pFOOD pFood)
  83. {
  84. pNODE p_add = NULL, pt = NULL, rear = NULL;
  85.  
  86. if (pFood->x == pHead->x && pFood->y == pHead->y)
  87. {
  88. p_add = (pNODE)malloc(sizeof(NODE));
  89. if (NULL == p_add)
  90. {
  91. printf("内存分配失败!\n");
  92. exit(-1);
  93. }
  94.  
  95. pt = pHead;
  96. while (pt->next != NULL)
  97. {
  98. pt = pt->next;
  99. }
  100. p_add->pre = pt;
  101. p_add->next = NULL;
  102. pt->next = p_add;
  103.  
  104. *pFood = InitFood();
  105. //不让食物出现在蛇的位置上
  106. pt = pHead;
  107. while (pt != NULL)
  108. {
  109. if (pFood->x == pHead->x && pFood->y == pHead->y)
  110. {
  111. *pFood = InitFood();
  112. break;
  113. }
  114. pt = pt->next;
  115. }
  116. }
  117.  
  118. return pHead;
  119. }
  120. //检查键盘按键
  121. char KbHit(char orient)
  122. {
  123. char c;
  124.  
  125. if (_kbhit())
  126. {
  127. c = _getch();
  128. if (orient != 'd' && c == 'a')
  129. {
  130. orient = c;
  131. }
  132. else if (orient != 'a' && c == 'd')
  133. {
  134. orient = c;
  135. }
  136. else if (orient != 'w' && c == 's')
  137. {
  138. orient = c;
  139. }
  140. else if (orient != 's' && c == 'w')
  141. {
  142. orient = c;
  143. }
  144. else if (27 == c)
  145. {
  146. orient = c;
  147. }
  148. }
  149.  
  150. return orient;
  151. }
  152. //蛇运动函数
  153. int MoveSnake(pNODE pHead, char c)
  154. {
  155. INT game_over = 0;
  156. pNODE pt = pHead;
  157.  
  158. //让pt指向蛇尾
  159. while (pt->next != NULL)
  160. {
  161. pt = pt->next;
  162. }
  163.  
  164. //从蛇尾向向蛇头前进
  165. while(pt != pHead)
  166. {
  167. pt->x = pt->pre->x;
  168. pt->y = pt->pre->y;
  169. pt = pt->pre;
  170. }
  171.  
  172. if ('d' == c)
  173. {
  174. pHead->x += 1;
  175. if (pHead->x >= ROW)
  176. {
  177. pHead->x -= ROW;
  178. }
  179. }
  180.  
  181. if ('a' == c)
  182. {
  183. pHead->x -= 1;
  184. if (pHead->x < 0)
  185. {
  186. pHead->x += ROW;
  187. }
  188. }
  189.  
  190. if ('s' == c)
  191. {
  192. pHead->y += 1;
  193. if (pHead->y >= COL)
  194. {
  195. pHead->y -= COL;
  196. }
  197. }
  198.  
  199. if ('w' == c)
  200. {
  201. pHead->y -= 1;
  202. if (pHead->y < 0)
  203. {
  204. pHead->y += COL;
  205. }
  206. }
  207.  
  208. //当蛇头碰到蛇身,游戏结束
  209. pt = pHead->next;
  210. while (pt != NULL)
  211. {
  212. if (pt->x == pHead->x && pt->y == pHead->y)
  213. {
  214. game_over = 1;
  215. }
  216. pt = pt->next;
  217. }
  218.  
  219. return game_over;
  220. }
  221. //打印游戏界面函数
  222. void Print(pNODE pHead, FOOD food)
  223. {
  224. int row = 0, col = 0, flag = 0;
  225. pNODE pt = NULL;
  226.  
  227. printf(" 方向控制——上:w 下:s 左:a 右:d(Esc退出)\n ");
  228. for (row=0; row<ROW; row++)
  229. {
  230. printf("—");
  231. }
  232. putchar('\n');
  233.  
  234. for (col=0; col<COL; col++)
  235. {
  236. printf(" |");
  237. for (row=0; row<ROW; row++)
  238. {
  239. pt = pHead;
  240. flag = 0;
  241. //打印出蛇
  242. while (pt != NULL)
  243. {
  244. if (row == pt->x && col == pt->y)
  245. {
  246. if (pt == pHead)
  247. printf("■");
  248. else
  249. printf("□");
  250. flag = 1;
  251. break;
  252. }
  253. pt = pt->next;
  254. }
  255. //打印出食物或两个空格
  256. if (0 == flag)
  257. {
  258. if (row == food.x && col == food.y)
  259. {
  260. putchar(food.c);
  261. putchar(food.c);
  262. continue;
  263. }
  264. printf(" ");
  265. }
  266. }
  267. printf("|");
  268. putchar('\n');
  269. }
  270.  
  271. printf(" ");
  272. for (row=0; row<ROW; row++)
  273. {
  274. printf("—");
  275. }
  276. putchar('\n');
  277. }
  278. //释放内存函数
  279. void FreeMemory(pNODE *ppHead)
  280. {
  281. pNODE p_delete = NULL, pt = NULL;
  282.  
  283. while (*ppHead != NULL)
  284. {
  285. pt = (*ppHead)->next;
  286. if (pt != NULL)
  287. {
  288. pt->pre = NULL;
  289. }
  290. p_delete = *ppHead;
  291. free(p_delete);
  292. p_delete = NULL;
  293. *ppHead = pt;
  294. }
  295. }

  

C语言之贪吃蛇的更多相关文章

  1. C语言实现贪吃蛇

    日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组   结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...

  2. c语言版贪吃蛇小游戏

    编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...

  3. C语言实现贪吃蛇游戏

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...

  4. C语言实现贪吃蛇源码

    先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...

  5. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  6. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  7. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  8. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  9. C语言用面向对象的思想写贪吃蛇

    大概一年前这时候,接触C语言一个月,那时候知之甚少,对面向对象只觉”可远观而不可亵玩“,而且会看到很多言论说C语言就是面向过程的语言,C++就是面向对象的语言.不过,不记得什么时候在网上看到过一篇博文 ...

随机推荐

  1. webpack中output配置项中chunkFilename属性的用法

    chunkFilename和webpack.optimize.CommonsChunkPlugin插件的作用差不多,都是用来将公共模块提取出来,但是用法不一样,这里主要介绍chunkFilename的 ...

  2. 你所未知的3种 Node.js 代码优化方式

    from:https://cnodejs.org/topic/56cc2fd6c045c3743304bec6 Node.js 程序的运行可能会受 CPU 或输入输出操作的限制而十分缓慢.从 CPU ...

  3. javascript中的链表结构

    1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...

  4. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. P3398 仓鼠找sugar

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  6. IIS 伪静态配置(安装ISAPI_Rewrite配置)

    第一:首先到官方网站下载ISAPI_Rewrite 我的机子是32位的就下32位免费版的,链接地址如下: http://www.helicontech.com/download/isapi_rewri ...

  7. Android属性(property)机制

    1. 属性简介 Android里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式.这些属性定义了Android系统的一些公共系统属性.比如: [dalvik.vm.dexo ...

  8. FineUI小技巧(3)表格导出与文件下载

    需求描述 实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同). 点击按钮导出表格 由于FineUI 默 ...

  9. canvas api

    基本骨骼 <canvas id="canvas" width=1000 height=1000 style="border: 1px black dotted&qu ...

  10. Windows 部署 Redis 群集

    1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/redis/releases当前我使用的是 3. ...