[内附完整源码和文档] 基于Qt实现的植物大战僵尸游戏

1.总体介绍
本次大作业,用面向对象的思想和方法,在实现了所有基本功能以外,还实现了许多其他的附加功能。

3.植物与僵尸的设计
3.1 植物的设计
本次大作业实现了三种植物,向日葵(sunflower)、豌豆射手(pea)、坚果墙(wallnut),均继承自父类 plant 类。

3.1.1 植物类(plant)
plant 类是所有植物的父类,其成员变量为所有植物共同的属性,life(生命值),price(消耗阳光值),coolingtime(冷却时间),row、col(所在的行和列数),mediaPlayer_plant(种植时的声音),plantSwingMovie(植物不在攻击状态时的动画)等等。

在构造函数里,初始化了 mediaPlayer_plant,保证每种一个植物时会有对应的音效播放。

3.1.2 向日葵类(sunflower)
除了继承自父类的成员变量外,自己的成员变量全部和生产阳光有关。另外还有一个 slot : slot_produceSunshine() ,这个slot 的功能是让每个向日葵每段时间(10 秒)自动产生一个阳光。

在构造函数里,初始化了向日葵的动画、自己的时间器、和阳光。

3.1.3 坚果类(wallNut)
因为坚果只有挨吃这一项功能,所以除了继承自父类的成员变量外,并没有自己的成员变量。只是在构造函数里将冷却时间和价格初始化了。

3.1.4 豌豆射手(pea)
除了继承自父类的成员变量外,另外还有 attackNumber(攻击力),shootingTriggerTimer(控制射击的时间器),bulletList(子弹的list)。

在构造函数里,初始化了自己的成员变量,并且将子弹射击的间隔设置成了 1.4 秒,结合 pea 类自己的 slot:slot_shootingbullet 就可以实现自动射击。

3.2 僵尸的设计(zoobie)
本次大作业实现了三种僵尸,普通僵尸(zoobie),铁桶僵尸(bucketZoobie),撑杆跳僵尸(poleVaultingZoobie),后两种僵尸均继承自普通僵尸。

注:我在一开始命名时将僵尸的英文 zombie 打成了 zoobie,由于发觉过来时程序基本已经写完了,想改回来已有心无力,请谅解这个低级的拼写错误。

3.2.1 普通僵尸(zoobie)
zoobie 类有所有僵尸的共同属性,生命值(life)、移动速度(movingSpeed)、攻击力(damagenumber)、所在行(row)、是否正在吃植物(isEatingPlants)、自己的计时器( zoobietimer )、 走 路 和 吃东西 时 的 两 个 动 作(zoobieMoveMovie、zoobieEatingMovie)。还定义了两个slot , slot_zoobiePositionChange( 僵 尸 位 置 改 变 ) 、slot_zoobieActionChange(僵尸动作改变)。在构造函数里,将吃东西的声音、僵尸的动作初始化。

3.2.2 铁桶僵尸(bucketZoobie)
继承自 zoobie 类,由于铁桶僵尸和普通僵尸除了血厚一点没有其他优势,所以它除了继承自父类的成员变量外,没有自己的成员变量。在构造函数里,将成员变量初始化。

3.2.3 撑杆跳僵尸(poleVaultingZoobie)
继承自 zoobie 类。因为有撑杆跳这个功能,所以这个类除了继承自父类的成员变量外,还有为撑杆跳专门设置的成员变量,isToVault(是否将要跳)、hasVaulted(是否已经跳过了)等等,重写了2 个 slot : slot_zoobieActionChange 和slot_zoobiePositionChange. 以下表格体现了一个撑杆跳僵尸从开始出现到越过一个植物后吃东西的完整的实现逻辑。

各个状态 hasVaulted isToVault isEatingPlants
走路(没遇到植物) false false false
第一次遇到植物 后,(还没跳) false True false
第一次遇到植物 后,已经跳了 true false false
第一次遇到植物 后,正常走路 true false false
第一次遇到植物 后,吃东西 true false true
每个僵尸均有自己的 timer,每隔 20ms 检查一遍僵尸的状态参数是否变化,发生变化后就执行 slot 里不同的 case。实现了程序接口和实现的分离。

4.游戏逻辑
4.1 摆放的植物自动根据特性攻击僵尸
gamewindow 里实现了修改植物和僵尸状态的 slot:slot_change_P_and_Z_state(),一旦僵尸出现在游戏画面中,这个 slot 会遍历所有植物并检查是否符合条件,一个符合条件则修改植物和僵尸各自的 flag 标记。植物和僵尸自己的 slot 一旦检测到 flag 变化,则会触发相应的动作。简单运用了老师在课上讲的观察者模式,实现了接口和实现的分离。

4.2 僵尸在屏幕上出现,前进并攻击植物
gamewindow 这个类里有三个 slot 来实现每隔一段时间自动刷新僵尸,分别是slot_produceZoobie, slot_produceBucketZoobie, slot_producePoleVaultingZobie,并且随着游戏进程的推进,产生僵尸的概率将会越来越高。增加游戏的难度。

前进并攻击植物的实现也是通过 3.1 里所描述的方法 , 在slot_change_P_and_Z_state()里改变 flag,僵尸自己一旦检测到 flag 有变化机会触发相应的动作。由此实现了接口与实现的分离。

4.3 游戏结束
4.3.1 游戏胜利
gamewindow 下的 slot:slot_checkGameWin 负责游戏胜利的判断。游戏胜利需要满足以下两个条件:

每个僵尸出现的轮数 >= 上限

存储僵尸的 list 判定为空

满足之后这两个条件后触发函数 func_gameWin,播放胜利动画和音效,暂停所有计时器。

4.3.2 游戏失败
gamewindow 下的 slot:slot_checkGameLose 负责游戏失败的判断。这个 slot 对每一种僵尸 list 里的每一个僵尸进行判断,如果它的 x 坐标小于一定的值,则触发函数 func_gameLose,播放失败动画和音效,暂停所有计时器。

4.4 删除死亡的僵尸和植物
gamewindow 下的 slot_deleteDeadZoobie 和 slot_deleteDeadPlant 负责删除死亡的僵尸和植物。对每一个僵尸和植物进行遍历,如果生命值(life)<= 0, 则在相应的 list 中删除它。

在这里插入图片描述
在这里插入图片描述

完整的源码和详细的文档,上传到了 WRITE-BUG技术共享平台 上,需要的请自取:

https://www.write-bug.com/article/3100.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351