C语言实战 | Flappy Bird游戏

image.png


Flappy Bird游戏是由一名越南游戏制作者独自开发的,曾经风靡全球。游戏规则非常简单,玩家必须控制一只小鸟,跨越由各种长度的水管所组成的障碍物,如果撞上管道游戏就结束,如图11.11所示。

image.png

■ 图11.11Flappy Bird 游戏

完成游戏的步骤与第6章的“贪吃蛇”“打砖块”等游戏的步骤没有区别,都是遵循如下游戏设计步骤。

(1) 根据游戏规则,统计游戏画面中会出现的游戏角色。然后根据游戏角色的特征选择合适的数据类型保存数据,通常有变量、一维数组、二维数组。

(2) 根据这些角色最开始在屏幕上的位置,对每一个角色的数据进行初始化。

(3) 根据数据,将每一个角色显示在屏幕上。

(4) 根据游戏规则,更新每一个角色的数据,形成新的画面。

唯一的区别在于,之前的游戏角色的图像都是由小方块组成的,现在的游戏角色的图像都是由漂亮的图片组成的。

根据游戏的简介可知,Flappy Bird游戏只有两个游戏角色:小鸟和水管,则分别设计小鸟和水管的结构体类型数据。游戏中只有一只小鸟,而水管有多个,所以可以选择用单个变量存储小鸟的数据信息,用一维数组存储水管的数据信息。

小鸟的信息包括在屏幕上的位置、图片信息以及生命状态,则结构体类型为:
 

image.png


水管的信息包括在屏幕上的位置和图片信息。每一组水管由上、下两个管道组成,假定上、下管道之间的空隙高度为固定的100像素。因此构建管道的结构体需要保存上、下管道在屏幕上的位置,还有上管道的高度,则结构体类型为:
 

image.png


声明好结构体内容之后,可以根据结构体,选择合适的数据类型存储数据信息。接着按照初始化数据、显示数据、更新数据三个步骤分别完成相应的内容。

01、初始化数据

初始化鸟的代码如下:
 

image.png


初始化管道的代码如下:

image.png

02、显示数据

显示背景图的代码如下:
 

image.png


显示小鸟的代码如下:
 

image.png


显示管道的代码如下:

image.png

03、更新数据

更新小鸟的数据包括两部分。

(1) 小鸟的位置变化。

(2) 小鸟的生命状态,当小鸟撞到管道时,游戏结束。

判断小鸟是否与管道发生碰撞,可以抽象为两个矩形是否相交。如果相交,则发生了碰撞。判断矩形相交的方法有很多,在这个游戏中,可以简化处理为如图11.12所示的模型。
 

image.png


■ 图11.12物体碰撞检测模型

中间的小方块表示小鸟,两个大方块分别代表上、下管道。每个方块的4个点的坐标都是已知的。小鸟的矩形左上角的坐标为(pBird->x,pBird->y),右下角的坐标为(pBird->x+35,pBird->y+25),其中数值35、25分别为小鸟图片的宽度和高度。上面管道的左上角坐标为(pPipArray[i].x,pPipArray[i].upy),右下角的坐标为(pPipArray[i].x+52,pPipArray[i].upy+320),其中数值52、320分别为上管道图片的宽度和高度。下面管道的左上角坐标为(pPipArray[i].x,pPipArray[i].downy),右下角的坐标为(pPipArray[i].x+52,pPipArray[i].downy+320)。

当小鸟飞进管道所在的区域时,意味着两种可能:左边的一条边或者右边的一条边在管道的左右两条边之间。代码如下:
 

image.png


当小鸟飞进管道所在的区域时,有两种情况意味着发生碰撞。

(1) 小鸟上面一条边的y轴坐标值小于上管道底部边的y轴坐标值。

(2) 小鸟下面一条边的y轴坐标值大于下管道顶部边的y轴坐标值。

判断小鸟生命状态函数的代码如下:
 

image.png


 

image.png


更新的小鸟生命的函数的代码如下:
 

image.png


更新小鸟运动的代码较为简单,小鸟只有上下运动,当按下空格键时,小鸟向上运动,没有按键时小鸟不断向下运动。代码如下:
 

image.png


更新管道的数据,管道不断向左运动,代码如下:
 

image.png


完整的代码如下:
 

115dba017cc2a50bc92eb99b8f31d4d6.png

03471fe0768cf33fb1cf9c769e0f6324.png

20c419f6d230cd65f0220c4957758ca0.png

99ff7644e1c7ba7080208b0bdb650c0a.png

0d655c593652ecb62dfce11d0b11d6bc.png


仔细观察就会发现Flappy Bird游戏就是“赛车”游戏的变体,Flappy Bird游戏改变最大的就是将玩法导向了自虐模式,正是这点微小的创新,就让游戏体验变得不一样,更加吸引人,从而风靡全世界。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOP与IOC详解

AOP(Aspect Oriented Programming,面向切面编程)和IOC(Inversion of Control,控制反转)是现代软件开发中两个重要的概念。虽然它们最初独立存在,但在实践中经常一起使用。在这篇文章中&#xff…

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中,确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输,并与服务器端保持加密解密的一致性。本文不会包含服务器端代码,但会解释其实现原理。 加密与解密的基本原理 AES(Advance…

C语言实现的冒泡排序算法的示例程序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小&…

Mysql8.0.36 Centos8环境安装

下载安装包 官网地址:MySQL :: Download MySQL Community Server (Archived Versions) 可以直接下载后再传到服务器,也可以在服务器采用wget下载。如下: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.36-linux-glib…

SQL Server全文搜索揭秘:深度挖掘数据的隐藏价值

SQL Server全文搜索揭秘:深度挖掘数据的隐藏价值 SQL Server的全文搜索(Full-Text Search)功能是微软关系型数据库管理系统中的一个强大工具,它允许用户对非结构化文本数据执行复杂的查询。全文搜索功能不仅提高了数据检索的效率…

SpringBoot AOP切入点表达式

介绍 在AOP中可以通过注解来定义 切入点表达式来控制被监控的方法。 匹配所有 com.example.service 包下以 Service 结尾的方法: "execution(* com.example.service.*Service.*(..))"匹配任意类的 public 方法: "execution(public * …

【单片机毕业设计选题24047】-基于阿里云的工地环境监测系统

系统功能: 基于STM32完成 主机(阿里云以及oled屏显示位置一):烟雾检测,温湿度检测,噪声检测,且用OLED屏显示,设置阈值,超过报警(蜂鸣器)。 从机&#xff0…

关于echarts中使用到的图例、颜色设置、设置tooltip换行显示等问题

最近使用echarts中用到图例随机生成,颜色多不好设置的问题,图例多展示出现不全,不能根据颜色判断图例和数据的问题等总结一下 原始代码: that_ge.charts echarts.init(document.getElementById(paramenterEcharts));that_ge.al…

(四)共享模型之内存

本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量时,保证临界区代码的原子性 这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 Java 内存模型 JMM 即 Java Memory Model,它定义了主存、工作内存…

firewalld(3)zone配置

简介 前面文章我们已经介绍了firewalld的安装,配置文件介绍、简单的规则查询,本篇文章主要介绍zone的配置。前面我们介绍了firewalld默认的zone和不同zone的功能,下面我们就直接进入zone的具体配置使用。 配置zone的方式 图形配置工具…

浅析基于量子成像的下一代甚高灵敏度图像传感器技术

高灵敏度探测成像是空间遥感应用中的一个重要技术领域,如全天时对地观测、空间暗弱目标跟踪识别等应用,对于甚高灵敏度图像传感器的需求日益强烈。随着固态图像传感器技术水平的不断提高,尤其背照式及埋沟道等工艺的突破,使得固态…

马拉松报名小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,赛事信息管理,赛事报名管理,活动商城管理,留言板管理,系统管理 微信端账号功能包括:系统首页,赛事信息&…

Python考前复习

选择题易错: python3不能完全兼容python2内置函数是python的内置对象之一,无需导入其他模块python中汉字变量合法,如“小李123”合法;但T-C不合法,因为有“-”集合无顺序,不能索引;range(5)[2]…

【python全栈系列】day09-python数据类型转换

在Python中,数据类型转换是一项非常常见的操作,它允许我们将一种类型的数据转换为另一种类型。这种转换在处理来自不同源的数据时尤其有用,例如用户输入、文件读取或网络数据等。下面,我将通过代码示例来展示如何将其他数据类型转…

ABAC模型

属性基访问控制(Attribute-Based Access Control,ABAC)是一种动态和细粒度的访问控制模型,通过评估用户属性、资源属性、环境属性和动作属性来决定访问权限。这种模型比传统的角色基访问控制(RBAC)更灵活&a…

json数据的解析

1. Json是什么? JavaScript Object Natation, 一种轻量级的数据交换格式, 与XML一样, 广泛被采用的客户端和服务端交互的解决方案!具有良好的可读和便于快速编写的特性。 2. Json与XML的比较 JSON和XML的数据可读性基本相同; JSON和XML同样拥有丰富的…

手动访问mongo和ES插入和查询

1、手动访问mongo 1.1、mongo连接数据库 1.2、mongo插入和查询 db.hmf_test.insert( { "aoeId": "1", "aoeAes": "吴秀梅", "aoeSm4": "北京xx网络技术有限公司.", "aoeSm4_a": "…

构建可扩展的Java Web应用架构

构建可扩展的Java Web应用架构 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代软件开发中,可扩展性是一个至关重要的概念。构建一个可扩展的…

2pc 3pc

2pc&3pc问题 本质: 2pcTM超时机制 3pc加入事务询问机制RM超时机制 事务询问机制:减少阻塞 RM超时机制:避免死锁 2pc 3pc 参考: https://juejin.im/post/5aa3c7736fb9a028bb189bca#heading-1 https://blog.csdn.net/xj1…

Spring Boot 文件上传和下载指南:从基础到进阶

文章目录 引言1. 环境配置2. 文件上传2.1 配置文件上传路径2.2 创建上传服务2.3 创建上传控制器 3. 文件下载3.1 创建下载服务3.2 创建下载控制器 4. 前端页面4.1 文件上传页面4.2 文件下载页面 5. 技术分析结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o …