C语言高级demo Flappy Bird游戏

3 篇文章 0 订阅
订阅专栏

导语

这是C语言高级demo。用C语言实现Flappy Bird这款经典的游戏,最终的效果要达到与原著有一定的相似度。示意图如下:(完整的代码在结语部分)
示意图
本demo的要求有:

  1. 游戏画面精美,尽力达到原汁原味。
  2. 在游戏中没有图像的闪烁,画质良好且稳定。
  3. 对游戏的数据以文件形式储存。
  4. 实现积分。
  5. 游戏有玩法提示,良好的交互。
  6. 合适的音效。

序章

首先介绍我用到了那些技术。

  1. C语言
  2. EasyX图形库。EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程。它的内部调用Windows API 兼容性良好,对新手友好,使用简单,支持鼠标,批量绘图技术,支持真彩色。在项目开发中熟练使用图像库中对图片操作的函数,理解批量绘图函数并运用
  3. Window.h中的一些函数的使用:
    • 键盘处理函数GetAsyncKeyState(),它是一个用来判断函数调用时指定虚拟键的状态,确定用户当前是否按下了键盘上的一个键的函数。如果按下,则返回值最高位为1;
    • mciSendString(),它是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等。

总的来说,运用的技术没有太多,但是我在实际编码时发现了不少问题,比如图片的黑边如何处理,按键灵敏度等,在后面我会解释如何处理它们的。

游戏总体设计

游戏流程图

游戏流程图
(并不标准的流程图,但基本额能够表达清楚整个游戏的运行过程)

游戏中数据与函数介绍

以下内容全部定义在一个头文件中:FB_headfile.h

  1. 一, bird数据
struct Bird
{
	int birdhigh;
	int birdpicture;
	int number;
	float flow;
	float up;	
};
  1. 游戏中的图片数据
typedef struct Picture
{
	IMAGE birdpt[3][2];//bird图片
	IMAGE bandpt[5][2];//障碍物图片
	IMAGE backgroundpt;//背景图片
	IMAGE landpt;//下方可以移动土地
	IMAGE big_num[10][2];//大号的数字
	IMAGE mid_num[10][2];//中号数字
	IMAGE sm_num[10];//小号数字
	IMAGE gametitle[2];//游戏的标题
	IMAGE getready[2];//准备阶段标题
	/*所有的按钮和得分面板 
		0:button_play; 1:button_score; 
		2:tutorial.jpg; 3;score_panel*/
	IMAGE button[4][2];
	IMAGE copyright[2];//开始界面的版权文字
	IMAGE medals[4][2];//奖牌
	IMAGE gameover[2];//游戏结束
	IMAGE newscore;//最新的高分
};
  1. 游戏其他数据
typedef struct Data
{
	int landdata;//下方移动土地
	//障碍物 0是障碍物的x坐标,1是上障碍物的y坐标 2是下方障碍物y坐标
	int banddata[5][3];
	int nowscore;//本次得分
	int speed;//移动速度
	int oldscore[3];//0第一,1第二,2第三
	int scoreblock;//分数锁
	bool life;//bird是否存活
	Bird bird;//bird数据
};
  1. 用到的函数
void initdata(Data &data);//初始化游戏数据
void birdct(Data &data);// bird控制
bool play();//开始游戏
void databack(Data &data);//数据处理
void gamestartmenu(Picture picture, Data data);//绘制开始界面
void getread(Picture picture,Data data);//绘制getready界面
void picturedeal(Picture &picture,int n);//游戏图片处理(加载与旋转) n=1 是加载图片
void drowpicture(Picture picture, Data data);//绘制游戏内容
void collision(Data &data);//碰撞
void scorepanl(Picture picture,Data &data);//得分面板
void changeband(Data &data, int n);//改变障碍物的Y轴数据
using namespace std;

游戏实现

开始界面实现

在这里插入图片描述
实现前的讲解:(之后会默认你已经明白这些知识了)

  1. 黑边处理:仔细的你可能已经发现了,几乎所有的图片数据都是二维,并且第二维的元素为2。我简单解释一下:因为素材图片都是网上找到,如果直接画上去会有很难看的黑边,我用的图形库又不能使用透明背景的图片,但它支持绘图时,将要绘制的图像像素与他要覆盖范围内的原像素进行位运算并显示运算后的结果图像,基于这个功能,我们可以自己实现去黑边,首先每张图片需要制作它的掩码图,比如:
    在这里插入图片描述
    有了它的掩码图,就可以去掉黑边了。具体的原理可以自行百度,我提供一份参考资料: 点这里
  2. 闪烁处理: 大多数情况下,我们直接绘制在屏幕上的图片会有严重的闪烁!这十分影响游戏的效果,发生闪烁的原因可以自行百度,这里不再赘述。好在图形库位我们实现了批量绘图的技术,简单提及一下它是如何实现的:在开始批量绘图时(调用:BeginBatchDraw()),他就另外创建了一个画板,你的只有所有绘制的图像都会这这个画板上,而不是直接显示在你的显示器上,当你本次绘画完成时(调用FlushBatchDraw();),它会一次性把你之前画的内容显示出来。最后记得关闭批量绘图
    tips:不同的图形库对于批量绘图有不同实现。
  3. 这一部分编码难度在分数排名的绘制,它涉及到文件操作、界面的跳转等。

代码示例

  1. 掩码图的运用与批量绘图技术:
BeginBatchDraw();//开始批量绘图
putimage(0, 0, &picture.backgroundpt);
putimage(50, 100, &picture.gametitle[0], SRCAND);
putimage(50, 100, &picture.gametitle[1], SRCPAINT);

putimage(115, 180, &picture.birdpt[number][0], SRCAND);
putimage(115, 180, &picture.birdpt[number][1], SRCPAINT);

putimage(20, 345, &picture.button[0][0], SRCAND);
putimage(20, 345, &picture.button[0][1], SRCPAINT);

putimage(150, 340, &picture.button[1][0], SRCAND);
putimage(150, 340, &picture.button[1][1], SRCPAINT);

putimage(n, 400, &picture.landpt);

putimage(70, 425, &picture.copyright[0], SRCAND);
putimage(70, 425, &picture.copyright[1], SRCPAINT);

FlushBatchDraw();//将已经绘制的图像一次性显示出来
						
Sleep(50);
putimage(0, 0, &picture.backgroundpt);

putimage(50, 100, &picture.gametitle[0], SRCAND);
putimage(50, 100, &picture.gametitle[1], SRCPAINT);

putimage(115, 180, &picture.birdpt[number][0], SRCAND);
putimage(115, 180, &picture.birdpt[number][1], SRCPAINT);

putimage(20, 340, &picture.button[0][0], SRCAND);
putimage(20, 340, &picture.button[0][1], SRCPAINT);

putimage(150, 340, &picture.button[1][0], SRCAND);
putimage(150, 340, &picture.button[1][1], SRCPAINT);

putimage(n, 400, &picture.landpt);

putimage(70, 425, &picture.copyright[0], SRCAND);
putimage(70, 425, &picture.copyright[1], SRCPAINT);

FlushBatchDraw();//将已经绘制的图像一次性显示出来
EndBatchDraw();//结束批量绘图

bird控制

实现前的讲解:

  1. 这个部分实现的难点在于捕获键盘信息。我使用了window的api(GetAsyncKeyState)来获取按键信息。
  2. 设置bird的下降速度。

流程图:
在这里插入图片描述
实现函数:birdct()

游戏绘图

流程图:
在这里插入图片描述
实现函数:drowpicture()

碰撞与得分实现

这是游戏中最复杂的部分。

  1. 碰撞的设计思路:
    在这里插入图片描述
    实现函数:collision()

结语

感谢你的参阅,游戏还有很多不完善的地方,有兴趣的话你可以添加自己的玩法。最后附上项目的地址: 点这里

C语言实现flappybird
04-27
C语言实现简单的游戏,在控制台下模拟flappybird游戏
C语言简易版小游戏flappy bird】(VS2017)
02-10
C语言简易版小游戏flappy bird】,新手练手绝佳小程序,调试通过没有问题!
Flappybird Demo
u011698816的专栏
05-10 1106
Flappybird 作为风靡一时的游戏
C语言使用easyX实现flappy bird像素鸟源码
09-12
使用C语言和C++语言制作的一个像素鸟敏捷类小游戏,本游戏使用了双缓冲绘图技术,像素鸟和管道在移动的过程中不会出现闪屏的情况,代码逻辑清晰,注释完整,非常适合新手阅读与学习。需要安装easyX。
c语言flappy bird代码,Flappy bird源代码(略吊)
weixin_39801613的博客
05-19 350
[codesyntax lang=”cpp”]#include#include#include#include#include/********函数变量声明********/#define PR_Box printf(“■”)#define PR_Gold printf(“★”)#define PR_Ag printf(“☆”)#define PR_FBird printf(“Ю”)#define...
C语言实现Flappy Bird游戏
08-26
C语言实现Flappy Bird游戏 本文将详细介绍如何使用C语言实现Flappy Bird游戏,包括游戏的实现思路、代码结构和游戏逻辑等方面的知识点。 游戏实现思路 Flappy Bird游戏的实现思路主要包括三个方面:游戏...
C语言实现flappy bird游戏
08-26
C语言实现flappy bird游戏 本文主要介绍了如何使用C语言来实现flappy bird游戏,提供了完整的代码实现,涵盖了游戏的界面设计、游戏逻辑实现、用户输入处理等方面的知识点。下面将对这些知识点进行详细的解释和...
C语言编写的FlappyBird游戏.zip
最新发布
06-13
C语言实现的Flappy Bird游戏详解》 Flappy Bird是一款曾经风靡全球的休闲游戏,以其简单却极具挑战性的玩法吸引着众多玩家。而本文将深入探讨如何使用C语言来编写这款小游戏,帮助读者理解游戏开发的基础知识,...
flappy-bird-demo, 在生活中,实时交互编码Flappy鸟.zip
09-18
flappy-bird-demo, 在生活中,实时交互编码Flappy鸟 flappy-bird-demo看一下关于这个 flappy bird的博客文章。观看 6分钟的视频视频。在 lein-figwheel 上签出文档以进一步进行 !许可证版权所有 © 2014 Bruce Hauman在 Ec
flappy birdc语言编写的代码
05-07
复制粘贴,然后运行之后就可以试玩了,大家感兴趣的可以试试,并且分析一下它的源码
C语言flappy bird
03-20
一个用C语言编写的游戏flappy brid
C高级编程技术 小游戏编程 适合入门以后学习
03-21
适合入门以后学习,有文件操作,鼠标,键盘...... 还有小游戏教学.........
各种C语言实现的小游戏
10-10
用codeBlocks作编码器,包括一些设计算法和思路的参考
C语言高级编程及实例剖析
01-04
C语言高级编程及实例剖析——书籍,是一本不错的参考书籍,感兴趣的可以下载看看,
C语言游戏-简单仿flayBird游戏
逼哥很疯狂的博客
03-21 531
首先需要先画出一直小鸟,而且自由下落。并且输入键盘“空格”,则小鸟会上飞。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <conio.h> //设置全局变量 int high,width; //画布 int bird_x,bird_y; //小鸟定...
Flappy_Bird1(C语言版)
weixin_44795839的博客
07-16 2300
多文件编程 这个小游戏Flappy_Bird1(C语言版)代码,采用了多文件编程。 那么多文件编程有什么好处呢? 1.便于复用代码。通用性强的重复的功能只要写一遍就可以了,下次要用在其它程序上时只要更改很小的部分或者可以不用更改。 2.便于多人协作。在设计软件之初就可以很清楚地分配各个开发部门的任务。模块的编写者本身只要关注他所写的东西,清楚这一部分的功能,留出接口就可以了。另外,对于整个工程的...
图片透明效果 c语言_C/C++编程笔记:飞翔的小鸟(Flappy Bird)——C语言版本
weixin_39560245的博客
01-19 368
C语言游戏教学项目,有C基础和对小游戏感兴趣的可以看看,做出来成就感爆棚~使用的编译器是VS2013,图片素材,可以自己百度寻找素材图片,也可以在文章最后领取哦~效果图:话不多说,接下来就奉上我们的源码了(写的时候包含了一些笔者的注释,勿怪勿怪):/*1.创建一个可视化窗口2.显示一张背景图*/#include #include #include #include #include #i...
62套C语言游戏源码
12-31
这是楼主珍藏的62套C语言游戏源码,包含吃豆人、俄罗斯方块、别踩白块等诸多经典小游戏。感兴趣的朋友可以下载下来研究。
写文章

热门文章

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构 4047
  • python h5py库的使用 3053
  • VDSR:基于深度卷积神经网络的实现精确图像超分辨率重建(2016) 2873
  • Filbeat提取Json日志文件到Elasticsearch 2597
  • C语言高级demo Flappy Bird游戏 1692

分类专栏

  • 中间件 1篇
  • mybatis 1篇
  • 机器学习 10篇
  • Java 2篇
  • C/C++ 3篇
  • .NET
  • 问题解决 5篇
  • 数据库
  • 概论论与数理统计
  • 超分辨率重建 3篇
  • 深度学习 9篇
  • python 5篇

最新评论

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构

    Fraps_: https://github.com/jmiller656/EDSR-Tensorflow/blob/master/utils.py#L30 参考这里的实现。

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构

    weixin_47102310: X = tf.reshape(I, (bsize, a, b, c/(r*r), r, r))总是在这一行提示错误。TypeError: Expected int32, got 8.0 of type 'float' instead.

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构

    weixin_47102310: 博主您好,我想把sub-pixel插入到卷积网络中,代替上采样,但是总是报错,说格式不对,应该如何处理

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构

    Fraps_ 回复 qq_44796499: 不好意思这才回你,对于第一个问题,我现在认为是作者自己强塞的,到目前,神经网络也是凭经验、实验性的,没有太多理论上的东西,提出的模型有效果后,再反过来解释;对于第二个问题,要深究的话要去看第一个提出“反卷积”这个概念的文章,对于本文提到的sub-pixel,再github上有实现,而且再以后很多超分模型都在用这功能,附地址:https://github.com/tetrachrome/subpixel

  • ESPCN:基于高效的亚像素卷积神经网络的实时单张图片与视频超分表率重构

    qq_44796499: 博主,您好,我最近在学习有关图像超分辨的知识,感谢您写了这篇博客,我看完您这篇博客后有两个问题:第一个是该神经网络为什么可以依赖神经网络的学习能力,在网络的第一层,让它去自适应的习得一个灵活的滤波器。在别的博客中也写到什么插值函数被隐含地包含在前面的卷积层中,我也不太理解这种解释。第二个是最后一层网络,也就是sub-pixel卷积层为什么是属于反卷积。望能得到博主的解答,感激不尽!

大家在看

  • [ 机器学习 ] 聚类算法详解 396
  • 如何优雅地将AI客服集成到企业网站或APP中 695
  • Python之文件管理 56
  • JVM学习之路(4)Java内存区域
  • 《山东大学学报(理学版)》 292

最新文章

  • Filbeat提取Json日志文件到Elasticsearch
  • Mybatis源码学习1-logging,exceptions包分析
  • oracle 12c dataguard
2022年1篇
2020年5篇
2019年18篇
2018年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家镇江玻璃钢广场雕塑价格舟山广场娱乐玻璃钢雕塑定制江宁商场春季美陈景观标识玻璃钢仿铜雕塑制作rtm法玻璃钢雕塑设计河南欧式玻璃钢雕塑制作广州玻璃钢雕塑制作佛山公园雕塑玻璃钢定做供应信誉好的玻璃钢花盆定制洛阳玻璃钢雕塑西藏玻璃钢雕塑价格玻璃钢和石塑雕塑的区别广东艺术商场美陈销售公司云南户外玻璃钢雕塑批发景观玻璃钢卡通雕塑推荐货源潞城玻璃钢气球雕塑金山区拉丝玻璃钢雕塑服务介绍玻璃钢企鹅雕塑云南环保玻璃钢雕塑哪家便宜岳阳长沙玻璃钢雕塑定制设计玻璃钢卡通雕塑橘子加工河北玻璃钢卡通雕塑设计唐山玻璃钢卡通雕塑定制成都玻璃钢广场雕塑定制栖霞五一商场美陈营口玻璃钢门头雕塑1688玻璃钢艺术雕塑四川景区玻璃钢雕塑生产厂家拉丝玻璃钢雕塑要多少钱玻璃钢狗雕塑图片香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化