Windows程序之植物大战僵尸

🌟 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 关卡设计
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类中的名称和地址有错误,改对之后就是寒冰射手在攻击僵尸。在创建摇旗僵尸这个角色的时候会发现要调整它的出场顺序,而且它只会一波一波的出现,只有在前一波僵尸完全死后它才会出现,不会同时出现。

🚀 结语:感谢你阅读到这里,希望我的分享能给你带来启发。让我们一起在技术的海洋中航行,探索未知的大陆!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢喜躲在眉梢里-柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值