# 基于QT实现的植物大战僵尸游戏
# 1 系统需求分析
当可怕的僵尸入侵的时候,谁能想到,弱小的植物能承担起保卫家园的责任?也许你早听 说过那些没有脑子的僵尸席卷整个街区、吃掉一户一户屋主人的脑子的故事。但这次,你终于 要真正面对入侵自己家园的僵尸了。有僵尸在你的草坪上!
草坪是植物们的领地。面对疯狂践踏的入侵者,植物们不惜以自己的身躯阻挡僵尸前进 的道路。可是僵尸的利齿不仅可以用来吃掉脑子,还可以用来吃掉植物。面对挡路的一切东西, 僵尸们选择:吃掉它们!
用什么来保卫你自己的家园和脑子呢?我们只有勇气,和自己手中的那把小铲子。
试设计游戏,并实现以下功能:
- 拥有图形界面,如游戏主界面和准备界面
- 能完成游戏操作,如放置植物,删除植物,生成僵尸,攻击等操作
- 正确且合理的胜负判断
- 实现卡牌冷却效果
- 两个场景的选择,晴天和黑夜
- 背景音效的实现,如碰撞,放置植物以及收集阳光等
- 正确显示阳光槽,植物卡牌槽等部件
- 实现九种植物和七种僵尸
- 实现调试功能,按下一些按键可以执行一些特殊操作,比如快速产生僵尸和增加阳光
- 实现代码层级的一些基本要求,如面向对象的继承派生多态等机制,文件操作(读取 媒体资源文件,读取记录用户名和游戏最长时间的文本文件),一些基本数据结构的使用 (如 list,map,set)等
# 2 总体设计
植物大战僵尸是一款游戏非常经典的益智类游戏,画风友好,玩法多样,整体逻辑比较 清晰。本次我选择使用 c++的 GUI 库 Qt 来写复现游戏。总体上来说完成了游戏加载界面,菜单选择界面,主游戏逻辑和交互界面和游戏的基本功能。由于手头的资源有限(比如植物 和僵尸的贴图)以及时间等方面的限制,本游戏实现了了七种僵尸和九种植物,以及白天和 黑夜两个场景模式,具有了一定的可玩性。
首先谈一下我在初期设计的主要想法。我认为,同为程序,不同种类的程序的开发思路 是截然不同的。比如设计一个数据管理系统和游戏的思路是截然不同的。我认为游戏的最 大特点在于它是一种交互性极强的产品形式,而且一般工程量较大,需要兼顾内在逻辑和 外在用户交互界面,并且由于和用户的交互性极强,操作多样化,非常适合面向对象的开发 思想。因此本次自选题我选择了实现植物大战僵尸这一经典的游戏。
基于自己的水平考虑,我选择了非常常规的经典面向对象的思路,定义良好的复用性强 的基类,如果想要添加新的对象和功能,只需要从基类派生并将新类加入生成器。在逻辑和 UI 界面的关系选择上,让每个游戏对象负责处理自己的逻辑和动画,而不是将逻辑和画面 完全分开,每回合逻辑执行完成后渲染画面。因为前者虽然效率低了一些,但是总体上说更 符合人的思路,对前期的架构设计要求也没有那么高,可以后期逐步完善,拓展性更强一 些。
而在要求上,我完成了必须要求
- 函数重载
- 类的继承和抽象基类
- 动态分配 内存和文件操作
- 使用了 list 和 set 等数据结构
总体上来说,需要实现的模块和功能有:
- **渲染场景**:包括加载欢迎界面和游戏主界面
- **多种植物**:游戏的主要实体对象之一
- **多种僵尸**:游戏的主要实体对象之一
- **多种飞行物**:如豌豆、孢子等,也是游戏的重要对象
- **多种动画**:在游戏中需要根据实物的状态来更新各种动画
- **奖励物**:阳光等
- **多种卡片**:主要指的是种植植物是选择的卡片,需要完成冷却功能
考虑到他们都具有相同的一些特性(例如都是实体对象,都有贴图,位置,自己的主逻辑函 数函数),而且为了方便主逻辑中队每个对象的遍历(如更新状态,删除对象),因此我定义了 zObjcet 类作为共同的基类,由 zObject 类派生出其余的类别。而 zObject 类本身由 Qt 的基本 类别 QLabel 派生,因为 QLabel 本身属于最简单的基本对象,而且具有贴图,播放动图,设置 大小等基本功能,非常适合派生出其他对象并在此基础上增加功能。
游戏的类大致结构如下图(具体结构见下方 UML 图),接下来将详细介绍程序的内容。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/fc666e3d2bea5012ce66ab2559159c4e.writebug)
# 3 详细设计
## 3.1 基本对象 —— 架构、类的派生关系
本游戏的 UML(缩略图)如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/66d8ac1f47d1ef4ab850b2b8f024c19a.writebug)
本程序一共定义了 52 个类,除了一个继承自 Qt 最基本空间 QDialog 的 mianDialog 类用于 生成游戏基本图形界面框,其余所有类都继承自 zObject 类,而 zObjcet 类自身继承自 Qt 自带 基本类型 QLabel。
按照功能,zObject 类直接派生出七个类,分别对应上文所说的七种实体类别和功能,七个 大类分别再派生出具体的小类别,如 zPlant 类下派生出 9 种具体的植物类,而七种基类不参与 具体的对象实例化,这样的优点是逻辑清楚,方便管理。下面我将主要介绍基类和其派生出的 七个基本大类。
### 3.1.1 基类:zObject
其代码实现如下:
```c++
class zObject : public QLabel
{
Q_OBJECT
public:
explicit zObject(QWidget* parent = 0);
bool alive = true;
virtual void act()=0;
int strength = 1;
zScene* scene;
};
```
基类 zObject 自派生 QLabel,因为 QLabel 非常合适定义基本实体:QLabel 的 SetMovie 配合 QMovie 是显示游戏动画(素材为 gif 格式)的便捷利器;而且 QLabel 也没有什么 多余的属性与方法,基本来自 QWidget,只是一个普通的窗口组件。
bool alive,表示它是否活着。本属性不一定表示通俗意义的“活着”,比如一个动 画播放完了,我们就可以把 alive 置成 false,等着逻辑来把它删掉,可以用将本属性当作 标记,交给逻辑中专门的死亡处理机制,从外部释放掉内存空间,并把对象删除。
virtual void act()=0。这个虚函数就是游戏内所有对象的核心逻辑函数。主逻辑的重要功 能就是调用场上一切“活着”的对象的 act()来构成整体逻辑。
int strength 表示生命值。只有植物和僵尸有这样的属性,但是还是写进了接口。其余对 象默认置 1 即可。
zScene\* scene 提供了一个指向自己所处的 zScene 的指针,便于 act()逻辑来访 问一些全局的对象。zScene 是游戏场景类,也由 zObject 派生。由于 parent 指针指向的 是 QWidget 而不是 zScene,此处 parent 指针没法优雅的访问 zScene 的一些特殊属性。parent 强制转化为 scene 以后就没有了这个问题。
### 3.1.2 场景管理类:zScene
zScene 是负责管理其他类的类,在它的属性里面有包含其余类对象的容器 QList,而其 余类也有指向所在场景的指针。ZScene 派生出四个具体类:zStartScene, zStartScreen, zLawnScene, zDarkScene,分别对应开始界面,开始选关界面,白天关卡界面,和夜晚关卡 界面。
### 3.1.3 主要实体类:zPlant 类和 zZombie 类
这两个类具有很多相似的之处,因此放在一起介绍。zPlant 和 zZombie 是两种基本的对象, 负责派生出各种丰富多彩的植物和僵尸。其共同点是都有 virtual void hit(int damage, bool silence = true)方法,供其余对象调用,对它产生伤害。植�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
精选_基于QT实现的植物大战僵尸游戏_源码打包 (120个子文件)
zscene.cpp 17KB
zzombie.cpp 12KB
zplant.cpp 8KB
zcard.cpp 5KB
zflyingobject.cpp 4KB
zanim.cpp 2KB
zbonus.cpp 2KB
maindialog.cpp 1KB
main.cpp 173B
zobject.cpp 154B
background3_2.gif 295KB
PoleZombieWalk.gif 104KB
ZombieShield.gif 98KB
NewsWalk_1.gif 94KB
Zombie_1.gif 78KB
ZombieCone.gif 72KB
Zombie.gif 65KB
ZombieFlag.gif 63KB
NewsWalk.gif 61KB
PoleZombieAttack.gif 61KB
ZombieAttack.gif 58KB
Zombie_2.gif 56KB
ZombieShieldAttack.gif 53KB
Boom.gif 53KB
PoleZombie.gif 52KB
NewsLost.gif 51KB
ZombieBucket.gif 50KB
ZombieFlagAttack.gif 48KB
ZombieBucketAttack.gif 45KB
PoleZombieJump.gif 44KB
Sun.gif 42KB
ZombieConeAttack.gif 40KB
SunFlower.gif 40KB
NewsAttack_1.gif 38KB
NewsAttack.gif 30KB
Repeater.gif 28KB
Wallnut_2.gif 27KB
PoleZombieJump2.gif 26KB
IcePeaShooter.gif 25KB
NewsDie.gif 24KB
Peashooter.gif 21KB
ZombieDie.gif 21KB
WallNut.gif 20KB
FireTree.gif 20KB
BurnDie.gif 19KB
PoleZombieDie.gif 18KB
NewsHead.gif 17KB
CherryBomb.gif 16KB
ZombieHead.gif 15KB
Wallnut_1.gif 14KB
PoleZombieHead.gif 12KB
PotatoMine.gif 12KB
Mushroom.gif 10KB
Mush.gif 2KB
PotatoMine_mashed.gif 2KB
PeaFire.gif 907B
Fire.gif 817B
PeaIce.gif 650B
PeaHit.gif 615B
Pea.gif 602B
PotatoMine_1.gif 495B
zscene.h 3KB
zplant.h 3KB
zcard.h 2KB
zzombie.h 2KB
zanim.h 2KB
zflyingobject.h 1KB
zbonus.h 813B
maindialog.h 432B
zobject.h 322B
app.ico 1.44MB
myapp.ico 50KB
background6.jpg 184KB
background5.jpg 166KB
background3.jpg 141KB
StartScreen.jpg 124KB
background2.jpg 111KB
background4.jpg 99KB
background1.jpg 95KB
Title.jpg 45KB
LICENSE 1KB
README.md 21KB
基于QT实现的植物大战僵尸游戏.pdf 3.22MB
PVZ_UML.png 540KB
mainlogo.png 97KB
mainlogo.png 97KB
zombatar_background_menu.png 63KB
zombatar_background_crazydave.png 45KB
card_Sunflower.png 11KB
card_IcePeaShooter.png 11KB
card_Mushroom.png 11KB
card_PotatoMine.png 10KB
card_PeaShooter.png 10KB
card_Repeater.png 10KB
card_FireTree.png 10KB
card_CherryBomb.png 10KB
card_WallNut.png 9KB
Leave.png 4KB
Shovel.png 1KB
SunBack.png 1KB
共 120 条
- 1
- 2
资源评论
工具盒子
- 粉丝: 58
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 信息办公个人求职管理系统-jobgljsp.rar
- 信息办公一流网络JSP网络管理系统 v1.0-yljsp10.rar
- chirpstack学习
- 管家婆辉煌、财贸、工贸、服装,食品,千方模拟狗
- 基于python开发的工业环境老鼠检测+源码+文档(毕业设计&课程设计&项目开发)
- USB转以太网的芯片SR9900全套设计资料包括(参考设计原理图PCB+ Linux -Windows驱动程序+量产工具)
- 信息办公XML考试系统-xmlks.rar
- 基于python开发的无人机图像目标检测+实验数据+开发文档+操作流程+源码(毕业设计&课程设计&项目开发)
- 全球智能商品管理与优化系统
- IDM下载器(电脑小工具)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功