2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地

55afe202c4c8cf31c9cc6e721ef40b48.png
7a9886302b59aba6b3397a07cab6a274.png
C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592

分享19级同学大一上学期用C语言实现的火柴人试炼之地。分步骤代码、图片音乐素材、可执行程序可以从百度网盘下载:

链接:https://pan.baidu.com/s/1XelHD8GVnXfR8coAYOAC9w

提取码:dbu3

1 设计思路:

本游戏参考了网络上的同名游戏,并通过EasyX插件用C语言编写实现,玩家通过鼠标进行游戏界面中的选择,通过键盘输入进行游戏主干的操作,并尽可能使界面更加美观,更加符合人性化操作要求,并且加入存档功能和外置游戏数据,前者目的为提高游戏体验,后者目的为方便游戏关卡内容升级。

2 功能描述:

游戏主体基本功能就是接受玩家的鼠标和键盘输入,并做出相应的反应,实现界面选择和游戏功能。其分部分介绍如下:

2.1 初始化

初始化函数为startup()函数,其基本功能有一下几点:

1.初始化画布(initgraph()函数),而且为了避免玩家在游戏过程中关闭窗口,造成无法存档,我在初始化画布时,添加了相应的参数,禁用了关闭按钮和最小化按钮,使游戏在运行时不会被意外关闭。

2.导入并播放音乐。因为考虑到游戏风格,我并不打算在游戏添加人物活动的音效,所以,只有重复播放的背景音乐。

3.导入所有所需要的图片。

4.初始化所有变量。

5.防止在加载图片时出现长时间黑屏,显示加载界面。

2.2 读取游戏进度

读取游戏进度为readGameStageFromFile()函数,用于读取存档,并且在读取失败时默认将游戏进度置为1,然后返回。

2.3 读取游戏存档

读取游戏存档为readGameDataFromFile(int num)函数,通过接收传入的指定关卡,读取相应的关卡,并且,在读取失败时提醒并退出游戏。

2.4 写入游戏进度

写入游戏进度为writeGameStageToFile(int num)函数,接收目前的关卡状态(即游戏进度),并写入存档。该函数在执行exit(0)前执行。

2.5 欢迎界面

欢迎界面为welcomeUI()函数,将图片序列依次输出显示,其重点为遇到键盘输入或鼠标点击时能跳过,因此其中的主要部分为判断。

2.6 作者声明

作者声明为poweredByUI()函数,强制输出作者信息,以声明作者创作权。

2.7 主界面

主界面为mainPageUI()函数,显示游戏的选择主界面,其分为背景图片序列显示和文字和按钮显示,为了提供比较美观的游戏界面,我去查询了EasyX的帮助文档,了解了旋转图片的函数,使标题文字可以旋转,提高美观性,而对于按钮,通过变量控制坐标,使其在鼠标移动上去时产生抖动效果,提高美观性。

2.8 游戏选择界面

游戏选择界面为chooseGameUI()函数,其分为两个部分,第一部分为询问是否读取上一次游戏的存档界面,并采用和主界面类似的界面美观设计,第二部分为游戏关卡选择,通过gameRecord变量的信息来输出相应的关卡选择图案,并且进行一定的美观设计,当鼠标移上去时,颜色发生变化,然后在点击后,改变gameStage变量,以进入相应的关卡。

2.9 主游戏界面

主游戏界面为gameUI()函数,用于输出游戏中物体,其通过几个标记变量来判断输出不同的人物状态,除此之外,通过maps中储存的地图信息来显示地图。

2.10 主游戏操作输入

主游戏操作输入为gameInput()函数,为了使游戏体验更加流畅,我使用了异步输入GetAsyncKeyState()函数,并且同时兼容了ASDW和方向按键,以提升玩家体验。每个按键中操作除了坐标改变外,还有相应标记变量的改变。此外,函数重点为人物跳跃落地判断,此处我通过判断当前坐标对每个方块的宽度取余,以对应到maps数据中用了判断。而且,为了游戏效果更佳逼真,我采用了重力加速度的计算方法,来让人物有加速下落的效果。

2.11 暂停界面

暂停界面为pauseUI()函数,其界面设计与读取存档界面统一,并采用一样的按键美化方法。

2.12 游戏结束界面

游戏结束界面为endGameUI()函数,其界面设计与暂停界面和读取存档界面统一,并采用一样的按键美化方法。在点击确认的情况下,清除相应的数据,将游戏进度写入存档,并安全退出。

2.13 主函数

主函数仅为对各种函数的调用,并通过while(1)来实现不断显示,而界面切换是通过switch来判断stage数据,以进入相应的函数。

3 实现过程中的重点和难点

3.1 chooseGameUI界面中按钮显示异常问题(难点)

在chooseGameUI中,由于按键有不同类型,因此其判断是分开进行的,结果在初期调试时发现,只有第一部分按钮有动态效果,其他按钮无反应,经过反复分析,我发现,在这函数的一次执行中,有多个并列的if(MouseHit())语句,而MouseHit()对鼠标情况的读取总是使程序进入第一部分的按钮判断中,而后面的MouseHit()都被第一个MouseHit()阻塞,导致对后面的按钮判断不能被执行。

解决方法为:加入一段语句,使后面的判断进入条件共用一个MouseHit()函数。(代码如下)

int mFlag = 0;
if (MouseHit())
{mFlag = 1;m = GetMouseMsg();
}

后面的判断都使用mFlag,而不是MouseHit()。

3.2 游戏CPU占用过高引起的低配置电脑运行卡顿问题(难点)

由于游戏中使用了while(1),相当于程序在死循环,而为了游戏的流畅效果,不能直接使用Sleep()函数,所以,程序全程都在对CPU进行高占用,而不同帧数对数据处理时间不同,直接的无限循环就导致了刷新帧率有巨大波动,影响游戏效果,且过度消耗电脑资源。在程序优化前,游戏程序在任意界面下都几乎占满一个CPU核心(数据为i7-9750H处理器在连接电源情况下保持4.2GHz左右的时钟频率工作下测得),而我通过查询,找到了一个MyTimer.h的自定义库,可直接调用实现非阻塞式的延时,从而统一刷新帧率,对游戏实现优化。在程序优化后,游戏程序在任意界面下都可以实现低占用率,在电脑省电模式下的极端测试,游戏程序不会占用一个CPU核心的50%以上(数据为i7-9750H处理器在不接通电源下开启极限省电模式保持0.9GHz左右的时钟频率工作下测得)。

3.3 存档问题(重点)

我们的游戏离不开存档和数据读取功能,因此对文件操作要求较高,因此我加入了许多对于文件操作的异常情况的处理,如:存档文件无法打开时游戏进度自动归零,地图数据无法打开时游戏报错提醒等,在这里我还使用了MessageBox函数,此外,为了防止玩家意外按到关闭按钮退出而丢失游戏进度数据,我还禁用了窗口的关闭按钮。

4 感悟

此次大作业中,诚然知识的要求很重要,但是,我感觉我收获最多的是自主学习,自主纠错的能力,程序,谁都能写,但是对于一些细节的东西,整体框架的整洁度,逻辑是否合理,是否规范才是最重要的地方。在本次作业中,有多处体现了这中思维的重要性,如对于每个界面结束时界面残余数据的清除置零,MouseHit()的冲突与干扰,还有人物运动与显示的逻辑,这些都是考验。而查询帮助文档和用法,是我的另一大收获,编程里面东西很多,如果只靠别人说,难以学深,更多的就是依靠自己学习自己查询帮助文档。

总之,大作业让我获益匪浅。

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

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

相关文章

基于单TCP连接的高吞吐模型设计

对于服务与服务之间往往需要高效的吞吐的信息交互,但在绝大部分服务应用中为了实现高吞吐交互都是基于连接池模式,即通过多个TCP连接来提高吞吐量,这种设计完全是通过增加IO的读写量来实现高效吞吐。如果能减少连数和降低IO量(合并…

程序员8大终极杀器,你get了几个?

全世界有3.14 % 的人已经关注了数据与算法之美经常有同学问:作为程序员,终极杀器是什么?其实有大佬早已回答过:持续学习,开阔视野才是程序员的终极杀器!基于此,给大家一个建议:不妨多…

winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]【编者的话】如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用Spring Boot、Spring Cloud和Docker构建的概念型应用示例,提供了了解常见的微服务架构模式…

女朋友掉水里,各类程序猿怎么救?

全世界有3.14 % 的人已经关注了数据与算法之美前天发了一篇有趣的文章《如果辅导员掉进水里,各个专业的学生将会如何解救?》那么,如果程序猿的女朋友落水了,他们会怎么救呢?不会像在校的计算机学院的学生那样“找跟网线…

联机分析的列式数据库 clickHouse

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。在传统的行式数据库系统中,数据按如下顺序存储:RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016-05-18 05:19:20#1903295099580Contact us12016-05-…

网管小王的工具包

我是一名网管,工作主要是维护单位的网络线路和电话线路,今天闲来没事,把工具包中的工具show一下吧。笔记本电脑打线器,用来维修模块和打线用的两根长短不同的网线和一根电话线螺丝刀,什么扁口,十字花&#…

.NET之生成数据库全流程

开篇语本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程。采用EFCore作为ORM框架。本次示例环境:vs2019、net5、mysql创建项目本次事例代码是用过vs2019创建的ASP.NET Core Web API项目可以通过可视化界面创建或者通过命令行创建dotnet new webap…

进军人工智能,数学基础很重要?

随着科技的快速发展,人工智能的重要性日渐显现。对于大多数新手来说,弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等,都至关重要。机器学习是一个异常丰富的研究领域,有大量未解决的问题:公正、可解释性、易…

修改正文中参考文献标注_论文写作中怎样正确插入参考文献,引用文献如何标注?...

论文写作中怎样正确插入引文文献,引用文献如何标注?不管是大学毕业生还是期刊/评职称的我们在面对撰写论文时,参考文献的引用是必不可少的。参考文献的引用可以给论文增添很多的光彩。正确的在论文中引用参考问下你会在论文编写的同时省去很大…

.Net之多语言配置

开篇语首先非常感谢各位朋友或技术爱好者的关注。介绍支持多语言使网站可以覆盖更广泛的受众。ASP.NET Core 提供的服务和中间件可将网站本地化为不同的语言。本次示例环境:vs2019、net5配置无需引用Nuget包即可实现以下功能。注入容器services.AddLocalization(t &…

21张GIF动图让你秒懂数学原理

全世界有3.14 % 的人已经关注了数据与算法之美数学是很难的科学,但因为它是科学家用数学来解释宇宙的语言,我们无可避免的要学习它。看看下面的这些GIF动图,它们提供了视觉的方式来帮助你理解各种数学技巧。推荐阅读《12堂魔力数学课》。1.椭…

表格过滤器_记录和管理零散信息,什么软件比 Excel 表格更方便

SeaTable 的目标是帮助大家更好的组织和管理各种零散的信息,团队的请假信息就属于这样一类零散的信息。下面我们来看一下 ,SeaTable 相比于 Excel 是如何更好的帮助我们来组织和管理这样的信息的。用 Excel 记录的团队请假信息下面两张表是比较常见的请假…

使用 Source Generator 代替 T4 动态生成代码

使用 Source Generator 代替 T4 动态生成代码Intro在 Source Generator 出现之前有一些重复性的代码,我会使用 T4 去生成,这样就可以一定程度上避免复制粘贴和可维护性也会更好一些。在了解了一些 Source Generator 之后,就想尝试把现在项目里…

资料分享 | 数据挖掘实例资料分享来袭

小编从大学开始,便开启资料收集功能。随着大数据时代的来临,计算机发展进入新的阶段,再加上日常的深入研究,小编收集整理了丰富的数据挖掘资料,内容涵盖“程序”,“数据”、“文档”等。这次小编再次把所有…

修改图层的范围_【PS|第39期】数字绘画 使用填充图层

惟有悲观净化而成的乐观,才是真正的乐观。——尼采)填充图层是一种只承载纯色、渐变和图案的特殊图层,其特点是填充内容可以修改。另外,设置成不同的混合模式和不透明度后,可用于修改其他图层的颜色或生成图像混合效果。填充图层都…

我的注释那去了?

当我们用nuget引用三方库时,在类型,或类型成员上会有注释,如下图,是MySql官方包,command的ExecuteNonQuery的注释我们自己写一个类库项目CommentsLibrary,给类,构造函数,方法添加xml…

[原] jQuery EasyUI 1.2.6源码、Demo合集、离线API

下载地址: http://files.cnblogs.com/purediy/jquery-easyui-1.2.6.zip 兄弟版本: jQuery EasyUI 1.3.4 离线API、Demo jQuery EasyUI 1.3.2 离线API、Demo jQuery EasyUI 1.3.0 Demo合集、离线API、动态换肤 相信关注过jQuery UI 的大部分都查到过easyu…

看书的一点小建议!

阅读本文大概需要6分钟。昨天看见小北写了一篇:「看书的一点小建议」,写的很不错,今天也分享一下自己看书的心得。其实不少读者问过我怎么看计算机经典大厚书、怎么看产品运营经典大厚书、怎么提高看书效率:电影教父里有台词&…

技巧:Excel用得好,天天没烦恼

全世界有3.14 % 的人已经关注了数据与算法之美Excel是Office三大神器当中最神秘、但也是最能提高你效率的工具了。而我们中的太多小伙伴,却一直把它当做是个“电子表格工具”。今天一起涨姿势,学会下面这些神技,你的Excel分分钟超过90%的同事…

操作数数据类型 char 对于 sum 运算符无效。_数据类型和运算符

数据类型和运算符1.进制1.1文件存储单位​ 任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来 。​ 一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成一个字节Byte 。​ 一个bit位表示的数的范围:0和1​…