全系列Index:

  1. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)
  2. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二)
  3. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(三)
  4. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)

由于用system("cls")重绘会有较大的闪烁,我google了网上GOTOXY的实现来完成帧的重绘。

全部程序的源代码:

  1. /*
  2. Powered by wmydx
  3. Snake verson 2.0
  4. 2013.10.19
  5. verson 1.0的遗留问题已经解决:标记蛇头的访问顺序,谁小跟谁
  6. 注意:用户摁键过快会产生BUG,已解决
  7. */
  8. #include <stdio.h>
  9. #include <conio.h>
  10. #include <windows.h>
  11. #include <time.h>
  12. #define ROW 40
  13. #define COL 20
  14. struct SnakeTail
  15. {
  16. int x;
  17. int y;
  18. };
  19. struct SnakeHead
  20. {
  21. int x;
  22. int y;
  23. int dis;
  24. };
  25. struct Food
  26. {
  27. int x;
  28. int y;
  29. };
  30. struct Map
  31. {
  32. char a;
  33. unsigned long long num;
  34. };
  35. struct Point
  36. {
  37. int x;
  38. int y;
  39. int flag;
  40. };
  41. SnakeTail myTail;
  42. SnakeHead myHead;
  43. Food myFood;
  44. unsigned long long count = ;
  45. Map map[COL][ROW];
  46. int gameSpeed = ;
  47. int winPoint = ;
  48. int isDead = ;
  49. int isPoint = ;
  50. //以下是网上找来的GOTOXY实现
  51. void GoToXY(int x, int y)
  52. {
  53. COORD pos = {x,y};
  54. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
  55.  
  56. SetConsoleCursorPosition(hOut, pos);
  57. }
  58.  
  59. void WhereXY(int *x, int *y)
  60. {
  61. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
  62. CONSOLE_SCREEN_BUFFER_INFO bInfo;
  63. GetConsoleScreenBufferInfo( hOut, &bInfo );
  64. COORD pos = bInfo.dwCursorPosition;
  65. *x = pos.X;
  66. *y = pos.Y;
  67. }
  68. //以上时网上找来的GOTOXY实现
  69. void plantFood()
  70. {
  71. int tmpx,tmpy;
  72. srand((int)time());
  73. tmpx = rand() % COL;
  74. tmpy = rand() % ROW;
  75. while(((tmpx <= && tmpx >= COL - ) || (tmpy <= && tmpy >= ROW - )) || map[tmpx][tmpy].a == '*')
  76. {
  77. tmpx = rand() % COL;
  78. tmpy = rand() % ROW;
  79. }
  80. myFood.x = tmpx;
  81. myFood.y = tmpy;
  82. map[myFood.x][myFood.y].a = '$';
  83. }
  84. void initialization() //初始化游戏
  85. {
  86. int col = ;
  87. for(int i = ;i < COL;i++)
  88. for(int j = ;j < ROW;j++)
  89. {
  90. map[i][j].a = ' ';
  91. map[i][j].num = ;
  92. }
  93. for(int i = ;i <= ;i++)
  94. {
  95. map[col][i].a = '*';
  96. map[col][i].num = count ++;
  97. }
  98. myTail.x = ;
  99. myTail.y = ;
  100. myHead.x = ;
  101. myHead.y = ;
  102. myHead.dis = ;
  103. plantFood();
  104. }
  105. void print()
  106. {
  107. printf(" ");
  108. for(int i = ;i < ROW;i++)
  109. printf("-");
  110. printf("\n");
  111. for(int i = ;i < COL;i++)
  112. {
  113. printf(" ");
  114. for(int j = ;j < ROW;j++)
  115. {
  116. if(j == )printf("|");
  117. printf("%c",map[i][j].a);
  118. }
  119. printf("|\n");
  120. }
  121. printf(" ");
  122. for(int i = ;i < ROW;i++)
  123. printf("-");
  124. }
  125. int ifDie(int x,int y)
  126. {
  127. if(x < || y < || x >= COL || y >= ROW || map[x][y].a == '*')return ;
  128. else return ;
  129. }
  130. int ifGetPoint()
  131. {
  132. if(map[myHead.x][myHead.y].a == '$')
  133. {
  134. plantFood();
  135. return ;
  136. }
  137. else return ;
  138. }
  139. void deleteTail()
  140. {
  141. Point a[];
  142. Point temp;
  143. int test = ;
  144. unsigned long long min = 0xFFFFFFFF;
  145. for(int i = ;i < ;i++)
  146. a[i].flag = ;
  147. if(map[myTail.x + ][myTail.y].a == '*')
  148. {
  149. a[].flag = ;
  150. a[].x = myTail.x + ;
  151. a[].y = myTail.y;
  152. }
  153. if(map[myTail.x - ][myTail.y].a == '*')
  154. {
  155. a[].flag = ;
  156. a[].x = myTail.x - ;
  157. a[].y = myTail.y;
  158. }
  159. if(map[myTail.x][myTail.y + ].a == '*')
  160. {
  161. a[].flag = ;
  162. a[].x = myTail.x;
  163. a[].y = myTail.y + ;
  164. }
  165. if(map[myTail.x][myTail.y - ].a == '*')
  166. {
  167. a[].flag = ;
  168. a[].x = myTail.x;
  169. a[].y = myTail.y - ;
  170. }
  171. for(int i = ;i < ;i++)
  172. {
  173. if(a[i].flag == )
  174. {
  175. test ++;
  176. if(map[a[i].x][a[i].y].num < min)
  177. {
  178. min = map[a[i].x][a[i].y].num;
  179. temp = a[i];
  180. }
  181.  
  182. }
  183. }
  184. map[myTail.x][myTail.y].a = ' ';
  185. map[myTail.x][myTail.y].num = ;
  186. myTail.x = temp.x;
  187. myTail.y = temp.y;
  188. }
  189. void snakeMove()
  190. {
  191. switch(myHead.dis)
  192. {
  193. case : myHead.x --;
  194. if(ifGetPoint())
  195. {
  196. winPoint ++;
  197. isPoint = ;
  198. }
  199. if(!ifDie(myHead.x,myHead.y))
  200. {
  201. map[myHead.x][myHead.y].a = '*';
  202. map[myHead.x][myHead.y].num = count ++;
  203. }
  204. else
  205. {
  206. isDead = ;
  207. }
  208. break;
  209. case : myHead.x ++;
  210. if(ifGetPoint())
  211. {
  212. winPoint ++;
  213. isPoint = ;
  214. }
  215. if(!ifDie(myHead.x,myHead.y))
  216. {
  217. map[myHead.x][myHead.y].a = '*';
  218. map[myHead.x][myHead.y].num = count ++;
  219. }
  220. else
  221. {
  222. isDead = ;
  223. }
  224. break;
  225. case : myHead.y --;
  226. if(ifGetPoint())
  227. {
  228. winPoint ++;
  229. isPoint = ;
  230. }
  231. if(!ifDie(myHead.x,myHead.y))
  232. {
  233. map[myHead.x][myHead.y].a = '*';
  234. map[myHead.x][myHead.y].num = count ++;
  235. }
  236. else
  237. {
  238. isDead = ;
  239. }
  240. break;
  241. case : myHead.y ++;
  242. if(ifGetPoint())
  243. {
  244. winPoint ++;
  245. isPoint = ;
  246. }
  247. if(!ifDie(myHead.x,myHead.y))
  248. {
  249. map[myHead.x][myHead.y].a = '*';
  250. map[myHead.x][myHead.y].num = count ++;
  251. }
  252. else
  253. {
  254. isDead = ;
  255. }
  256. break;
  257. }
  258. if(isPoint == )
  259. {
  260. deleteTail();
  261. }
  262. else isPoint = ;
  263. }
  264. void changeSnake(char ch)
  265. {
  266. if(ch == '.')return;
  267. switch(ch)
  268. {
  269. case 'w' : if(myHead.dis != )myHead.dis = ;
  270. break;
  271. case 'a' : if(myHead.dis != )myHead.dis = ;
  272. break;
  273. case 's' : if(myHead.dis != )myHead.dis = ;
  274. break;
  275. case 'd' : if(myHead.dis != )myHead.dis = ;
  276. break;
  277. default : ;//printf("ERROR!"); BUG检测代码
  278. }
  279. }
  280. int main(void)
  281. {
  282. char control = '.';
  283. initialization();
  284. int end = ;
  285. while()
  286. {
  287. while(kbhit() == )
  288. {
  289. changeSnake(control); //这个函数要放入循环体!否则摁键过快,前次操作未进入循环体,后次操作又改变dis了
  290. control = '.';
  291. print();
  292. snakeMove();
  293. if(isDead == )
  294. {
  295. end = ;
  296. break;
  297. }
  298. Sleep(gameSpeed);
  299. GoToXY(,);
  300. }
  301. if(end)break;
  302. control = getch();
  303. }
  304. printf("\n YOUR SCORE IS %d \n",winPoint);
  305. system("pause");
  306. return ;
  307. }

【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  3. 晓莲说-何不原创:java 实现二维数组冒泡排序

    新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /**     * @param admin     * @2017.12.4   ...

  4. php根据二维数组中的某一元素相等,另一个元素相加

    二维数组:$taskData Array ( [0] => Array ( [area] => 1 [winsFlag] => 7 [count] => 3 ) [1] =&g ...

  5. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  6. 数组属性的习题、Arrays工具、二维数组

    一.数组的练习 1.声明一个char类型的数组, 从键盘录入6个字符: [1]遍历输出 [2]排序 [3]把char数组转化成一个逆序的数组. import java.util.Scanner; pu ...

  7. 常用的Arrays类和二维数组以及二分法的介绍

    ---恢复内容开始--- 1.Array类 Array中包含了许多数组的常用操作,较为常见的有: (1)快速输出 import java.util.Arrays; public class Test{ ...

  8. Java数组之二维数组

    Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...

  9. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

随机推荐

  1. [Word使用笔记]分类简介

    什么Vistual Studio , Eclipse , Xcode , 都弱爆了,Word比他们难多了 - -! 此分类用于记录Word的一些使用

  2. 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

    尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...

  3. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  4. java多线程12设计模式

    1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Patte ...

  5. Photoshop理论:另外一种角度看图层混合模式

    源地址:http://www.missyuan.com/thread-687724-1-4.html 1.我将一个色阶看成是一个由亮部和暗部组成的这么一个元素,亮部是我们看的见的,暗部是影响亮部的,有 ...

  6. 基于HOG特征的Adaboost行人检测

    原地址:http://blog.csdn.net/van_ruin/article/details/9166591 .方向梯度直方图(Histogramof Oriented Gradient, HO ...

  7. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  8. ZOJ 3635 Cinema in Akiba(线段树)

    Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is ful ...

  9. poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)

    #include <iostream> using namespace std; /*248K 32MS*/ int main() { int s,d; while(cin>> ...

  10. oracle undo 复杂度--oracle核心技术读书笔记四

    一. 概述 undo 保存的是旧数据.比方,你改动了一条记录将A列abc改动为def,那么undo里面保存的就是abc.目的有两个:1. 假设你的事务没有提交,可是已经将A列改动,那么别人读取这条数据 ...