1. // ConsoleApplication4.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<conio.h>
  8. #include<time.h>
  9. #include<Windows.h>
  10. /********函数变量声明********/
  11. #define PR_Box printf("■")
  12. #define PR_Gold printf("★")
  13. #define PR_Ag printf("☆")
  14. #define PR_FBird printf("Ю")
  15. #define PR_DBird printf("Ф")
  16. #define PR_Land printf("┳┳┯")
  17. #define PR_Bg_TL printf("╔")
  18. #define PR_Bg_TR printf("╗")
  19. #define PR_Bg_DL printf("╚")
  20. #define PR_Bg_DR printf("╝")
  21. #define PR_Bg_X printf("═")
  22. #define PR_Bg_Y printf("║")
  23. #define PR_Blank printf(" ");
  24. int Grade = , C_Gold = , C_Ag = , Score = , Delay_time = , Max_blank = , Distance = ;
  25. //Grade 游戏等级
  26. //Score 分数
  27. //Max_blank 上下两个烟囱之间的最大距离
  28. //Distance 左右两个烟囱之间的距离
  29. struct Birds//小鸟的结构体
  30. {
  31. int x, y;//小鸟的位置
  32. int condition;//此变量未用
  33. };
  34. Birds *Bird = (Birds*)malloc(sizeof(Birds));//给小鸟指针分配空间
  35. struct Bg//烟囱的结构体--循环双向链表
  36. {
  37. int x, y;//上烟囱的左下角砖块的坐标
  38. int l_blank;//上相两个烟囱之间的距离
  39. int reward[];
  40. Bg *pri;//前指针-指向前一个结点
  41. Bg *next;//后指针-指向后一个结点
  42. };
  43. Bg *Bg1 = new Bg[sizeof(Bg)];//将一个烟囱结点设置成全局变量
  44. void Position(int x, int y)//将光标移动到X,Y坐标处
  45. {
  46. COORD pos = { x - , y - };
  47. HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
  48. SetConsoleCursorPosition(Out, pos);
  49. }
  50. void CreatBird()//创建小鸟
  51. {
  52. Bird->x = ;//小鸟的坐标
  53. Bird->y = ;
  54. Bird->condition = ;
  55. }
  56. void CreatBg()//创建数据结构为循环双向链表的烟囱
  57. {
  58. Bg *Bg2 = (Bg*)malloc(sizeof(Bg));
  59.  
  60. Bg1->x = ; Bg1->y = ;
  61. Bg2->x = Bg1->x + Distance; Bg2->y = ;
  62.  
  63. Bg1->l_blank = Max_blank - Grade;
  64. Bg2->l_blank = Max_blank - Grade;
  65.  
  66. Bg1->next = Bg2;
  67. Bg1->pri = Bg2;
  68. Bg2->next = Bg1;
  69. Bg2->pri = Bg1;
  70. }
  71. void InsertBg(Bg *p)//创建一个结点插入到传入结点之前。循环双向链表的插入
  72. {
  73. int temp;
  74. Bg *Bgs = (Bg*)malloc(sizeof(Bg));
  75. Bgs->x = p->pri->x + Distance;
  76. Bgs->l_blank = Max_blank - Grade;
  77. srand((int)time());//将系统时间作为产生随机数的种子
  78. temp = rand();//产生随机数
  79. if (temp % == )//当随机数%==2时,烟囱口向下移动
  80. {
  81. if ((temp % + p->pri->y + Max_blank - Grade)<)//检测是否存在向下移动的可行性
  82. Bgs->y = p->pri->y + temp % ;//若有则向下移动temp%4个单位
  83. else
  84. Bgs->y = p->pri->y;//若无,则不动
  85. }
  86. else//反之亦然
  87. {
  88. if ((p->pri->y - temp % )>)
  89. Bgs->y = p->pri->y - temp % ;
  90. else
  91. Bgs->y = p->pri->y;
  92. }
  93.  
  94. Bgs->pri = p->pri;//循环链表指向
  95. Bgs->next = p;
  96. p->pri->next = Bgs;
  97. p->pri = Bgs;
  98. }
  99. void Check_Bg(Bg *q)//检查是否有烟囱超出屏幕,若有超出,则移动到屏幕右侧。
  100. {
  101. Bg *p = q; int i = , temp;
  102. while (++i <= )//注意烟囱只有5个,时来回循环移动的
  103. {
  104. if (p->x>-)//若有烟囱超出
  105. p = p->next;
  106. else
  107. {
  108. srand((int)time());
  109. temp = rand();
  110. if (temp % == )//++
  111. {
  112. if ((temp % + p->y + Max_blank - Grade)<)
  113. p->y = p->y + temp % ;
  114. else
  115. p->y = p->y;
  116. p->x = p->pri->x + Distance;//将烟囱移动到前一结点的右侧+Distance的单位
  117. p->l_blank = Max_blank - Grade;//计算上下两个烟囱的距离
  118. }
  119. else//反之亦然
  120. {
  121. if ((p->y - temp % )>)
  122. p->y = p->y - temp % ;
  123. else
  124. p->y = p->y;
  125. p->x = p->pri->x + Distance;
  126. p->l_blank = Max_blank - Grade;
  127. }
  128. }
  129.  
  130. }
  131.  
  132. }
  133. void Loop_Bg(Bg *q)//烟囱单向循环移动
  134. {
  135. Bg *p = q; int i = ;
  136. while (++i <= )
  137. {
  138. p->x = p->x - ;
  139. p = p->next;
  140. if (Bird->x == p->x)//每经过一个烟囱,加一分
  141. {
  142. Score += ;
  143. if (Score % == && Grade<)//烟囱
  144. Grade++;
  145. }
  146. }
  147. }
  148. void Prt_Bg(Bg *q)//画烟囱----较冗余的代码
  149. {
  150. Bg *p = q; int i = , k, j;
  151. while (++i <= )
  152. {
  153. if (p->x> && p->x <= )
  154. {
  155. for (k = ; k<p->y; k++)//画出上烟囱上半部分
  156. {
  157. Position(p->x + , k);
  158. PR_Box; PR_Box; PR_Blank;//输出两个格子,输出空格,清除原来余影
  159. }
  160. Position(p->x, p->y);//画出上烟囱下半部分
  161. PR_Box; PR_Box; PR_Box; PR_Blank;//输出三个格子,输出空格,清除原来余影
  162. Position(p->x, p->y + p->l_blank);//画出下烟囱上半部分
  163. PR_Box; PR_Box; PR_Box; PR_Blank;//输出三个格子,输出空格,清除原来余影
  164. k = k + p->l_blank + ;
  165. for (k; k <= ; k++)//画出下烟囱下半部分
  166. {
  167. Position(p->x + , k);
  168. PR_Box; PR_Box; PR_Blank;//输出两个格子,输出空格,清除原来余影
  169. }
  170. Position(p->x, );//输出地下的线
  171. for (k = ; k<Distance / - ; k++)
  172. PR_Land;
  173.  
  174. }
  175. p = p->next;
  176. if (p->x == )
  177. {
  178. for (j = ; j<p->y; j++)
  179. {
  180. Position(p->x + , j);
  181. PR_Blank; PR_Blank;
  182. }
  183. Position(p->x + , p->y);
  184. PR_Blank; PR_Blank; PR_Blank;
  185. Position(p->x + , p->y + Max_blank - Grade);
  186. PR_Blank; PR_Blank; PR_Blank;
  187. j = j + Max_blank - Grade + ;
  188. for (j; j <= ; j++)
  189. {
  190. Position(p->x + , j);
  191. PR_Blank; PR_Blank;
  192. }
  193. }
  194. }
  195.  
  196. }
  197.  
  198. void PrtBg()//画上下两条线
  199. {
  200. int i;
  201. Position(, ); PR_Bg_TL;
  202. Position(, ); PR_Bg_TR;
  203. Position(, ); PR_Bg_DL;
  204. Position(, ); PR_Bg_DR;
  205. for (i = ; i <= ; i += )
  206. {
  207. Position(i, ); PR_Bg_X;
  208. Position(i, ); PR_Bg_X;
  209. }
  210. /*for(i=2;i<=23;i++)
  211. { Position(1,i);PR_Bg_Y;printf("%d",i-1);
  212. Position(79,i);PR_Bg_Y;
  213. }*/
  214. }
  215. void PrtBird()//画鸟
  216. {
  217. Position(Bird->x, Bird->y - );//清除原来屏幕上面的鸟
  218. PR_Blank;
  219. Position(Bird->x, Bird->y);//画新鸟
  220. PR_FBird;
  221. Position(, );
  222. printf("Score:%d", Score);//输出得分
  223. }
  224. int CheckYN(Bg *q)//检查是否撞壁
  225. {
  226. Bg *p = q; int i = ;
  227. while (++i <= )
  228. {
  229. if (Bird->y>)//鸟是否落地
  230. return ;
  231. if (Bird->x == p->x&&Bird->y <= p->y)//是否撞到上烟囱左侧
  232. return ;
  233. if ((Bird->x == p->x || Bird->x == p->x + || Bird->x == p->x + ) && Bird->y == p->y)//是否撞到上烟囱下侧
  234. return ;
  235. if (Bird->x == p->x&&Bird->y>p->y + p->l_blank)//是否撞到下烟囱左侧
  236. return ;
  237. if ((Bird->x == p->x || Bird->x == p->x + || Bird->x == p->x + ) && Bird->y == p->y + p->l_blank)//是否撞到上烟囱上侧
  238. return ;
  239. p = p->next;
  240. }
  241. return ;
  242. }
  243. void Prtfirst()
  244. {
  245. printf("══════════════════════════════════════\n");
  246. printf(" ■■ ■■\n");
  247. printf(" ■■ ■■\n");
  248. printf(" ■■ ■■ C语言版 Flappy Bird\n");
  249. printf(" ■■ ■■ 瞎搞人:yyposs\n");
  250. printf(" ■■ ■■ 瞎搞日期:2014.2\n");
  251. printf(" ■■ ■■ 耗时:4小时\n");
  252. printf(" ■■■ ■■ 游戏说明:\n");
  253. printf(" ■■ 1-按上箭头使鸟起飞\n");
  254. printf(" ■■ 2-等级越高,难度越大!\n");
  255. printf(" Ю ■■■\n");
  256. printf("\n");
  257. printf(" ■■■ 欢迎各路大神与我探讨C、C++、VB、PHP、C#\n");
  258. printf(" ■■\n");
  259. printf(" ■■\n");
  260. printf(" ■■ ■■■ 【无版权,随意修改】\n");
  261. printf(" ■■ ■■\n");
  262. printf(" ■■ Ф ■■\n");
  263. printf(" ■■ ■■\n");
  264. printf(" ■■ ■■\n");
  265. printf(" ■■ ■■\n");
  266. printf(" ■■ ■■\n");
  267. printf(" ┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳\n");
  268. system("pause");
  269. Position(, );
  270. int i = ;
  271. while (i++< * )
  272. PR_Blank;
  273. }
  274. void main()
  275. {
  276. int i = ; char ch;
  277. Prtfirst();//开始屏幕
  278.  
  279. PrtBg();//画上下两边的框框
  280. CreatBg();//创建循环双向链表烟囱
  281. InsertBg(Bg1);//给循环双向链表中插入一个烟囱结点
  282. InsertBg(Bg1);//给循环双向链表中插入一个烟囱结点
  283. InsertBg(Bg1);//给循环双向链表中插入一个烟囱结点
  284. CreatBird();//创造小鸟
  285. while ()
  286. {
  287. if (!CheckYN(Bg1))//检查鸟是否碰壁
  288. break;//若碰壁,则退出
  289. Check_Bg(Bg1);//检查是否有烟囱X坐标<0
  290. Prt_Bg(Bg1);//画背景烟囱
  291. PrtBird();//画小鸟
  292. Loop_Bg(Bg1);//背景烟囱单项循环
  293. Bird->y = Bird->y + ;
  294. if (GetAsyncKeyState(VK_UP))//检测是否有按键
  295. {
  296. Position(Bird->x, Bird->y - );
  297. PR_Blank;//在屏幕上清除原小鸟
  298. Bird->y = Bird->y - ;//鸟的位置上升4个长度
  299. }
  300. while (i++<);
  301. { Sleep();
  302. }
  303. i = ;
  304. }
  305. Position(, );
  306. printf("You Lost!");
  307. Position(, );
  308. system("pause");
  309.  
  310. }
  311. // 1 2 3 4 5 6 7 8 10 15 20 25 30 35 38
  312. //══════════════════════════════════════
  313. //1 ■■ ■■
  314. //2 ■■ ■■
  315. //3 ■■ ■■
  316. //4 ■■ ■■
  317. //5 ■■ ■■
  318. //6 ■■ ■■
  319. //7 ■■■ ■■
  320. //8 ■■
  321. //9 ■■
  322. //10 Ю ■■■
  323. //11
  324. //12 ■■■
  325. //13 ■■
  326. //14 ■■
  327. //15 ■■ ■■■
  328. //16 ■■ ■■
  329. //17 ■■ Ф ■■
  330. //18 ■■ ■■
  331. //19 ■■ ■■
  332. //20 ■■ ■■
  333. //21 ■■ ■■
  334. //22┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳
  335. //══════════════════════════════════════

C语言_愤怒的小鸟的更多相关文章

  1. 怎样让Oracle支持中文? 语言_地域.字符集

    暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区  作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...

  2. c语言_常见图片格式判断

    c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...

  3. BZOJ_1212_[HNOI2004]L语言_哈希

    BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...

  4. 选择排序_C语言_数组

    选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...

  5. 插入排序_C语言_数组

    插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...

  6. 快速排序_C语言_数组

    快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...

  7. 冒泡排序_C语言_数组

    冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...

  8. 3.1 C语言_实现AVL平衡二叉树

    [序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ...

  9. 2.2 C语言_实现数据容器vector(排序功能)

    上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...

随机推荐

  1. bison实例

    逆波兰记号计算器[文件名rpcalc.y]%{ #define YYSTYPE double #include <stdio.h> #include <math.h> #inc ...

  2. 绿色astah简体中文版6.8

    astah是一个UML建模的好工具,绿化后,现在开始将它汉化. 欢迎大家提出汉化翻译不当的地方,在本帖子留言. 需要汉化的内容较多,我会逐渐发布汉化更完全的版本. 说明:astah6.8需要使用jre ...

  3. sql 关于dblink和多条update、insert事务回滚写法

    在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句.那么就会用到tran. 如果我们在不写try的情况下就要对每个insert,u ...

  4. [CSS备忘]多行文本省略号

    overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box ...

  5. EconomicIndoor集成测试

    加密时序列号相同引发的呼叫功能异常 现象描述: 配置完房间号一次性呼叫问题 问题描述: 两台室内机升级后配置到同一门口机, 各种配置正确. 作为主叫呼不出去, 作为被叫可以接听, 每修改一次房间号, ...

  6. Node.js:常用工具util

    概要:本篇博客的主要内容是介绍node.js的常用工具util. 1.util.inherits util.inherits(constructor,superConstructor)是一个实现对象间 ...

  7. Glusterfs[转]

    原文地址:http://support.huawei.com/ecommunity/bbs/10253434.html 1.      GlusterFS概述 GlusterFS是Scale-Out存 ...

  8. 【Sort】插入排序

    今晚更新几个排序算法 插入排序,时间复杂度O(n^2),从前往后遍历,每遍历到一个值的时候,其前面的所有值已经完成排序,把这个值插入适当位置 void intersort(int *nums,int ...

  9. Angular2,React集成

    https://www.packtpub.com/books/content/integrating-angular-2-react http://www.syntaxsuccess.com/view ...

  10. art中的部分内容,留着慢慢研究

    root@hbg:/tmp# cat /proc/mtddev:    size   erasesize  namemtd0: 00040000 00010000 "u-boot" ...