Screeps工程化之配置化

目录

  • 前言
  • 一、抽取配置项
  • 二、读取配置项

前言

Screeps中所有代码都会在一个tick(游戏内的世间)内执行完成,想要做到代码的高度复用,和隔离各个房间creep的行为就需要将部分代码进行配置化,本文仅为作者本人的游戏思路,并不是最佳实践,如有更好的实现方法可在评论区提出。

c255bead9defcb2ee6f20768e36690ac

一、抽取配置项

以本人的一个房间配置为例,抽取配置后,有专门调用它们的方法,后文会介绍到

import {BUILDER, HARVERSTER, LINKHARVERSTER, REPAIRER, TRANSPORTER, UPGRADER} from "../../../constant/roleConstant.js";
import {transporterRun} from "../../../action/creep/transport.js";
import {upgraderRun} from "../../../action/creep/upgrader.js";
import {repairerRun} from "../../../action/creep/repairer.js";
import {harvesterRun} from "../../../action/creep/harvester.js";
import {builderRun} from "../../../action/creep/builder.js";
import {linkHarvesterRun} from "../../../action/creep/linkTransport.js";/*** 3号房间*/
export const E42N24 = {"transporter": {role: TRANSPORTER,bodys: Array(0).fill(WORK).concat(Array(2).fill(CARRY)).concat(Array(1).fill(MOVE)),number: 2,weight: 2,func: transporterRun,sourcesIndex: 1},"upgrader": {role: UPGRADER,bodys: Array(3).fill(WORK).concat(Array(3).fill(CARRY)).concat(Array(3).fill(MOVE)),number: 2,weight: 2,func: upgraderRun,sourcesIndex: 0},"repairer": {role: REPAIRER,bodys: Array(3).fill(WORK).concat(Array(3).fill(CARRY)).concat(Array(3).fill(MOVE)),number: 1,weight: 3,func: repairerRun,sourcesIndex: 1},"harvester": {role: HARVERSTER,bodys: Array(5).fill(WORK).concat(Array(1).fill(MOVE)),number: 1,weight: 2,func: harvesterRun,sourcesIndex: 0},"builder": {role: BUILDER,bodys: Array(3).fill(WORK).concat(Array(3).fill(CARRY)).concat(Array(3).fill(MOVE)),number: 1,weight: 4,func: builderRun,sourcesIndex: 0},"linkHarvester": {role: LINKHARVERSTER,bodys: Array(5).fill(WORK).concat(Array(0).fill(CARRY)).concat(Array(1).fill(MOVE)),number: 1,weight: 1,func: linkHarvesterRun,sourcesIndex: 1},
}

每一项以角色为键,有每一个角色具体的配置内容

详细介绍:

  1. role:creep的角色,这个值是一个常量,它会在生成creep时传入该creep初始化的内存中

  2. bodys:creep的身体组件,没有将所有组件存入一个数组的原因是,这样更加方便查看

    const bodys1=[WORK,WORK,WORK,WORK,WORK,CARRY,CARRY,CARRY,CARRY,CARRY,MOVE,MOVE,MOVE,MOVE,MOVE]const bodys2=Array(5).fill(WORK).concat(Array(5).fill(CARRY)).concat(Array(5).fill(MOVE))
    

    可以对比一下,哪种方式更加方便查看

  3. number:creep生成的数量

  4. weight:creep生成的权重,该权重主要用于生成creep的顺序,某些角色的存在是非常重要的,它的权重就应该是最高的,无论什么时候,在一定数量范围内它都应该是最先生成的。

  5. func:每一种role对应的行为逻辑方法

  6. sourcesIndex:需要开采能量的索引值(我承认这个是一个失败的设计,因为有些role不会去挖矿,而是直接从storage或container中取,但是为了预防一个房间的所有存储建筑崩盘的情况,能过够让每一种role都可以自给自足。)

二、读取配置项

将所有的房间配置在整合到一个配置中

import {E43N24} from "./room/E43N24.js";
import {E43N25} from "./room/E43N25.js";
import {E42N24} from "./room/E42N24.js";export const creepNumConfig = {"E43N24": E43N24,"E43N25": E43N25,"E42N24": E42N24
}

使用特定的方法调用这些配置

import {creepNumConfig} from "./creepNumConfig.js";/*** creep生成方法* @param {StructureSpawn} spawn* @param {string} role* @param {string} roomKey*/
export const creatCreep = (spawn, roomKey, role) => {const date = new Date()const name = `xl-${roomKey}-${date.getHours()}-${date.getMinutes()}-${date.getSeconds()}`//判断是否有足够的能量if (useEnergy(roomKey, role) <= Game.rooms[roomKey].energyAvailable) {const result_code = spawn.spawnCreep(creepNumConfig[roomKey][role].bodys, `${name}-${role}`, {memory: {role: role,workState: false}})console.log(`创建了${name}-${role}::${result_code}`)}
}/*** @param  {string} role 角色* @param {string} roomKey 房间号* @returns {number}*/
export const creepNum = (role, roomKey) => {return creepNumConfig[roomKey][role].number
}/*** @description 组装成新的role列表并通过权重字段来排序* @param {string} roomKey 房间号* @param {string[]} excludeRoles 要排除的角色,部分角色不走正常的生成模块,比如防御者只在战争模块生成* @return {string[]} 角色数组*/
export const getSortedRolesByWeight = (roomKey, ...excludeRoles) => {// 获取指定房间的配置const roomConfig = creepNumConfig[roomKey];// 创建角色信息列表const roles = Object.keys(roomConfig).map((key) => {return {role: roomConfig[key].role,weight: roomConfig[key].weight,};}).filter((item) => !excludeRoles.includes(item.role));// 按权重从低到高排序roles.sort((a, b) => a.weight - b.weight);// 返回排序后的角色列表(只包含 role 字段)return roles.map((item) => item.role);
};/*** 角色执行逻辑* @param {string} roomKey* @param {Creep} creep* @param {string} role*/
export const roleRun = (roomKey, creep, role) => {if (creepNumConfig[roomKey][role]) {creepNumConfig[roomKey][role].func(creep, creepNumConfig[roomKey][role].sourcesIndex)}
}/*** 计算生成一个creep需要多少能量* @param {string} roomKey* @param {string} role* @return {number}*/
const useEnergy = (roomKey, role) => {let sum = 0for (const body of creepNumConfig[roomKey][role].bodys) {if (body === MOVE || body === CARRY) {sum += 50}if (body === WORK) {sum += 100}if (body === ATTACK) {sum += 80}if (body === RANGED_ATTACK) {sum += 150}if (body === HEAL) {sum += 250}if (body === CLAIM) {sum += 600}if (body === TOUGH) {sum += 10}}return sum
}

房间的配置项就只在这个文件中调用,而各个模块只需要调用这个文件中的方法就行了。

游戏过程中,各个房间的creep的数量、生成顺序、行为逻辑都只需要在配置文件中修改就行了。

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

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

相关文章

机器学习算法 - 逻辑回归

逻辑回归是一种广泛应用于统计学和机器学习领域的回归分析方法&#xff0c;主要用于处理二分类问题。它的目的是找到一个最佳拟合模型来预测一个事件的发生概率。以下是逻辑回归的一些核心要点&#xff1a; 基本概念 输出&#xff1a;逻辑回归模型的输出是一个介于0和1之间的…

翻译《The Old New Thing》 - The performance cost of reading a registry key

The performance cost of reading a registry key - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20060222-11/?p32193 Raymond Chen 2006年2月22日 读取注册表键的性能成本 注册表是一个方便的场所&#xff0c;它以统一且多线程安全的方式…

使用 MSYS2 Qt6 发布绿色版的SDR软件无线电应用

文章目录 概要整体架构流程技术名词解释技术细节在启动器中为子进程设置路径和环境。如何迅速找齐所有的DLL 小结附件 概要 新接触软件定义无线电&#xff08;SDR&#xff09;的朋友一般都会一股脑的安装一些现有的SDR平台。无论是GNURadio还是SDR、SDRSharp、SDRAngel&#x…

C++map和set(个人笔记)

Cmap和set 1.set1.1set的使用1.1.1 set的模板参数列表1.1.2set的构造1.1.3set的迭代器1.1.4 set的容量1.1.5 set修改操作1.1.6 set的具体使用例子 2.map2.1map的使用2.1.1map的模板参数列表2.1.2map的构造2.1.3map的迭代器2.1.4 map的容量与元素访问2.1.5 map中元素的修改2.1.6…

模电·基本共基放大电路

基本共集放大电路 图1.(a)所示为基本共基放大电路&#xff0c;根据放大电路的组成原则&#xff0c;为使晶体管发射结正向偏置且 U B E &#xff1e; U o n {U\tiny BE}&#xff1e;{U\tiny on} UBE&#xff1e;Uon&#xff0c;在其输入回路加电源 V B B V\tiny BB VBB&#xf…

Photoshop中绘图及图像修饰工具的应用

Photoshop中绘图及图像修饰工具的应用 Photoshop中的颜色设置与取样前景色与背景色颜色取样 Photoshop中的颜色替换工具Photoshop中的渐变工具Photoshop中的描边命令Photoshop中的填充工具采用油漆桶进行填充采用填充命令进行填充 Photoshop中的擦除工具 Photoshop中的颜色设置…

SQL子查询练习

学习链接&#xff1a;https://sqlzoo.net/wiki/Window_LAG ● 【题目1】查询在欧洲(Europe)人均gdp大于英国 (United Kingdom)的国家名。人均国内生产总值&#xff08;人均GDP&#xff09;国内生产总值&#xff08;GDP&#xff09;/人口&#xff08;populaiton&#xff09;。…

智能奶柜:健康生活新风尚

智能奶柜&#xff1a;健康生活新风尚 在快节奏的都市生活中&#xff0c;健康与便利成为了现代人的双重追求。而在这两者交汇之处&#xff0c;智能奶柜应运而生&#xff0c;它不仅是科技与生活的完美融合&#xff0c;更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

pycharm编译器背景设置

最近&#xff0c;瞎逛的时候发现个好玩的&#xff0c;pycharm竟然可以设置背景了&#xff0c;也不知道是不是我太out了&#xff0c;觉得很有意思&#xff0c;略微记录一下 如下步骤&#xff1a; 第五步&#xff1a;选择自己的图片路径 第六步&#xff1a;设置图片透明度&…

【讲解下迭代加深搜索】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

Interpreting Super-Resolution Networks with Local Attribution Maps

CVPR2021 问题引入 主要针对的是深度模型的不可解释性&#xff0c;本文使用attribution analysis来分析输入的哪些像素对SR的结果贡献最大&#xff1b;本文提出了Local Attribution Maps&#xff0c;是一种归因方法&#xff0c;延伸了path integral gradient method&#xff…

CLI举例:通过URL分类控制用户访问的网站

华为CLI举例&#xff1a;通过URL分类控制用户访问的网站 配置基于URL分类的URL过滤功能&#xff0c;可以实现对用户访问的某一类网站的控制。既可以是FW自带的预定义分类&#xff0c;也可以是管理员配置的自定义分类。 组网需求 如图1所示&#xff0c;FW作为企业网关部署在网络…

华为OD机试【城市聚集度】(java)(200分)

1、题目描述 一张地图上有N个城市&#xff0c;城市和城市之间有且只有一条道路相连&#xff0c;要么直接相连&#xff0c;要么通过其他城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。 当切断通往某城市i的所有道路后&#xff0c;地图上将分成多个连通的城…

mongoDB分组查询

完整代码 //根据医院编号 和 科室编号 &#xff0c;查询排班规则数据Overridepublic Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根据医院编号 和 科室编号 查询Criteria criteria Criteria.where("hosco…

云手机:海外舆情监控的新工具

在数字化时代&#xff0c;海外舆情监控对于企业、品牌和政府机构来说&#xff0c;已经变得至关重要。传统的舆情监控方法往往受限于地域、设备和技术&#xff0c;而云手机的出现&#xff0c;为海外舆情监控带来了全新的解决方案。 一、云手机与海外舆情监控的完美结合 云手机作…

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能 安装配置 首先确保已经安装如下程序&#xff1a; flask&#xff1a;用于构建web应用程序。flask-sqlalchemy&#xff1a;用于在 Flask 中连接 MySQL 数据库&#xff0c;通过pip install flask-sqlalchemy安装。pym…

Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

FPGA+炬力ARM实现VR视频播放器方案,3D眼镜显示

3D眼镜显示&#xff1a; FPGA炬力ARM方案&#xff0c;单个视频源信号&#xff0c;同时驱动两个LCD屏显示&#xff0c;实现3D 沉浸式播放 客户应用&#xff1a;VR视频播放器 主要功能&#xff1a; 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文…

24数维杯C题18页保姆级思路+代码+后续参考论文

18页保姆级思路&#xff1a; 24数维杯C题20页保姆级思路&#xff0b;可执行代码&#xff0b;参考论文 简单麦麦https://www.jdmm.cc/file/2710641/ 群&#xff1a;666165284 1&#xff09;确定天然气水合物资源分布范围 要确定天然气水合物资源的分布范围&#xff0c;需要分…