2020级C语言大作业 - 王国保卫战
王国保卫战 C语言大作业
分享20级同学大一上学期用C语言(及少量C++)实现的王国保卫战。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:
链接:https://pan.baidu.com/s/1FgNQJQFVxeNp2TYmWI5O7w
提取码:p7bq
1 设计思路
本游戏参考经典塔防游戏王国保卫战,通过Easyx插件和C语言达到可视化游戏的目的,通过鼠标交互实现建造、升级防御塔来构建防线,力求实现塔防游戏这一核心,尽可能还原游戏,但原作品内容实在丰富,这里仅取一些经典的内容进行呈现,但自认为做的一些处理比如用文件来储存关键数据、格式转换实现批量导入图片、以及怪物行走路线和防御塔攻击都用到的位移函数等可以实现游戏内容升级。
2 功能描述
游戏通过接收玩家的鼠标操作,做出相应的内容呈现,实现关卡选择和游戏功能。其部分内容介绍如下:
2.1 初始化
初始化函数为Start()函数进行全局资源如通用界面图片的导入
2.2 关卡选择界面
首先进入一个While(1)循环中,点击图标选择关卡点到位置赋予结构体map.lev对应的值,而map.lev决定了map.Start()和map.Draw()这两个最重要的函数。
2.3 界面切换动画
这一个有意思的设计使游戏较美观,也使得界面转换更加协调而不突兀,给玩家反应的时间。
2.4 一揽子函数
游戏有直接进入下一关、重新开始、返回到选关界面等一系列功能,其实现是通过将需要的小函数打包成大函数如Quit()选关、Restart()重新开始本关、而直接进入下一关只需map.lev++和Restart()结合便没有专门的函数。这些大函数用到的地方很多。
2.5 关卡界面
你看到的关卡界面看似复杂,但那些能随便点击的防御塔,他们的坐标都是提前存到对应的文件中的读取只需要结构体数组和
fscanf(fmap, "%f %f ", &tower[i].x, &tower[i].y);这么简短的一句。点击防御塔,光标停留在防御塔UI上你能看到相应的文字介绍,再次点击便可对塔进行相应的操作,而这些都是不断判断塔的点击状态的结果。
2.6 暂停界面
点击暂停按钮,可在暂停界面进行相应操作如重新开始本局游戏、继续游戏、进入选关、音乐音效的控制。
3 实现过程中的重点和难点
3.1 批量化操作(重点)
关卡中元素较多,每种塔每种怪甚至每张地图都有对应的png或txt文件,若都以文件名的方式导入,则有水代码之嫌,而且动态的实现也更难,于是我就想找到一种能批量操作的方法,至少能批量导入图片,但单纯的loadimage(&image,_T(“image%d.png”),i);是会报错的,无法实现,于是我在网上找对应的方法,却发现相关的教程少之又少,最后在B站一个不起眼的视频中找到答案。即通过格式转换的方式char filename[20],sprintf(filename,”level_%d.png”,i),这样一来就实现了批量导入图片和其他的批量化操作。
3.2 鼠标操作的接收及反馈(难点)
一开始我打算先把箭塔做出来,但并不容易,需要两次连续,且两次操作位置不同,于是我打算在第一次点击后再次在循环中获取鼠标操作,但发现只有循环的最后一项能获取到鼠标的操作,于是我定义了变量menuopen来判断防御塔菜单是否展开,但接下来,我纠结要不要实现原版游戏悬停出现防御塔介绍的功能,感觉不容易本来打算放弃,或者在点击之后先显示介绍,但这样一想其实和菜单的显示是一个原理,于是就再定义了一个变量判断鼠标是否悬停及悬停的位置实现了这一功能,简单地说,就是操作的接收和反馈不必放在一起。而这个也是我认为整个项目中最难实现的功能,如果没有想到或许这个项目就成了空话。
3.3 图像的显示(重点)
游戏是给玩家提供视觉冲击的,如果画面显示出了问题,那整个游戏再好玩都大打折扣。由于Easyx没有提供擦除图片的函数,游戏的显示是靠图片的不断覆盖,于是图片显示的顺序就要安排好,既要对玩家操作实时反馈,又要确保画面衔接无缝,于是函数的安排要很讲究。
3.4 攻击及(即)位移(重点)
大多数人在听到塔防游戏时都觉得怪物按照既定路线移动和防御塔的攻击根本不搭边且都很难实现,但我认为这比前一项更容易,且两者之间有很大的相似性怪物移动有目标防御塔攻击也有目标,这样一想就很容易了,只需要其坐标不断逼近目标即可,于是只需测量特定点的坐标,即可实现怪物自动移动,追踪怪物坐标即可实现防御塔追踪攻击。这个功能的实现可就简单多了,但转念一想,是因为有确定的思路而使其简单,如果前一项功能我也有思路也不至于几天毫无进展,所以做任何事尤其是搞开发的,都要先有一个明确的思路。
只是这位移函数并不好写,开始我简单的让x1,y1自加自减,效果可想而知,再后来我写出了类似这样的鬼代码,速度时不时突变,会闪现或上下颤动,fabs(*x2 - *x1) < fabs(*y2 - *y1) && fabs(*y2 - *y1) / fabs(*x2 - *x1) > 3 && fabs(*y2 - *y1) / fabs(*x2 - *x1) < 10提到速度使我想起了相似,也就是勾股定理,这样就差不多了,这是改进后的:dis = sqrt(disy * disy + disx * disx);speedy = fabs(disy * *speed / dis);speedx = fabs(disx * *speed / dis);果然还是有思路最重要。
3.5 技巧的使用
虽然游戏制作很硬核,但其中不乏一些有意思的地方,比如查看代码,你会发现有几处相似的地方,如Victory()和Lose()函数只是显示了不同的图片,其他基本一样;同种方法用到底,一招鲜吃遍天,项目中大量运用判断变量0和1来实现诸如显示或音乐/音效的开关要素的状态变化等功能;最妙的地方要数坐标的测绘,一开始我只会用Ps的信息来查看坐标,麻烦耗时,直到最近很多功能要做的时候才想到了一个巧妙的办法,看到左上角的生命和金钱值没有,两个数你想到了什么,坐标!map.heart=m.x,map.money=m.就能在左上角直接查看点的坐标,真奇妙!
总之,就是要会做事,找解决问题的捷径。
4 体会与感悟
首先是一个人做项目的感悟,不容易,但也方便许多,尤其是看到别组为分工、注释、看不懂他怎么写的争论不休,有人当甩手掌柜什么都不干,这样令人心烦的现象后,我深感一个人的好处。
学习很重要,掌握一门别人都不会的技能的感觉很好,当看到别人C++在游戏中运用得得心应手,控制台随便调用,我深感自己的不足,但我也学会了不少新技能,比如PS处理图像、格式转换实现批量操作这样的实用功能,没准以后就能用上,所以人要多学习,什么东西多少会一点总没坏处。
抛开项目来谈,就是做事先有一个明确的思路,没有思路,连鼠标操作的接收这样简单的问题都不会,有思路,两个复杂的问题一下子就解决了。
2020级C语言大作业 - 王国保卫战相关推荐
- 2020级C语言大作业 - 丛林大作战
丛林大作战_C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的丛林大作战游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:http ...
- 2020级C语言大作业 - 三国杀
三国杀 C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的简化版三国杀游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https ...
- 2020级C语言大作业 - 鸭王争霸赛
鸭王争霸赛 分享20级同学大一上学期用C语言(及少量C++)实现的鸭王争霸赛.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.b ...
- 2020级C语言大作业 - 小球进框
小球进框 C语言作业 分享20级同学大一上学期用C语言(及少量C++)实现的小球进框游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https:/ ...
- 2020级C语言大作业 - 以撒的结合
以撒的结合 C语言 分享20级同学大一上学期用C语言(及少量C++)实现的以撒的结合.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://p ...
- 2020级C语言大作业 - 喵斯快跑
分享20级同学大一上学期用C语言(及少量C++)实现的喵斯快跑(音游).由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baid ...
- 2020级C语言大作业 - 火柴人打羽毛球
分享20级同学大一上学期用C语言(及少量C++)实现的火柴人打羽毛球.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:https://pan.baidu ...
- 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音 ...
- 2019级C语言大作业 - 火柴人试炼之地
火柴人试炼之地 C语言大作业 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音乐素材.可执行程序可以从百度网盘下载: 链接:https://pan.baidu.com/s/1X ...
最新文章
- 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...
- 【Linux】一步一步学Linux——wall命令(237)
- 修改了一下voddown.py
- 高性能计算机 和服务器,一种高性能计算机服务器
- 将数组绑定到dropdownlist上
- python测验3_基于Python3的漏洞检测工具
- python全栈还是大数据好_青岛PYTHON全栈应用开发班
- 走上这条路,也许是缘份
- 这几个公众号带你看看BAT的工作情况
- 九、模型文档编辑器(生成项目文档)
- flask入门2-模板引擎
- 算法学习——枚举之最简真分数
- 云服务器真假辨别奥秘
- Spire.Cloud 在线协同编辑Word文档
- 自动登录163邮箱的批处理
- windbg 查看结构体_Windbg入门实战讲解
- 关于苹果ID用哪些邮箱注册比较好安全?
- bresenham算法画圆c语言,bresenham画圆算法
- html合并单元格和其中的数据,巧妙提取合并单元格及对应单元格数据
- LAIC2022之犯罪事实实体识别(基于飞桨UIE+半监督)
热门文章
- Java实验9 T5. 给当前的类文件添加行号拷贝到txt文件
- Tensorflow中的name_scope和variable_scope
- 在eclipse中使用第三方库总结
- 1.linux系统基础笔记(互斥量、信号量)
- 深度剖析Java数据结构之表(二)——List接口
- 浅析SVM中的对偶问题
- [18/11/22] 将点分十进制的IP地址化成二进制输出
- 【Java】 剑指offer(4) 替换空格
- 第一次使用并配置Hibernate
- 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?...