不一样的坦克大战 C++实训作品展示

坦克大战是C++实训课完成的大作业。

游戏介绍

游戏分为红、蓝、粉、绿四队,不同于普通的坦克大战,玩家不能单枪匹马完成游戏任务,需要和其他队友合作,占领一座座城市。

游戏中,需要同时注重战略性和战术性。玩家和AI进行对抗、协作,阐明战争不是英雄主义的世界,是每一个单位凝聚起的一种抽象的力量。一次成功的游戏必须建立在战略上深刻思考和战术上的敏捷。

游戏规则

上下左右键操控坦克(玩家的坦克带光环),空格发射炮弹,每个己方城市都会定期生产出坦克。

目标:占领地图中所有的城市并消灭所有敌人。

地图系统

共有5个地图,分别为割裂、基地、乱战、实验室和统一。

图为实训上台展示的幻灯片。

项目难点

Bot系统

由算法控制的敌人和队友既不能过于敏捷和自主,让玩家产生挫败感,也不能过于迟钝,让玩家感到厌倦和无聊。因此,在对Bot系统进行编写时,需要抓住这个平衡点,才能给玩家带来最好的游戏体验。

在此游戏中,Bot通过权重竞争决定行为(例如是占城市还是打敌人,撤退还是继续进攻)。系统实现了识别敌我关系、根据敌人分布判断偷家、智能跟随玩家和一定的战略判断能力。

碰撞检测

最开始,通过遍历所有单位的坐标挨个进行碰撞检测。但随着游戏元素的不断丰富,游戏单位的增加导致这种算法十分吃力。因为每一个单位都需要对所有单位进行遍历,浪费了许多计算资源。

改良后,我将单位的引用保存在了一个三维vector,把地图分为4096个区块,每个单位对周围四个区块进行检测,极大地提高了游戏逻辑运算效率。尽管已经满足性能要求,但通过单元分布动态切割区块,其实可以进一步降低计算量。

与代码相剥离的地图系统

在开发时,将地图数据和程序代码相剥离。地图地形和代码没有直接关系。

因此,在程序还没有正式开发前,通过和组员商定好地图标准,可直接同步推进项目,提高程序开发效率。

程序结构

程序采用游戏引擎惯用的开发结构,将所有游戏单位的基类设置为『GameObject』,并在其上添加功能。

程序尽量避免使用全局变量,各个类之间耦合度很低,几乎没有重复代码,非常方便后期维护和添加功能。例如,我希望增加双人模式,或希望实现网络对战,都很容易在Player类中进行拓展,不会影响到游戏的其他部分。

并且,程序对所有可碰撞单元和进入游戏逻辑帧的单位进行列表统一处理,再一次保证了未来游戏拓展时的可维护性。

我的分工

我是项目的组长。负责实训计划书、周报、PPT的编写、确定小组开发方向和进度、游戏玩法和模式,并主要负责有关前端设计的QML、QML与C++通讯代码和游戏C++代码的编写。同时准备答辩内容。

开发收获

经过这次开发,我了解游戏运行的基本机制,包括帧处理、渲染、控制、游戏元素操控,在开发过程中熟悉面向对象思维,熟练运用继承、多态、指针等思想,懂得降低模块间耦合度,提高程序可维护性,写出高效、安全、优雅、可用的代码。

同时,借助Qt Quick初步接触了MVVM思想,通过QML标记语言实现快速的前端UI搭建。对于软件开发的工程化原理有着一定的认识,获得一定的团队协作经验。

开发心得

在开发中,由于Qt当时有两个技术栈,分别为Widget和QML。我刚刚注意到,其他使用Qt技术栈的小组都是选用Widget方案。而我为了学习相对先进的思想(和懵懂无知),最终选择了以QML标记语言作为前端进行开发。

事实证明,这是一个非常不幸的选择。在开发过程中,由于中文资料极少,英文资料也不多,很多设计思想必须翻阅英文官方文档慢慢体悟。再加上Qt QML技术并不成熟,在开发过程中遇到了许多框架自己的bug,对开发造成了很大的阻碍。之前展示的三大项目难点,其实都远没有框架本身带来的困扰和痛苦多。不过,最终能克服了这些困难,并做到了游戏过程中基本没有bug,还是一件非常有成就感的事情。

游戏中,所有代码、设计思路、游戏理念全部是原创的。仅有QML与C++沟通的关键代码修改自官方文档。如果有机会,未来会通过WEB对游戏进行重写、实现多人联网对战,并通过卷积神经网络进行深度学习,重新编写AI。

成品下载

链接: https://pan.baidu.com/s/1OizvJPDXp5naTgULk59xeg 提取码: dijs

欢迎来到Yari的网站:yar2001 » 不一样的坦克大战 C++实训作品展示