Screeps工程化之数量控制模块

news2024/12/29 13:53:48

前言

将Screeps的代码进行模块化后,可以将各个功能进行分离,互相不影响,本文将会介绍Screeps中如何进行creep的数量控制来维持房间资源的平衡和发展。本文仅为作者本人的游戏思路,并不是最佳实践,如有更好的实现方法可在评论区提出。

如何抽取配置项可以看专栏的文章《Screeps工程化之配置化》

c255bead9defcb2ee6f20768e36690ac

核心实现逻辑

/**
 * @module creep数量控制模块
 */
import {BUILDER, DEFENDER} from "../constant/roleConstant.js";
import {creatCreep, creepNum, getSortedRolesByWeight} from "../config/creepNum/creepNumCore.js";
import {countOccurrences} from "../utils.js";


/**
 * @description creep数量控制器
 */
export const creepNumController = (roomKey) => {
    deleteDeadCreep()
    const spawns = Memory.Rooms[roomKey].spawns.map((id) => Game.getObjectById(id))
    for (const spawn of spawns) {
        // const spawn = Game.spawns[name]
        if (!spawn.spawning) {
            creepNumJudge(spawn, roomKey)
        }
    }

}
/**
 * 生成creep核心判断逻辑
 * @param {StructureSpawn} spawn
 * @param {string} roomKey
 */
const creepNumJudge = (spawn, roomKey) => {
    //1.根据权重信息组成role的列表通过权重排序
    const role_list = getSortedRolesByWeight(roomKey, DEFENDER)
    //2.遍历新组装的角色信息
    for (const role of role_list) {
        //针对builder的特殊判断条件
        if (role === BUILDER) {
            if (judge(role, roomKey) && Game.rooms[roomKey].find(FIND_CONSTRUCTION_SITES).length !== 0) {
                creatCreep(spawn, roomKey, role)
                return;
            }
        } else {
            if (judge(role, roomKey)) {
                creatCreep(spawn, roomKey, role)
                return;
            }
        }
    }
}
/**
 * @description 判断数量是否满足生成creep的条件
 * @param {string} role
 * @param {string} roomKey
 * @returns {boolean}
 */
export const judge = (role, roomKey) => {
    return countOccurrences(getRoleList(roomKey), role) < creepNum(role, roomKey)
}

/**
 *@description 删除内存中死亡的creep
 */
const deleteDeadCreep = () => {
    for (let name in Memory.creeps) {
        if (!Game.creeps[name]) {
            delete Memory.creeps[name]
        }
    }
}

/**
 * @description 获取内存中存活的creep的角色
 * @returns {string[]}
 */
const getRoleList = (roomKey) => {
    deleteDeadCreep()
    /**
     * @description 角色列表
     * @type {string[]}
     */
    const roleList = []
    for (const creep of Game.rooms[roomKey].find(FIND_MY_CREEPS)) {
        roleList.push(creep.memory.role)
    }

    return roleList
}

详细介绍:

  1. deleteDeadCreep方法:在每次一进入该模块中就会删除一次已死亡的creep的内存。
  2. getRoleList方法:获取该房间内存活的creep并将其creep的role存入一个列表然后返回。
  3. judge方法:判断该房间,指定角色的creep是否为配置文件中的数量
  4. creepNumJudge方法:数量控制的核心逻辑,其中,getSortedRolesByWeight方法会返回一个以权重排序过后的角色列表,遍历返回的角色列表,符合条件就生成creep,其中角色为建筑者的creep还有额外的判断条件,本房间内存在建筑工地才生成。

所有的creep生成的数量都根据配置文件中的number字段决定,当该房间中的某一个角色的creep少于指定的值,就会生成一个creep,一直生成到指定数量。

比如这个房间内的upgrader(专门给控制器升级的creep)就需要3个

"upgrader": {
    role: UPGRADER,
    bodys: Array(7).fill(WORK)
        .concat(Array(7).fill(CARRY))
        .concat(Array(7).fill(MOVE)),
    number: 3,
    weight: 2,
    func: upgraderRun,
    sourcesIndex: 1
}

实现效果

image-20240510163922558

image-20240510163940925

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

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

相关文章

*args和**kwargs的使用

*args传入的是按照顺序的不定长度的参数列表 **kwargs传入的是不定长度的键值对

effective python学习笔记_类与接口

用组合类实现多层结构而不用内置类型 例子&#xff1a;成绩单&#xff0c;存储学生各科成绩多个然后加权重&#xff0c;如果用字典类型会导致字典有多层嵌套结构 思想 当用内置类型如字典元组等结构出现超过二层的多层嵌套结构时&#xff0c;读起来会比较难懂&#xff0c;此时…

顺序表经典算法OJ题-- 力扣27,88

题1&#xff1a; 移除元素 题2&#xff1a; 合并两个有序数组 一&#xff1a;题目链接&#xff1a;. - 力扣&#xff08;LetCode&#xff09; 思路&#xff1a;&#xff08;双指针法&#xff09; 创建两个变量src&#xff0c;dst 1&#xff09;若src指向的值为val&#xf…

《第一行代码》第二版学习笔记(11)——最佳的UI体验

文章目录 一、Toolbar二、滑动菜单1、DrawerLayout——抽屉2、NavigationView 三、悬浮按钮和可交互提示1、FloatingActionButton——悬浮按钮2、Snackbar——提示工具3、CoordinatorLayout 四、卡片式布局1、cardView2、AppBarLayout 五、下拉刷新——SwipeRefreshLayout六、可…

EDA(六)Modelsim

EDA&#xff08;六&#xff09;Modelsim ModelSim是一款由Mentor Graphics公司&#xff08;现为Siemens EDA的一部分&#xff09;开发的高性能、交互式和可扩展的HDL&#xff08;硬件描述语言&#xff09;仿真工具。它支持Verilog、SystemVerilog和VHDL等语言&#xff0c;被广泛…

如何在家轻松赚钱,分享五个在家赚钱的好点子

在家轻松赚钱可以考虑以下几种方式 1. 网络任务 网上可以做下百度的致米宝库&#xff0c;一个月有个一千多块钱&#xff0c;我感觉还行&#xff0c;比较适合新手小白的&#xff0c;自由操作即可。 2. 写作和翻译 如果你擅长写作或翻译&#xff0c;可以在各种写作平台或翻译平…

用户体验优化uxo指的是什么?

用户体验优化(User Experience Optimization&#xff0c;简称UXO)是一种专注于改善和提升用户在使用企业产品或服务时的整体感受和体验的过程。简单来说&#xff0c;它旨在通过改进产品或服务的设计和功能&#xff0c;使用户在使用过程中感到更加愉悦、满意和高效。用户体验优化…

java注解全网最细

引言 在java编程中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息。注解不直接影响程序的执行&#xff0c;但可以在运行时提供有关程序的信息&#xff0c;或者让编译器执行额外的检查。 下面笔者通过循序渐进的…

马斯克首例脑机人体试验出现重大故障,真正的人脑智能梦想要破灭了? | 最新快讯

“科技狂人”马斯克&#xff08;Elon Musk&#xff09;在侵入式脑机接口技术的前沿探索中遭遇了重大挫折。 北京时间 5 月 9 日&#xff0c;马斯克成立的脑机接口公司 Neuralink 其官网上发布报告称&#xff0c;首位植入脑机接口设备的受试者体内一些电极出现问题&#xff0c;大…

docker 容器无法直接读取宿主机文件

最近一个需求, 要在后端直接使用代码直接生成 pdf 文档, 由于使用的 apache 的工具包, 该工具包无法直接解析中文字体, 需要导入外部 中文插件包, 相关代码如下: PDPage page new PDPage(PDRectangle.A4);document.addPage(page);PDFont fontFile PDType0Font.load(document…

Smma-net:一种基于音频线索的目标说话人提取网络,具有谱图匹配和相互关注功能

SMMA-NET: AN AUDIO CLUE-BASED TARGET SPEAKER EXTRACTION NETWORK WITH SPECTROGRAM MATCHING AND MUTUAL ATTENTION 第二章 目标说话人提取之《Smma-net:一种基于音频线索的目标说话人提取网络&#xff0c;具有谱图匹配和相互关注功能》 文章目录 SMMA-NET: AN AUDIO CLUE-…

越秀城投·星汇城 | 看得再多,都不如实景现房更安心

对于大多数家庭而言&#xff0c;买房是人生大事。经历了前几年房企暴雷、楼盘停工烂尾的风波&#xff0c;“现房”成为买房人心中最安心的代名词。无需再等待&#xff0c;所见即所得。 越秀城投星汇城位于平度南部新城核芯片区&#xff0c;不仅享受区域发展的利好&#xff0c;…

金融服务业94%都是被这4种方式攻击,如何避免被攻击影响

根据安全数字化体验智能边缘平台最新发布的《2019年互联网安全状况报告&#xff1a;针对金融服务业的攻击经济》数据显示&#xff0c;在所有受网络钓鱼域影响的企业中&#xff0c;有50%来自金融服务行业。 数据显示&#xff0c;除了独特的网络钓鱼尝试之外&#xff0c;攻击者还…

文本转图表的AI工具-Chart-GPT

Chart-GPT Chart-GPT一款基于 GPT 实现的开源工具&#xff0c;可在几秒内&#xff0c;将文本快速转换为各种图表。用户只需在输入字段中输入数据说明和所需的图表类型&#xff0c;Chart-GPT的后台生成器即可建出多种类型的图表&#xff0c;包括条形图、折线图、组合图、散点图、…

Java 集合-List

集合主要分为两组(单列集合, 双列集合) Connection 接口有两个重要的子接口LIst 和 Set, 它们的实现子类都是单列集合, Map 接口的实现子类是双列集合, 存放的是 K-V Connection 接口 Collection 接口和常用方法 下面以 ArrayList 演示一下 add: 添加单个元素remove: 删除指…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…

USB系列七:通用USB驱动程序解析(重要)

USB设备的驱动程序是USB主机应用程序与USB外部设备之间沟通的桥梁&#xff0c;高效的USB驱动程序开发是USB设备研发的关键。用户可以使用WindowsDDK、DriverStudio等多种工具来开发USB设备驱动程序&#xff0c;但驱动程序的开发过程都比较复杂&#xff0c;而且很容易致使USB主机…

【笔试训练】day23

一、打怪 思路 由于是先手攻击&#xff0c;如果一次攻击就能杀死小怪&#xff0c;那么说明可以为无限杀小怪。 再计算杀一只小怪要扣多少血就好了&#xff0c;再用总生命值去除这个扣血量&#xff0c;得到的就是最多杀死小怪的数量。注意&#xff0c;由于最后一定要活下来&am…

OpenGL入门第三步:矩阵变换、坐标系统

1、矩阵变换 这里矩阵变换,使用4*4的矩阵,既可以表示位移,也可以表示缩放。 原因: 添加4维矩阵变量 initializeGL()函数:在着色器里面添加变换矩阵,改变坐标位置 设计一个随时间变换 ,所有重写TimerEvent 调用update触发paintGL()函数: 2、坐标系统

数据结构_顺序表中基本操作的实现_代码

学习笔记&#xff0c;仅供参考 1.头文件 2.初始化 3.增加值 4.根据下标取值 5.查找 6.插入 7.删除 8.动态增加数组的长度 9.所有代码 10.运行结果 1.头文件 //顺序表的实现——动态分配 #include<stdio.h> #include<stdlib.h> #define InitSize 10 type…