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之间的…

OSINT技术情报精选·2024年5月第1周

OSINT技术情报精选2024年5月第1周 2024.5.10版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、深圳市物联网产业协会&#xff1a;《深圳市物联网产业白皮书(2023年)》 近日&#xff0c;《深圳市物联网产业白皮书&#xff08;2023年&…

翻译《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;它以统一且多线程安全的方式…

springboot习题

第1章 一、填空题 1.Pivotal团队在原有 Spring 框架的基础上开发了全新的 Spring Boot 框架。 2.Spring Boot框架在开发过程中大量使用 约定优先配置 的思想来摆脱框架中各种复杂的手动配置。 3.Spring Boot2.1.3 版本要求 Java 8 及以上版本的支持…

【机器学习第二期】MATLAB实现随机森林法

随机森林(Random Forest, RF) 1 原理1.1 重采样方法(Bootstrap resampling method)1.2 特征重要性方法排列重要性法(Permutation Importance method)2 MATLAB相关函数:TreeBagger3 案例:干旱驱动因子分析3.1 案例说明结果变量(Outcome variable)解释变量类别3.2 基于…

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

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

上海企业源代码防泄密解决方案,企业源代码防泄密如何应对?

随之互联网的发展&#xff0c;企业员工因离职把企业源代码泄露或删库跑路的事情屡见不鲜&#xff0c;各大互联网公司基本都会出现源代码泄露的事情&#xff0c;这样的问题也成了企业在发展过程中不可避免的问题。企业源代码泄露会给企业带来的损失也是不可估量的&#xff0c;据…

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;。…

Ajax 笔记02

01 jq中的ajax方法中的dataType属性 dataType属性的属性值有以下几种: xml 返回数据按照xml解析 json 返回的数据按照json代码解析 script 返回的数据按照js代码解析 text 把返回的数据按照普通文本解析 jsonp 跨域 json: javascript object notation(js对象简谱) json整体…

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

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

企微SCRM营销:解锁客户关系管理新篇章

随着数字化营销的不断深入&#xff0c;企业对于客户关系管理&#xff08;CRM&#xff09;的需求也日益增长。企业微信&#xff08;企微&#xff09;作为一款功能强大的企业级应用&#xff0c;结合SCRM&#xff08;社交客户关系管理&#xff09;的理念&#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作为企业网关部署在网络…

TypeScript的`undefined`作用与使用:初学者指南

TypeScript的undefined作用与使用&#xff1a;初学者指南 大家好我是程序员十一 今天分享一下TypeScript的undefined作用与使用 引言 在JavaScript和TypeScript中&#xff0c;undefined是一个表示变量已声明但尚未被赋予任何值的特殊值。本文将通过一系列实例&#xff0c;由…