文章目录
🌟 Hello, 代码世界! 🚀我是小柚子,一个穿梭在0和1之间的数据侠客。🛡️ 我的键盘就是我的武器,试探你就是我的魔法。🧙♂️
🎯 我的使命:
解决bug是我的日常,优化性能是我的追求。
守护着一个巨大的数据保险箱,将潜在的威胁隔离在安全区域之外。
📚 学习不息:
我坚信学习是成长的阶梯,在CSDN记录我的技术探索之旅。
学习接触更多前沿的技术,跟紧技术前进的步伐。
如果你对我的技术文章感兴趣,或者想要一起探讨技术问题,欢迎来交流!
订阅文章即可获取源码!
一、引言
在本次课程设计中,我们选择了用 C++ 语言实现经典游戏《植物大战僵尸》的部分功能。这个过程充满了挑战和乐趣,也能让我们对 C++ 语言的运用有了更深入的理解。
二、课程设计目的
巩固和加深对 C++ 语言基础知识的理解和掌握。
培养我们的编程能力、问题分析能力和解决问题的能力。
通过实际项目的开发,了解游戏开发的基本流程和方法。
三、课程设计要求
1、实现游戏的基本界面,包括游戏窗口、菜单、状态栏等。
2、设计并实现植物和僵尸的类,包括它们的属性和行为。
3、实现游戏的核心逻辑,如植物种植、僵尸移动、攻击等。
4、加入音效和动画效果,增强游戏的趣味性。
三、开发环境准备
操作系统:Windows 10
开发工具:Visual Studio 2019
编程语言:C++
四、游戏设计与实现
1、策划
1.1 剧情概述
《植物大战僵尸》游戏是一款极富策略性的小游戏,此游戏集成了即时战略、塔防御战等要素,游戏的内容是:可怕的僵尸即将入侵,唯一的防御方式就是栽种植物。由玩家控制植物,种植各种特色不同的植物来抵御僵尸的进攻,保护这片草坪。不同的僵尸会有不同的难度,也有不同的玩法,增加了游戏挑战性。
1.2 关卡设计
针对对场景样式,设置了植物作战区域、种植植物的动画区域、植物种植的草坪区域,将植物种植在僵尸行进的行列中,发出相应的攻击。一共分为三个关卡,第一关会由一波普通僵尸袭来,第二关会由少量的摇旗僵尸袭来,第三关将由大量的路障僵尸袭来,当玩家用植物抵御所有的僵尸后,游戏将终止结束,玩家胜利。如图所示:
- 图1 关卡设计
1.3 游戏玩法
1.3.1 玩法要点
植物大战僵尸》游戏主要进行的是草地作战模式,以后院草坪为主要场景,场面开阔,游戏开始系统将会有开始游戏的提示,玩家可以通过点击提示种植植物来抵御来袭的僵尸。草坪上可种植不同的植物,玩家可利用每一种植物的不同功能来抵御僵尸、消灭僵尸。植物的搭配、战斗时的阵型、植物与僵尸相遇时是战是防这都属于战术的范畴,需要先分析情况,再做出决定,最终消灭僵尸以达到通关的目的。
1.3.2 游戏控制(PC)
游戏运行处在PC端游戏运行处在PC端,移动鼠标控制视角,鼠标左键进行操作,如图2。
图2 玩家行动控制
1.4 角色及道具设计
表1角色设计
物品 | 说明 |
---|---|
豌豆射手 | 最普通的植物,每次攻击射出一发豌豆 |
寒冰射手 | 高级一点的豌豆,每次攻击发射一颗冰豌豆 |
食人花 | 最普通的僵尸,是第一波攻关的主角僵尸 |
普通僵尸 | 最普通的植物,每次攻击射出一发豌豆 |
摇旗僵尸 | 旗帜僵尸就是一个拿着旗子的普通僵尸,除了拿着旗子,速度比普通僵尸略快,旗子掉时僵尸死亡 |
摇旗僵尸 | 旗帜僵尸就是一个拿着旗子的普通僵尸,除了拿着旗子,速度比普通僵尸略快,旗子掉时僵尸死亡 |
路障僵尸 | 他的路障帽使他比普通僵尸强壮两倍。头顶路障的僵尸,生命力中等,移动速度与普通僵尸一样慢,需将路障打下来才能伤害到僵尸 |
- 图3 角色设计功能导图
1.5 战斗数值平衡
1.6 UI界面设计
- 使用 C++ 的图形库(如 SFML、SDL 等)创建游戏窗口。
- 设置合适的窗口大小和标题,为玩家提供一个良好的视觉体验。
设计游戏菜单,包括开始游戏、继续游戏、游戏设置、退出游戏等选项。玩家可以通过菜单选择不同的操作。
在游戏窗口中显示状态栏,显示玩家的金币数量、阳光数量、关卡进度等信息。
游戏的界面效果设计,以整体的植物种类众多,使游戏风格趋向协调统一,UI背景采用了颜色鲜明的渐变,意在用较强的视觉冲击,吸引玩家对游戏主打植物的注意力,抛开僵尸的部分,用艳丽的色彩引导玩家熟悉游戏主体。界面显示效果如图4。
- 图4 开始游戏界面
1.7 植物类设计
- 定义植物类,包含植物的属性如生命值、攻击力、攻击范围、种植所需阳光等。
- 实现植物的行为,如攻击僵尸、接收阳光、生长等。例如,向日葵可以不断产生阳光,豌豆射手可以发射豌豆攻击僵尸。
class Plant
{
public:
int health;
int attackPower;
int attackRange;
int cost;
virtual void attack(Zombie* zombie) = 0;
virtual void receiveSunshine(int amount) = 0;
virtual void grow() = 0;
};
class Sunflower : public Plant
{
public:
Sunflower()
{
health = 100;
attackPower = 0;
attackRange = 0;
cost = 50;
}
void attack(Zombie* zombie) {}
void receiveSunshine(int amount) {}
void grow() {}
};
class Peashooter : public Plant
{
public:
Peashooter()
{
health = 100;
attackPower = 20;
attackRange = 5;
cost = 100;
}
void attack(Zombie* zombie)
{
// 发射豌豆攻击僵尸
}
void receiveSunshine(int amount) {}
void grow() {}
};
1.8 僵尸类设计
- 定义僵尸类,包含僵尸的属性如生命值、移动速度、攻击力等。
- 实现僵尸的行为,如移动、攻击植物、吃植物等。不同类型的僵尸可能具有不同的属性和行为,例如普通僵尸移动速度较慢,铁桶僵尸生命值较高。
class Zombie
{
public:
int health;
int speed;
int attackPower;
virtual void move() = 0;
virtual void attack(Plant* plant) = 0;
virtual void eatPlant(Plant* plant) = 0;
};
class NormalZombie : public Zombie
{
public:
NormalZombie()
{
health = 100;
speed = 1;
attackPower = 10;
}
void move()
{
// 实现僵尸移动逻辑
}
void attack(Plant* plant) {}
void eatPlant(Plant* plant) {}
};
class BucketZombie : public Zombie
{
public:
BucketZombie()
{
health = 200;
speed = 0.8;
attackPower = 15;
}
void move()
{
// 实现僵尸移动逻辑
}
void attack(Plant* plant) {}
void eatPlant(Plant* plant) {}
};
2、 设计与实现
2.1 整体框架
基于游戏功能需求,其整体框架包括各个模块及其对应功能。首先运用建造者模式、观察者模式、工厂模式、状态模式,再根据游戏情节完善框架细节,确定出具体的类(方法、变量、属性),并画出类图。
(1)场景管理类:利用状态模式控制启动页、战斗页面、背景视频介绍、关卡选择、关卡一等场景状态的切换。利用状态模式控制功能选择页面、战斗页面、退出画面等场景状态的切换。
(2)角色模块:分为植物类和僵尸类,共同继承角色类,植物类拓展了角色的子弹攻击和防备等子类。
(3)玩家系统:通过玩家管理类对UI显示界面进行管理,用UI显示界面的控件实现游戏的开始和结束。
(4)事件系统和UI系统:通过事件的注册与监听控制UI关卡的显示、消失及变换。
(5)音频系统:通过设置和添加timer控件,开启时钟以及动态图的实现使画面具有视频的效果,控制游戏对象的出现、消失和改变,达到更好的视觉效果。
2.4 游戏逻辑实现
处理玩家的输入,如种植植物、收集阳光等。玩家可以通过鼠标点击游戏窗口中的相应位置来进行操作。
控制僵尸的生成和移动。在每个关卡中,根据一定的规则生成不同类型的僵尸,并让它们朝着玩家的基地移动。
实现植物和僵尸之间的战斗逻辑。当僵尸进入植物的攻击范围时,植物会自动攻击僵尸。僵尸也可以攻击和吃掉植物。
管理游戏的进度和关卡。根据玩家的表现,决定是否进入下一关或者游戏失败。
2.3 模块详细设计
- (1)UI子系统
UI子系统采用了状态模式。其中一个对象的行为会取决于它的状态,并且它在运行时会根据状态改变它的行为,它也会通过定义新的子类很容易地增加新的状态和转换。如图5所示。 - (2)关卡子系统
关卡子系统采用了观察者模式。观察者将根据僵尸的死亡数量玩家,然后进行植物的种植以及关卡状态的切换。如图6所示。
(3)角色管理子系统
角色管理子系统采用了建造者模式、工厂模式。建造的角色分为植物、僵尸,工厂模式中的植物工厂生产出了豌豆射手、寒冰射手和食人花;僵尸工厂生产出了普通僵尸、旗子僵尸和路障僵尸。子弹建造者还生产出植物所需要的子弹。如图7所示。
- 图5 UI子系统
- 图6 关卡子系统
图7 角色管理子系统
3、 总结
这次的课程设计,应用了C#的基础知识,还使用了设计者模式中的状态模式、建造者模式、工厂模式以及观察者模式等模式,我们需要在开源的代码中增加代码来实现个人的设计 。在工厂模式中创建寒冰射手在放置时不会出现寒冰射手,检查发现FumeShroomBullet类中的名称和地址有错误,改对之后就是寒冰射手在攻击僵尸。在创建摇旗僵尸这个角色的时候会发现要调整它的出场顺序,而且它只会一波一波的出现,只有在前一波僵尸完全死后它才会出现,不会同时出现。
🚀 结语:感谢你阅读到这里,希望我的分享能给你带来启发。让我们一起在技术的海洋中航行,探索未知的大陆!