(二十)C++自制植物大战僵尸游戏僵尸进攻控制实现

植物大战僵尸游戏开发教程专栏地址icon-default.png?t=N7T8http://t.csdnimg.cn/8UFMs


文件位置

实现功能的代码文件位置在Class\Scenes\GameScene文件夹中,具体如下图所示。


ZombiesAppearControl.h 

/* 僵尸出现波数控制 */
class ZombiesAppearControl
{
public:/***对于进攻的不同波数创建不同数量僵尸*/int getZombiesNumbersForAppearFrequency(const unsigned int& ZombiesAppearFrequency);/***获取僵尸波数*/int getZombiesAppearFrequency() const;/***获取上一波僵尸是否已经阵亡*/bool getLastFrequencyZombiesWasDeath() const;/***获取计时是否开始*/bool getIsBegin() const;/***获取是否显示文字*/bool getIsShowWords() const;/***获取时间*/double getTime() const;/***使每一行的僵尸等概率出现*/int getEqualProbabilityForRow();/***设置僵尸出现波数* 1.传递参数设置*/void setZombiesAppearFrequency(const unsigned int zombiesAppearFrequency);/***设置僵尸出现波数* 2.自增加一*/void setZombiesAppearFrequency();/***设置上一波僵尸是否死亡*/void setLastFrequencyZombiesWasDeath(bool lastFrequencyZombiesWasDeath);/***设置时间清零*/void setTimeClear();/***设置时间自增*/void setTimeAdd();void setTimeAdd(const double t);/***设置是否开始*/void setIsBegin(const bool isBegin);/***设置是否显示文字*/void setIsShowWords(const bool isShowWords);/***创建不同种类的僵尸*/ZombiesType createDifferentTypeZombies(const unsigned int& ZombiesAppearFrequency);/***创建不同种类的僵尸*/ZombiesType createDifferentTypeZombies();CC_CONSTRUCTOR_ACCESS:ZombiesAppearControl();~ZombiesAppearControl();private:int _zombiesAppearFrequency;               // 僵尸出现波次bool _lastFrequencyZombiesWasDeath;        // 上一波僵尸已阵亡 bool _isBegin;                             // 计时是否开始bool _isShowWords;                         // 是否显示文字double _time;                              // 计时OpenLevelData* _openLevelData;default_random_engine _random;             // 随机数引擎set<int> _judgeZombieRow;                  // 判断僵尸所在行unsigned int _zombiesPosition[5] =         // 僵尸位置{130,268,406,544,682};
};

这段代码是一个名为ZombiesAppearControl的类的定义,用于控制僵尸出现的波数和相关的属性和方法。让我逐个解释一下类中的成员和方法的作用:

成员变量:

  • _zombiesAppearFrequency: 僵尸出现的波数
  • _lastFrequencyZombiesWasDeath: 上一波僵尸是否已经阵亡
  • _isBegin: 计时是否开始
  • _isShowWords: 是否显示文字
  • _time: 时间计时
  • _random: 随机数引擎
  • _judgeZombieRow: 判断僵尸所在行的集合
  • _zombiesPosition: 僵尸位置数组

方法:

  • getZombiesNumbersForAppearFrequency(const unsigned int& ZombiesAppearFrequency): 根据传入的进攻波数返回对应的僵尸数量
  • getZombiesAppearFrequency() const: 获取当前的僵尸波数
  • getLastFrequencyZombiesWasDeath() const: 获取上一波僵尸是否已经阵亡
  • getIsBegin() const: 获取计时是否开始
  • getIsShowWords() const: 获取是否显示文字
  • getTime() const: 获取时间
  • getEqualProbabilityForRow(): 使每一行的僵尸等概率出现
  • setZombiesAppearFrequency(const unsigned int zombiesAppearFrequency): 设置僵尸出现的波数(通过参数设置)
  • setZombiesAppearFrequency(): 设置僵尸出现的波数(自增加一)
  • setLastFrequencyZombiesWasDeath(bool lastFrequencyZombiesWasDeath): 设置上一波僵尸是否阵亡
  • setTimeClear(): 设置时间清零
  • setTimeAdd(): 设置时间自增(默认增加一个时间单位)
  • setTimeAdd(const double t): 设置时间自增(增加指定的时间单位)
  • setIsBegin(const bool isBegin): 设置计时是否开始
  • setIsShowWords(const bool isShowWords): 设置是否显示文字
  • createDifferentTypeZombies(const unsigned int& ZombiesAppearFrequency): 创建不同种类的僵尸(根据传入的进攻波数)
  • createDifferentTypeZombies(): 创建不同种类的僵尸(使用当前的僵尸波数)

构造函数和析构函数:

  • ZombiesAppearControl(): 构造函数
  • ~ZombiesAppearControl(): 析构函数

注释中的代码是C++的语法,描述了类的成员变量和方法的声明。


 ZombiesAppearControl.cpp

构造函数

ZombiesAppearControl::ZombiesAppearControl() :_zombiesAppearFrequency(0)
, _lastFrequencyZombiesWasDeath(false)
, _isBegin(false)
, _isShowWords(false)
, _time(0)
, _openLevelData(OpenLevelData::getInstance())
{_random.seed(time(nullptr));
}

这是ZombiesAppearControl类的构造函数的实现代码。让我逐行解释一下构造函数的功能:

  • ZombiesAppearControl(): 构造函数的定义
  • _zombiesAppearFrequency(0): 将僵尸出现波数初始化为0
  • _lastFrequencyZombiesWasDeath(false): 将上一波僵尸是否已经阵亡初始化为false
  • _isBegin(false): 将计时是否开始初始化为false
  • _isShowWords(false): 将是否显示文字初始化为false
  • _time(0): 将时间计时初始化为0
  • _openLevelData(OpenLevelData::getInstance()): 获取OpenLevelData类的实例并将其赋值给_openLevelData成员变量,这个类可能是游戏关卡数据的管理类或者其他相关类的实例
  • _random.seed(time(nullptr)): 使用当前时间作为随机数引擎的种子,从而生成不同的随机数序列

构造函数的作用是初始化类的成员变量,并对必要的变量进行赋值和初始化操作。这里使用了C++的成员初始化列表来对成员变量进行初始化,以提高代码的效率和可读性。


createDifferentTypeZombies函数 

ZombiesType ZombiesAppearControl::createDifferentTypeZombies(const unsigned int& zombiesAppearFrequency)
{int number = rand() % 100;int sum = 0, i = -1;auto zombiesTypeProbability = _openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesTypeProbabilityFrequency().at(zombiesAppearFrequency);for (auto& probability : zombiesTypeProbability){++i;sum += probability;if (number < sum){return static_cast<ZombiesType>(_openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesType().at(i));}}return ZombiesType::None;
}

这是ZombiesAppearControl类中的createDifferentTypeZombies方法的实现代码。让我逐行解释一下这个方法的功能:

  • ZombiesType ZombiesAppearControl::createDifferentTypeZombies(const unsigned int& zombiesAppearFrequency): 方法定义,返回ZombiesType类型的值,表示创建的不同种类的僵尸。

  • int number = rand() % 100;: 生成一个0到99之间的随机数,表示概率的比较值。

  • int sum = 0, i = -1;: 初始化变量sum为0,用于计算概率的累加值;初始化变量i为-1,用作循环中的索引。

  • auto zombiesTypeProbability = _openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesTypeProbabilityFrequency().at(zombiesAppearFrequency);: 从OpenLevelData类中读取与指定zombiesAppearFrequency对应的僵尸类型概率,并将其赋值给zombiesTypeProbability变量。

  • for (auto& probability : zombiesTypeProbability): 遍历zombiesTypeProbability中的每个概率值。

  • ++i;: 将索引i递增1。

  • sum += probability;: 将当前概率值累加到sum中。

  • if (number < sum): 判断随机数number是否小于概率累加值sum

    • 如果条件成立,说明随机数落在当前概率范围内,执行以下代码块:
      • return static_cast<ZombiesType>(_openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesType().at(i));: 从OpenLevelData类中读取与指定索引i对应的僵尸类型,并将其转换为ZombiesType枚举类型后返回。
  • 如果没有返回值,说明随机数不在任何概率范围内,执行以下代码块:

    • return ZombiesType::None;: 返回ZombiesType::None,表示没有创建任何僵尸类型。

此方法的作用是根据给定的僵尸出现波数,根据概率随机选择一种僵尸类型进行创建。通过比较随机数和概率累加值,确定选择哪种僵尸类型。方法中涉及到了读取关卡数据的操作,使用了OpenLevelData类的实例来获取相关数据。


getEqualProbabilityForRow函数 

int ZombiesAppearControl::getEqualProbabilityForRow()
{uniform_int_distribution<unsigned>number(0, 4);if (_judgeZombieRow.size() == 5){_judgeZombieRow.clear();}unsigned int row;do{row = number(_random);} while (_judgeZombieRow.count(row));_judgeZombieRow.insert(row);return _zombiesPosition[row];
}

这是ZombiesAppearControl类中的getEqualProbabilityForRow方法的实现代码。让我逐行解释一下这个方法的功能:

  • int ZombiesAppearControl::getEqualProbabilityForRow(): 方法定义,返回整数类型的值,表示选择的僵尸所在行。

  • uniform_int_distribution<unsigned>number(0, 4);: 创建一个均匀分布的整数随机数生成器,范围为0到4,用于生成随机行数。

  • if (_judgeZombieRow.size() == 5): 检查 _judgeZombieRow 集合的大小是否为5,即是否已经选择了5行。

    • 如果条件成立,说明已经选择了5行,执行以下代码块:
      • _judgeZombieRow.clear();: 清空 _judgeZombieRow 集合,重新开始选择行数。
  • unsigned int row;: 声明变量 row,用于存储随机选择的行数。

  • do { ... } while (_judgeZombieRow.count(row));: 循环执行以下代码块,直到选择的行数不在 _judgeZombieRow 集合中。

    • row = number(_random);: 生成一个随机行数并将其赋值给 row 变量。
  • _judgeZombieRow.insert(row);: 将选择的行数插入 _judgeZombieRow 集合中,用于记录已选择的行数。

  • return _zombiesPosition[row];: 返回与选择行数对应的僵尸位置。

此方法的作用是在五行中均匀地选择一行作为僵尸出现的位置。它使用了随机数生成器生成随机行数,并通过集合 _judgeZombieRow 来确保每次选择的行数不重复。最后,根据选择的行数返回对应的僵尸位置 _zombiesPosition[row]


getZombiesNumbersForAppearFrequency函数 

int ZombiesAppearControl::getZombiesNumbersForAppearFrequency(const unsigned int& ZombiesAppearFrequency)
{const unsigned int number = _openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesNumbers().at(ZombiesAppearFrequency);return number + rand() % number;
}

这是ZombiesAppearControl类中的getZombiesNumbersForAppearFrequency方法的实现代码。让我逐行解释一下这个方法的功能:

  • int ZombiesAppearControl::getZombiesNumbersForAppearFrequency(const unsigned int& ZombiesAppearFrequency): 方法定义,返回整数类型的值,表示特定僵尸出现波数的僵尸数量。

  • const unsigned int number = _openLevelData->readLevelData(_openLevelData->getLevelNumber())->getZombiesNumbers().at(ZombiesAppearFrequency);: 从OpenLevelData类中读取与给定僵尸出现波数ZombiesAppearFrequency对应的僵尸数量,并将其赋值给常量number

  • return number + rand() % number;: 返回一个在number范围内的随机数,通过将随机数取模number并加上number本身来实现。这样做可以生成一个在0到number-1之间的随机数,然后加上number本身,使得随机数的范围在number2*number-1之间。

此方法的作用是根据给定的僵尸出现波数,从关卡数据中读取对应的僵尸数量,并返回一个在该数量范围内的随机数。这样可以实现每次出现的僵尸数量有一定的变化性。


其他函数 

其他函数非常简单,请自行阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列】Java高并发篇 - 如何停止一个正在运行的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【如何停止一个正在运行的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 如何停止一个正在运行的线程&#xff1f; java如何停止一个正在运行的线程? 在Java中&#xff0c;可以使用Thread.stop()方法来停止一…

Android自带模拟器如何获得ROOT权限

如果在模拟器中不能切换到root权限&#xff0c;很可能是镜像使用的不对。 一.选择镜像标准&#xff1a; 1.运行在PC端选X86_64镜像&#xff0c;才能流畅运行 2.不带google api的镜像 二.步骤 在虚拟机管理器中新建AVD&#xff0c;并下载符合要求的镜像文件 三.验证

【MATLAB】App 设计 (入门)

设计APP 主界面 函数方法 定时器 classdef MemoryMonitorAppExample < matlab.apps.AppBase% Properties that correspond to app componentsproperties (Access public)UIFigure matlab.ui.FigureStopButton matlab.ui.control.ButtonStartButton matlab.ui.cont…

大模型ChatGPT里面的一些技术和发展方向

文章目录 如何炼成ChatGPT如何调教ChatGPT如何武装ChatGPT一些大模型的其他方向 这个是基于视频 https://www.bilibili.com/video/BV17t4218761&#xff0c;可以了解一下大模型里面的一些技术和最近的发展&#xff0c;基本都是2022你那以来的发展&#xff0c;比较新。然后本文…

最新版的GPT-4.5-Turbo有多强

OpenAI再次用实力证明了&#xff0c;GPT依然是AI世界最强的玩家&#xff01;在最新的AI基准测试中&#xff0c;OpenAI几天前刚刚发布的GPT-4-Turbo-2024-04-09版本&#xff0c;大幅超越了Claude3 Opus&#xff0c;重新夺回了全球第一的AI王座&#xff1a; 值得一提的是&#xf…

C++ 模板详解——template<class T>

一. 前言 在我们学习C时&#xff0c;常会用到函数重载。而函数重载&#xff0c;通常会需要我们编写较为重复的代码&#xff0c;这就显得臃肿&#xff0c;且效率低下。重载的函数仅仅只是类型不同&#xff0c;代码的复用率比较低&#xff0c;只要有新类型出现时&#xff0c;就需…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳市场风险的热电联产虚拟电厂低碳调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Java作业6-Java类的基本概念三

编程1 import java.util.*;abstract class Rodent//抽象类 {public abstract String findFood();//抽象方法public abstract String chewFood(); } class Mouse extends Rodent {public String findFood(){ return "大米"; }public String chewFood(){ return "…

IDEA 编码格式设置 UTF-8

IDEA 编码格式设置 UTF-8 1.文件编码设置为UTF-8 Editor > File Encodings 2.编译编码设置为utf-8 Build&#xff0c;Execution&#xff0c;Deployment > Complier > Java Complier 按图中设置&#xff1a;-encoding utf-8

Dynamic Wallpaper for Mac:动态壁纸让桌面更生动

Dynamic Wallpaper for Mac是一款为苹果电脑用户精心设计的动态壁纸软件&#xff0c;它以其丰富的功能和精美的壁纸库&#xff0c;为用户带来了更加生动和个性化的桌面体验。 Dynamic Wallpaper for Mac v17.8中文版下载 这款软件支持多种动态壁纸&#xff0c;用户可以根据自己…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…

【YOLOv8改进[Backbone]】使用MobileNetV3助力YOLOv8网络结构轻量化并助力涨点

目录 一 MobileNetV3 1 面向块搜索的平台感知NAS和NetAdapt 2 反向残差和线性瓶颈 二 使用MobileNetV3助力YOLOv8 1 整体修改 ① 添加MobileNetV3.py文件 ② 修改ultralytics/nn/tasks.py文件 ③ 修改ultralytics/utils/torch_utils.py文件 2 配置文件 3 训练 其他 …

如何查看项目中使用的Qt版本

如何查看项目中使用的Qt版本 1.点击左下角电脑按钮查看Qt版本。 2.点击左侧栏项目按钮查看Qt版本。

apipost、postman等工具上传图片测试flask、fastapi的文件api接口

参考&#xff1a;https://blog.csdn.net/qq_15821487/article/details/119354129 https://www.cnblogs.com/wyxjava/p/16076176.html 选择from-data&#xff0c;下拉选择file上传文件发送即可

MySQL-数据库基础

一、背景与基本使用 首先是登录方式&#xff0c;一般用 mysql -h 127.0.0.1 -P 3306 -u root -p mysql也是一种网络服务。 当然我们在本地登录时可以省去主机ip和端口号。 -h表示我们要登录mysql在哪个ip的主机上&#xff0c; -P表示端口号。 -u表示以谁的身份去登录。…

MyBatis使用PageHelper分页插件

1、不使用PageHelper分页插件 模块名&#xff1a;mybatis-012-page CarMapper接口package org.example.mapper;import org.apache.ibatis.annotations.Param; import org.example.pojo.Car;import java.util.List;public interface CarMapper {/*** 分页查询* param startInd…

【爬虫】多线程爬取图片

多线程爬虫 多线程爬虫概述1.1 多线程的优势1.2 多线程的挑战 设计多线程爬虫1.1 项目设计1.2 项目流程1.3注意事项 总结 多线程爬虫概述 在当今信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Scraper&#xff09;已成为获取和分析网络数据的重要工具。而多线程爬虫&…

贪吃蛇游戏源码(VS编译环境)

贪吃蛇游戏源码&#xff08;VS编译环境&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 1. Snake.h 头文件 2. Snake.c 源文件 3. Test.c 头文件 1. Snake.h 头…

Dubbo元数据中心

元数据中心为 Dubbo 中的两类元数据提供了存取能力&#xff1a;地址发现元数据、服务运维元数据。 一、地址发现元数据 Dubbo3 中引入了应用级服务发现机制用来解决异构微服务体系互通与大规模集群实践的性能问题&#xff0c;应用级服务发现将全面取代 2.x 时代的接口级服务发…

C/C++易错知识点(4):static修饰变量和函数

static是C/C中一个非常容易混淆的语法&#xff0c;在不同的地方针对不同的对象有不同的效果。 它在大型项目中有至关重要的作用&#xff0c;需要我们详细研究。 1.变量 所有static修饰的变量的生命周期都是自调用它起到程序结束&#xff0c;期间这些变量都只会初始化一次 ①…