概述 在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小
游戏----flappy bird。代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了! 代码的完美度肯定是不够的,随手编的嘛,找完bug后就没再去想怎样优化它了,毕竟时间有限。 先说下它的设计思路吧,算法方面,基本是纯靠for if 语句加上纯粹的坐标x,y运算实现的,在下面的代码里,将会看到很多阿拉伯数字的加加减减。没有用到链表什么的,当然,我相信,如果用到链表的话,会更简单,代码量更少。引用到的函数库有四个:1 #include<stdio.h>2 #include<Windows.h>//win3 #include <time.h>4 #include<stdlib.h>宏定义 :define一些标识图形,p为烟囱的组成单位方块,“ “为消除方块时用到的输出空白,-是界面美化,”鸟“是游戏体1 #define P printf("■")2 #define PR printf(" ")3 #define Q printf("-")4 #define Br printf("鸟")定义结构体,就一个鸟的结构体,以及一条最重要的函数----句柄的初始化。1 typedef struct brid2 {3 double x,y;4 int score;//分数5 };6 /*typedef struct Fangkuai7 {8 double x,y;9 };*/ //此结构体废除10 void Position(double x, double y) {//光标(坐标)函数11 COORD pos = {12 x - 1, y - 113 };14 HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);//创建句柄15 SetConsoleCursorPosition(Out, pos);//将句柄指向坐标,变为坐标句柄16 }下面是一些辅助函数,加上注释,这里再作介绍。由于函数名字基本是中文字的评语,这个之所以这样做,还是上面的原因,想改,可以自己改。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相同;下面的一条最重要的函数,烟囱的制造、移动函数。1 void jiemian()//界面函数2 {3 int i=23;4 for(;i<103;i++)5 {6 Position(i-22,1.5);//上边7 Q;8 }9 if(i==103)10 {11 for(i=23;i<103;i++)12 {13 Position(i-22,24);//下边14 Q;15 }16 }17 }18 void jiemian1() {19 printf("____________________________________________________________________________n");20 printf(" ■n");21 printf(" ■n");22 printf(" ■C语言非链表版:Flappy Birdn");23 printf(" ■编写人:LinGuanHn");24 printf(" ■日期:2014.7.30n");25 printf(" ■耗时:4小时37分n");26 printf(" ■游戏说明:n");27 printf(" ■1-按键盘中的上箭头使鸟起飞n");28 printf(" ■2-分数每过20,难度增大,烟囱入口减小!n");29 printf(" ■3-光标显示方式为中文鸟字n");30 printf(" ■4-介于VS中graphics.h函数库使用失败,导致原图插入不了,所用转用
黑白框。n");31 printf(" ■5-撞墙失败,游戏会提示输了,但是不会return 0,你可以继续按方向键接着玩。n");32 printf(" ■n");33 printf(" ■n");34 printf(" ■n");35 printf(" ■代码内带有注释,感兴趣的可以直接修改,增加其他效果n");36 printf(" ■必然存在bug,找到了麻烦跟我说声,谢谢。n");37 printf(" ■请按键盘的任意一个键继续。n");38 printf(" ■n");39 printf(" ■n");40 printf(" ■n");41 printf(" ____________________________________________________________________________n");42 system("pause");43 }44 /*void cleanjudge(int i)45 {46 if(i==77)47 {48 for(int i=1;i<6;i++)49 {50 Position(2,i);51 PR;52 Position(4,i);53 PR;54 }55 }56 }*/ //清屏函数作废57 void feixing(brid B,int y)//鸟飞行坐标函数58 {59 Position(B.x,B.y);Br;//创建鸟60 Sleep(200);//停顿0.2秒再下掉,也是难度的改变方法。61 Position(B.x,B.y);PR;//清除鸟62 //return 0;63 }64 void fenshuYUnandu(brid B,int i[],int o[])//显示分数函数65 {66 Position(38,25);//固定分数显示位置67 printf("分数为:%d",B.score);6869 }70 void check(brid B,int i[],int o[],int temp)//检查非入口撞墙函数71 {72 int t,d[5],e[5];73 d[0]=0;d[1]=16;d[2]=31;d[3]=46,d[4]=61;74 e[0]=78;e[1]=77;e[2]=77;e[3]=77;e[4]=77;75 for(t=0;t<=4;t++)76 {77 if(B.x==e[t]-i[t]+d[t]){78 if(B.y<=o[t]+6-temp||B.y>=o[t]+temp-1){79 Position(B.x,B.y);Br;printf("n");Position(B.x,B.y+1);80 printf("Lost the game!n");system("pause");81 }82 }83 if(B.y>=24||B.y<=1.5){84 printf("Lost the game!n");system("pause");85 }86 }87 }88 void check1(brid B,int i[],int o[],int temp)//检查入口内撞墙函数89 {90 int k,f,b[5],c[5],q[3];91 q[0]=77,q[1]=78,q[2]=76;92 b[0]=0;b[1]=16;b[2]=31;b[3]=46,b[4]=61;//b为左93 c[0]=2;c[1]=18,c[2]=33,c[3]=48,c[4]=63; //C为右94 for(int f=0;f<3;f++){95 for(k=0;k<=4;k++)96 {97 if((B.x-f==q[f]-i[k]+b[k]&&B.y==o[k]+6-temp)||(B.x-f==q[f]-i[k]+c[k]&&B.y==o[k]+6-temp)){98 Position(B.x,B.y);Br;printf("n");Position(B.x,B.y+1);99 printf("Lost the game!n");system("pause");100 }101 if((B.x-f==q[f]-i[k]+b[k]&&B.y>=o[k]+temp-1)||(B.x-f==q[f]-i[k]+c[k]&&B.y>=o[k]+temp-1)){102 Position(B.x,B.y);Br;printf("n");Position(B.x,B.y+1);103 printf("Lost
在此记录下本人在大一暑假,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(