C# · 12月 20, 2021

C语言版flappy bird黑白框游戏

      在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小游戏—-flappy bird。代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了!

      代码的完美度肯定是不够的,随手编的嘛,找完bug后就没再去想怎样优化它了,毕竟时间有限。

     先说下它的设计思路吧,算法方面,基本是纯靠for if 语句加上纯粹的坐标x,y运算实现的,在下面的代码里,将会看到很多阿拉伯数字的加加减减。没有用到链表什么的,当然,我相信,如果用到链表的话,会更简单,代码量更少。引用到的函数库有四个:

#include #include #include #include

宏定义 :define一些标识图形,p为烟囱的组成单位方块,“ “为消除方块时用到的输出空白,-是界面美化,”鸟“是游戏体

P printf(“■”) PR printf(” “) Q printf(“-“) Br printf(“鸟”)

定义结构体,就一个鸟的结构体,以及一条最重要的函数—-句柄的初始化。

typedef score; Position( x, y) { COORD pos = x – ,y – HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos); }

下面是一些辅助函数,加上注释,这里再作介绍。由于函数名字基本是中文字的评语,这个之所以这样做,还是上面的原因,想改,可以自己改。

jiemian(),这个函数的作用的在特定的位置输出”——–“,美化界面用的,置于为什么for循环里面我设置的i<103呢,是因为控制台的宽度大概是103像素,所以,设置每一像素输出一个Q 即 – ,Position函数就是把特定此时的坐标; jiemian1(),不作解释,相信看得明白; feixing(…)鸟的飞行函数,思想很简单,先选择好一个坐标位置,显示出鸟,再停顿一段时间在相同的位置输出空白,达到非按键up操作时的下降目的; fenshuYUnandu(…),分数函数,显示分数; check1(…),检查烟囱外是否撞墙函数,这里要仔细看了,否则你会很难读懂!d 数组分别存储两烟囱之间的间距15~16像素, e 数组用来存储每条烟囱移动到与鸟的x坐标相同时的固定距离,i数组是传进来的烟囱移动的坐标变化,e-i-t是用来判断烟囱移动的时候,何时与鸟x相同,到这里,可能你有疑问了,为什么不直接判断烟囱的x和鸟的x重合,因为烟囱是动态的,同时它们还有距离限制,如果不加以限制就会乱,烟囱不是一条在往左边移动,是5条,0~4,如果相等,进入第一个if语句,进行第二次判断,判断此时鸟的y坐标是否是烟筒的入口y,如果是,则不报错,如果不是,证明撞墙了,最后的一个if语句是判断上下边界的撞墙; check(…),烟囱入口撞墙判断,这条较上条较复杂,因为烟囱的入口是有两列像素方块组成的,就是说,判断的时候要判断两列的方块。模仿上面,b c 数组分别是左列和右列的烟囱间距值,剩下的步骤就是判断入口内鸟的x是否与烟囱的x相同; 下面的一条最重要的函数,烟囱的制造、移动函数。 jiemian() i= (;i<;i++ Position(i-,); (i== (i=;i<;i++ Position(i-,); printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( printf( system( feixing(brid B, y) Position(B.x,B.y);Br; Sleep(); Position(B.x,B.y);PR; fenshuYUnandu(brid B, i[], o[]) Position(,); printf( check(brid B, o[], temp) t,d[],e[ d[]=;d[]=;d[]=;d[]=,d[]= e[]=;e[]=;e[]=;e[]=;e[]= (t=;t=||B.y<= printf();system( check1(brid B, temp) k,f,b[],c[],q[ q[]=,q[]=,q[]= b[]=;b[]=;b[]=;b[]=,b[]=; c[]=;c[]=,c[]=,c[]=,c[]=; ( f=;f=o[k]+temp- Position(B.x,B.y+ printf();system( } } fangkuai(brid B, i[],o[],f[],temp=; srand(()time(NULL)); o[]=rand()%+;o[]=rand()%+;o[]=rand()%+ o[]=rand()%+;o[]=rand()%+; f[]=;f[]=;f[]=;f[]=,f[]= (i[]=,i[]=,i[]=,i[]=,i[]=;i[]< i[]<,i[]<,i[]<,i[]<; i[]++,i[]++,i[]++,i[]++,i[]++,B.y++ ( k=;k<=o[];k++ Position(-i[],k);P;} ( k=;k ( k=;k<=o[];k++){ Position(-i[]+ ( k=;k<=-o[]-temp;k++ Position(-i[]+,-k);P; (i[]==){ ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k<=-o[]-temp;k++ Position(-i[]+,- (i[]== ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k<=-o[]-temp;k++ Position(-i[]+,- (i[]== ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k<=-o[]-temp;k++ Position(-i[]+,- (i[]== ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k ( k=;k<=o[];k++ Position(-i[]+ ( k=;k<=-o[]-temp;k++ Position(-i[]+,- (i[]== ( k=;k B.y=B.y- 0) ( k=;k<=;k++ (B.x==-i[k]+ {B.score++;} (B.score%==&&B.x==-i[]+) temp– }

最后的main函数

B.x=;B.y=;B.score=; x=,y=; system( }

效果图片: