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://xiahunao.cn/news/3031501.html

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

相关文章

反了!美国假冒邮政服务钓鱼网站访问量竟然超过正规官网

美国邮政是美国主要的包裹信件投递机构之一&#xff0c;长期以来该单位都是网络钓鱼和诈骗的针对目标。对美国公民来说&#xff0c;在假期通常都会收到声称来自美国邮政的诈骗。美国邮政甚至单独建设的网页提醒消费者警惕诈骗信息&#xff1a; 专用提醒网页 Akamai 的研究人员…

ABB机器人转角路径故障报警消除方法

ABB机器人在现场调试时&#xff0c;有时候会出现以下报警&#xff1a;“转角路径故障”的错误。 但这个报错不影响机器人的使用。也可以在指令中设置将其屏蔽。 1、打开一个例行程序&#xff0c;在Settings指令下添加CornerPathWarning设置语句&#xff1b; 2、将CornerPathWa…

使用Pandas对Data列进行基于顺序的分组排列

目录 一、引言 二、Pandas库简介 三、按照数据列中元素出现的先后顺序进行分组排列 四、案例分析 五、技术细节探讨与扩展应用 1. 技术细节 2. 扩展应用 3. 示例代码&#xff1a;用户行为分析 4. 进阶应用&#xff1a;分组后的聚合操作 5. 分组后的数据筛选 6. 分组…

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)

1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构&#xff0c;有利于找到目标网络的关键节点&#xff0c;从而提高攻击效率&#xff0c;达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统&#xff0c;确认目标系统适合哪种类型的攻击。 3、百度…

视频号小店究竟有什么秘密,值得商家疯狂入驻,商家必看!

大家好&#xff0c;我是电商花花。 我们都知道视频号和抖音本身都是一个短视频平台&#xff0c;但是随着直播电商的发展&#xff0c;背后的流量推动逐步显露出强大的红利市场和变现机会。 视频号小店流量大和赚钱之外&#xff0c;还非常适合普通人创业。 这也使得越来越多的…

[机器学习-03] Scikit-Learn机器学习工具包学习指南:主要功能与用法解析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

robobrowser,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - robobrowser。 Github地址&#xff1a;https://github.com/jmcarp/robobrowser 在网络爬虫和自动化领域&#xff0c;Python开发者拥有众多强大的工具&…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

YOLOv8火焰与烟雾智能检测系统

项目概述&#xff1a; 本项目旨在开发一款高效、实时的火焰与烟雾检测系统&#xff0c;利用先进的深度学习技术——YOLOv8&#xff0c;为安全监控领域提供智能化解决方案。系统不仅能够准确识别视频流或静态图像中的火焰与烟雾&#xff0c;还配备了用户友好的图形界面&#xff…

AI 绘画神器 Fooocus 2.3.1 汉化教程(中文界面/汉化包下载/持续更新最新版本...)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ Fooocus 是一款功能强大的 AI 绘画神器&#xff0c;它能够帮助我们以更高效、更创意的方式进行绘画创作。本教程将详细…

学习Java的日子 Day44 初识前端

Day44 HTML 学习路线&#xff1a; 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1.B/S和C/S B/S&#xff1a;浏览器/服务器 教务系统 C/S&#xff1a;客户端/服务器 优缺点 1.开发/维护成本&#xff1a;B/S相对低 2.运算…

GEE数据集——高分辨率全球树冠高度地图(1 米)Meta 公司

高分辨率 1 米全球树冠高度地图 简介 全球树冠高度地图数据集提供了对全球树冠高度的全面了解,有助于对森林生态系统、碳固存和气候变化减缓工作进行精确监测。该数据集由 Meta 和世界资源研究所合作开发,是了解森林结构和动态的基石。通过融合最先进的卫星图像和先进的人工…

C#编程模式之享元模式

创作背景&#xff1a;各位朋友&#xff0c;我们继续学习C#的编程模式&#xff0c;本文主要介绍享元模式。享元模式是一种结构型设计模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;从而提高程序性能。它通过共享对象的方式来减少内存的使用&#xff0c;特别是系统中…

9.spring-图书管理系统

文章目录 1.开发项目流程1.1开发开发1.2数据库的设计 2.MySQL数据库相关代码3.构造图书结构3.1用户登录3.2图书列表3.3图书添加3.4图书删除3.4.1批量删除 3.5图书查询(翻页) 4.页面展示4.1登录页面4.2列表页面4.3增加图书页面4.4修改图书信息页面 5.功能展示5.1增加图书信息5.2…

EPAI手绘建模APP动画、场景、手势操作

(15) 动画 图 299 动画控制器 ① 打开动画控制器。播放动画过程中&#xff0c;切换场景观察视角时&#xff0c;自动停止播放。动画编辑参见常用工具栏-更多-动画动画编辑器部分。 ② 关闭动画控制器。 ③ 设置动画参数&#xff1a;设置动画总帧数&#xff1b;这只帧率&#x…

docker安装nginx支持ssl 实现https访问(完整版)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 本文简介 2. docker安装nginx支持ssl2.0 准备ssl证书(例: 阿里云)2.0.1 配置域名解析2.0.2 找到数字证书管理服务并签发ssl证书2.0.3 选择默认证书 填写域名 创建2.0.4 提交审核, 签发成功2.0.5 解压并上传到宿主机ssl路径下 …

FFmpeg常用API与示例(三)—— 音视频解码与编码

编解码层 1.解码 (1) 注册所有容器格式和 CODEC:av_register_all() (2) 打开文件:av_open_input_file() (3) 从文件中提取流信息:av_find_stream_info() (4) 穷举所有的流&#xff0c;查找其中种类为 CODEC_TYPE_VIDEO (5) 查找对应的解码器:avcodec_find_decoder() (6) …

解决电脑睡眠后,主机ping不通VMware虚拟机

文章目录 问题解决方法方法一方法二注意 问题 原因&#xff1a;电脑休眠一段时间&#xff0c;再次打开电脑就ping不通VMware虚拟机。 解决方法 方法一 重启电脑即可&#xff0c;凡是遇到电脑有毛病&#xff0c;重启能解决90%问题。但是重启电脑比较慢&#xff0c;而且重启…

Linux 磁盘分区工具 gdisk / fdisk

fdisk 是传统的 Linux 磁盘分区工具&#xff0c;磁盘容量有2T的大小限制&#xff1b;gdisk 又叫 GPT fdisk, 作为 fdisk 的升级版&#xff0c;主要使用的是GPT分区类型&#xff0c;用来划分容量大于2T的硬盘&#xff0c;本文介绍使用方法。 简介 早期的磁盘使用 fdisk 工具分区…