flappybird源程序设计.docx
- 文档编号:10439427
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:27
- 大小:26KB
flappybird源程序设计.docx
《flappybird源程序设计.docx》由会员分享,可在线阅读,更多相关《flappybird源程序设计.docx(27页珍藏版)》请在冰豆网上搜索。
flappybird源程序设计
四川师范大学成都学院高级语言程序课程设计
Flappybird游戏程序设计
学生姓名
彭强
学号
2012101221
所在学院
通信工程学院
专业名称
移动通信
班级
2012级移动通信方向1班
指导教师
周小丽
成绩
四川师范大学成都学院
二○一四年十二月
课程设计任务书
学生姓名
彭强
学生学号
2012101221
学生专业
通信工程
学生班级
2012级移动通信方向1班
指导教师
周小丽
职称
助教
发题日期
2014年10月20日
完成日期
2014年11月3日
设计题目
Flappybird游戏程序设计
设计目的:
1、掌握c语言编程
2、了解简单游戏设计思路及方法
3、学习用c语言编写简单程序
4、了解用c语言处理图片
具体任务及要求:
1、用c/c++完成flappybird程序设计
2、游戏包括加载、引导、开始、游戏、结束环节
3、记分牌、记录等设计
4、游戏分为白天和黑夜两个场景
课程设计进度安排:
序号
内容安排
时间
1
图片素材下载
10.20-11.3
2
大概实现框架
11.4-11.10
3
开始界面设计
11.11-11.20
4
游戏画面设计
11.21-12.1
5
结束画面设计
12.2-12.10
课程设计参考文献:
[1]仇芒仙、朱蓉:
C/C++程序设计案例教程,清华大学出版社,2012.8,P20-P100
[2]钱能等:
C++程序设计教程(第2版),北京邮电大学出版社,2005.1,P65-P77
[3]赵真、刘文:
C语言简易动画设计,陕西电子科技大学出版社,2008.4,P
201-P264
指导教
师签字
院长审核签字
Flappybird游戏程序设计
内容摘要:
flappybird是一款形式简易但难度极高的休闲游戏。
玩家需要不断控制点击屏幕的频率来调节小鸟的飞行高度和降落速度,让小鸟顺利通过画面右方的管道缝隙。
如果小鸟不小心擦碰到了管子的话,游戏便宣告结束。
本设计介绍了电脑版的该游戏的大概框架以及具体源程序代码。
关键词:
游戏设计程序
Flappybirdgameprogramming
Abstract:
Flappybirdisaformofsimplebutverycasualgames.Playersneedtokeepcontrolofthefrequencyoftheclickonthescreentoadjusttheflyingheightofthebirdsandlandingspeed,andletthebirdpipeaperturepassthepicturetotheright.Ifthebirdaccidentallybrushagainstthepipe,thegamehasended.
Thisdesignintroducedthecomputerversionofthegameaboutframeworkandspecificsourceprogramcode.
Keywords:
GameDesignProgram
Flappybird游戏程序设计
前言
《flappybird》是由来自越南的独立游戏开发者DongNguyen所开发的作品,该游戏于2013年5月上线,2014年年初迎来火爆之势。
目前,该游戏全球下载或已超过5千万次。
由于本游戏的成功受到质疑,研发者迫于压力,于2014年2月8日意外宣布游戏下线。
游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。
该程序由c-free编程软件编写,用到了网上下载的EGG库函数。
C-Free是一款支持多种编译器的C/C++集成开发环境(IDE)。
利用C-Free,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。
C-Free是一款C/C++集成开发环境(IDE)。
目前有两个版本,收费的C-Free5.0专业版和免费的C-Free4.0标准版。
C-Free中集成了C/C++代码解析器,能够实时解析代码,并且在编写的过程中给出智能的提示。
C-Free提供了对目前业界主流C/C++编译器的支持,你可以在C-Free中轻松切换编译器。
可定制的快捷键、外部工具以及外部帮助文档,使你在编写代码时得心应手。
完善的工程/工程组管理使你能够方便的管理自己的代码。
EGE[1](EasyGraphicsEngine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。
它的使用方法与TC中的graphics.h相当接近,对新手来说,简单,友好,容易上手,免费开源,而且因为接口意义直观,即使是之前完全没有接触过图形编程的,也能迅速学会基本的绘图。
目前,EGE图形库已经完美支持VC6,VC2008,VC2010,C-Free,DevCpp,Code:
:
Blocks,wxDev,EclipseforC/C++等IDE。
1图片素材下载
在编写程序之前,我们必须搜集相应的素材。
可以在网上收索,当然也可以自己画。
完整的flappybird游戏需要图片有:
背景2张(黑白场景)、小鸟、地面、上下管道以及记分牌等。
注:
为了让画面像素更高,须收集更多的运动的小鸟照片。
在我们建的主文件夹下建一个新文件夹,并命名为“依赖包”,然后将收集到的照片分类命名放在新建的依赖包下备用,具体素材如下图所示:
图1-1背景和正反管道
图1-2奖牌
图1-3小鸟
图1-4其他
2加载界面设计
此界面是游戏的引导界面,相当于是一个叫玩家等待界面。
1秒过后进入游戏主界面。
首先程序界面初始化,然后intini(void);intgame(void);intshow(void);然后获得窗口句柄HWNDhWnd=getHWnd();设置主页面的宽和高initgraph(384,512);
在Windows中,句柄是一个系统内部数据结构的引用。
例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:
你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。
实际上许多WindowsAPI函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。
换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
SetWindowText(hWnd,TEXT("Flappybird——彭强));//使用API函数修改窗口名称
最后把依赖包里的“加载”照片调到屏幕显示PIMAGEloading=newimage();getimage(loading,"依赖包\\图片\\其他\\加载.png");
3主页面设计
主页面为游戏的入口,包括上下运功的小鸟、向左运动的地面、开始按钮及分数榜等主题。
首先调用依赖包的“开始”图片,getimage(main_interface,"依赖包\\图片\\其他\\开始.png");然后用用算法实现地面和小鸟的运动(依次快速调用小鸟的三张不同照片,由于速度很快以及人的视觉停留,欺骗人的眼睛,误以为是小鸟在动,运动的地面也是如此)。
动画是通过连续播放一系列静止的画面,当连续播放达到一定的速度时,我们用肉眼看到的就是动画了。
它的基本原理与电影,电视一样,都是利用视觉原理。
医学已经证明,人的眼睛具有“视觉暂留”特性,就是人的眼睛看到一幅画面或一个物体后,在1/24秒内不会消失,利用这一视觉变化效果。
因此电影采用了每秒24幅画的速度拍摄播放,电视采用了每秒25幅(PAL制)或30幅(NSTC制)画面的速度拍摄播放,如果以每秒低于24幅画面的速度拍摄播放,就会出现停顿现象。
帧频:
即每秒播放的帧数。
帧频的大小直接影响到动画的快慢。
帧频的单位是“帧/秒”,即“fps”,flash中默认为12fps.由于计算机显示器的荧光刷新特性,实际看到的相当于24帧,刚好达到了动画的一般要求。
算法如下:
a-=2;
if(a<=0)
a=384;
putimage(0,0,main_interface);
putimage(a,448,ground);
putimage((a-384),448,ground);
b=a%128;
if(b>=0&&b<32)
putimage_withalpha(NULL,bird_m,175,220);
if(b>=32&&b<64)
putimage_withalpha(NULL,bird_u,175,216);
if(b>=64&&b<96)
putimage_withalpha(NULL,bird_m,175,220);
if(b>=96&&b<=128)
putimage_withalpha(NULL,bird_d,175,224);
如果喜欢的话还可以在屏幕上打印自己的名字,如xyprintf(120,480,"彭强制作四川师范大学成都学院");其中120,480为界面坐标。
4游戏界面设计
游戏界面为该游戏的设计难点,包括动画、碰撞检测等等。
分为游戏前界面、游戏中界面、以及结束界面。
4.1游戏前界面
此界面与主页面相似,但没有开始按钮,在界面右边多了2根管道,程序现在就检测玩家是否在游戏界面内点击了鼠标,如果是,那么就进入了游戏中界面。
if((shijian-b)>1&&keystate(VK_LBUTTON))
{
v=-180;
b=shijian;
}
此时玩家已经真正进入游戏,随着玩家点击鼠标的频率小鸟高度不断发生变化,让小鸟不至于撞到柱子上和调到地上。
4.2游戏中界面
首先管道依次向左运动,让人误以为是小鸟在向右运动。
这里用到随机函数zhuzi[c].h=(random(200))+200;
检测用户鼠标算法:
if((shijian-b)>1&&keystate(VK_LBUTTON))
{
v=-180;
b=shijian;
}
柱子移动的算法:
for(c=0;c<3;c++)
{
zhuzi[c].x-=2;
if(zhuzi[c].x<=-70)
zhuzi[c].x=650;
if(zhuzi[c].x==512)
{
zhuzi[c].h=(random(200))+200;
4.3游戏结束界面
该步骤包括碰撞和落地的算法设计、分数显示、是否重来等小模块。
碰撞判断、显示分数的算法为:
if(zhuzi[0].x>=35&&zhuzi[0].x<=135&&(zhuzi[0].h<(bird_h+27)||(zhuzi[0].h-155)>bird_h))
break;
if(zhuzi[1].x>=35&&zhuzi[1].x<=135&&(zhuzi[1].h<(bird_h+27)||(zhuzi[1].h-155)>bird_h))
break;
if(zhuzi[2].x>=35&&zhuzi[2].x<=135&&(zhuzi[2].h<(bird_h+27)||(zhuzi[2].h-155)>bird_h))
break;
if(bird_h>415)
break;
setcolor(WHITE);
setfont(-50,0,"幼圆");
xyprintf(180,40,"%d",point);
如果发生了碰撞或者落地,那么游戏结束,向屏幕弹出游戏结束和重来画面、显示分数、以及分数榜。
碰撞后鸟向下落,直到掉到地上。
putimage_withalpha(NULL,bird_middle__90,100,bird_h);
if(a>=4&&a<8)
putimage_withalpha(NULL,bird_up__90,100,bird_h);
if(a>=8&&a<12)
putimage_withalpha(NULL,bird_middle__90,100,bird_h);
if(a>=12&&a<16)
putimage_withalpha(NULL,bird_down__90,100,bird_h);
a=shijian%16;
if(a>=0&&a<4)
putimage_withalpha(NULL,bird_middle__90,100,bird_h);
if(a>=4&&a<8)
putimage_withalpha(NULL,bird_up__90,100,bird_h);
if(a>=8&&a<12)
putimage_withalpha(NULL,bird_middle__90,100,bird_h);
if(a>=12&&a<16)
putimage_withalpha(NULL,bird_down__90,100,bird_h);
v+=9.8;
bird_h+=((v*2)/77);
delay_fps(60);
if(bird_h>430)
break;
}
然后根据分数算出奖牌类型,从txt文件中读出记录,并向屏幕输出。
Txt是我们用来记录最高记录的文本,具体程序如下:
putimage_withalpha(NULL,gameover,55,60);
delay_ms(300);
putimage_withalpha(NULL,jifenpai,35,150);
delay_ms(300);
putimage_withalpha(NULL,again,35,350);
putimage_withalpha(NULL,paihangbang,200,350);
if(point>=10&&point<20)
putimage(67,200,tong);
if(point>=20&&point<30)
putimage(67,200,yin);
if(point>=30&&point<40)
putimage(67,200,gold);
if(point>=40)
putimage(67,200,bai);
setfont(-25,0,"幼圆");
xyprintf(270,195,"%d",point);
fp=fopen("依赖包\\记录.txt","r");
fscanf(fp,"%d",&point_jilu);
fclose(fp);
if(point>point_jilu)
point_jilu=point;
fp=fopen("依赖包\\记录.txt","w");
fprintf(fp,"%d",point_jilu);
fclose(fp);
xyprintf(270,260,"%d",point_jilu);
PIMAGEground=newimage();
PIMAGEcourse_up=newimage();
PIMAGEcourse_down=newimage();
PIMAGEcourse_middle=newimage();
PIMAGEzhuzi_z=newimage();
PIMAGEzhuzi_f=newimage();
PIMAGEgameover=newimage();
PIMAGEjifenpai=newimage();
PIMAGEagain=newimage();
PIMAGEpaihangbang=newimage();
PIMAGEtong=newimage();
PIMAGEyin=newimage();
PIMAGEgold=newimage();
PIMAGEbai=newimage();
如果玩家点击了重来按钮,游戏又重新开始。
就构成了一个循环,小鸟碰撞后,玩家不想玩了,点击结束就可以结束游戏。
至此,游戏大概框架已经搭建好了,然后加上EGG库,补全程序,最后调试修改就可以了。
5各步骤图片
图5-1加载和开始界面
图5-2游戏运行和小鸟落地
6结束语
在设计中遇到了很多编程问题,最后在周老师的辛勤指导下,终于迎刃而解。
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
经过近两个月的学习,使我对c语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我知道学好计算机要重视实践操作,不仅仅是学习c语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好各门课程。
通过课程设计,普遍感到自己应用基础知识及专业知识解决问题的能力有了很大的提高,以前所学的许多课程觉得很零散,也不知道有什么用及怎么用,现在也都找到了用武之地。
同时,我也学到了在许多书本上不可能收录的东西。
例如一些设计的具体的规范,和一些设计的要求。
如何把规范里的明文规定运用到实际上去,以及运用过程中的把握上。
也学到了如何独立思考,如何自己查阅资料,如何与人相处融洽等实际经验。
今后走上社会,我主要还是靠在学校学到的知识技能来养活自己,并回报社会,回报父母,我也了解到了自己的很多不足,在今后的工作与学习中,我会不断的提高与改进。
附录
#include
#include
intini(void);
intgame(void);
intshow(void);
intini(void)
{
intx,y,a=0,b;
initgraph(384,512);
randomize();
setbkmode(TRANSPARENT);
HWNDhWnd=getHWnd();//获得窗口句柄
SetWindowText(hWnd,TEXT("Flappybird——彭强));//使用API函数修改窗口名称
PIMAGEloading=newimage();
getimage(loading,"依赖包\\图片\\其他\\加载.png");
putimage(0,0,loading);
delay_ms(500);
delimage(loading);
PIMAGEmain_interface=newimage();
getimage(main_interface,"依赖包\\图片\\其他\\开始.png");
PIMAGEground=newimage();
getimage(ground,"依赖包\\图片\\背景\\地.png");
PIMAGEbird_u=newimage();
PIMAGEbird_m=newimage();
PIMAGEbird_d=newimage();
getimage(bird_u,"依赖包\\图片\\鸟\\上0.png");
getimage(bird_m,"依赖包\\图片\\鸟\\中0.png");
getimage(bird_d,"依赖包\\图片\\鸟\\下0.png");
while
(1)
{
a-=2;
if(a<=0)
a=384;
putimage(0,0,main_interface);
putimage(a,448,ground);
putimage((a-384),448,ground);
b=a%128;
if(b>=0&&b<32)
putimage_withalpha(NULL,bird_m,175,220);
if(b>=32&&b<64)
putimage_withalpha(NULL,bird_u,175,216);
if(b>=64&&b<96)
putimage_withalpha(NULL,bird_m,175,220);
if(b>=96&&b<=128)
putimage_withalpha(NULL,bird_d,175,224);
setcolor(WHITE);
xyprintf(120,480,"彭强制作四川师范大学成都学院");
if(keystate(VK_LBUTTON))
{
mousepos(&x,&y);
if(x>10&&x<170&&y>350&&y<450)break;
}
delay_fps(77);
cleardevice();
}
delimage(main_interface);
delimage(ground);
delimage(bird_u);
delimage(bird_m);
delimage(bird_d);
}
intgame(void)
{
intbird_h=250;
intshijian=0;
inta=0,b=0,c=0,point=0;
intv=0;
FILE*fp;
intpoint_jilu;
intx,y;
structzhangai
{
intx;
inth;
}zhuzi[3];
PIMAGEbk=newimage();
PIMAGEbird_up_20=newimage();
PIMAGEbird_middle_20=newimage();
PIMAGEbird_down_20=newimage();
PIMAGEbird_up_0=newimage();
PIMAGEbird_middle_0=newimage();
PIMAGEbird_down_0=new
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- flappybird 源程序 设计