KNOWLEDGE MODULE 04

移动、寻路与视野

逐一解决距离、疲劳、无路径、跨房间路线、CostMatrix、房间可见性与远程观察问题。

专题内进度8 / 10查看完整学习顺序 →

Screeps 常见问题

Game.rooms 为什么没有某个房间

解释 Game.rooms[roomName] 为什么可能是 undefined,并在房间不可见时避免继续读取对象。

难度
高级
适用阶段
视野与可视化
模块位置
8 / 10
前置知识
Screeps MOVE 部件怎么配:fatigue、地形与负载
VERIFICATION文档已核对 · 语法已检查 · Console待测试 · 主循环待验证查看验证详情
官方文档
已核对
JavaScript 语法
已检查
Screeps Console
待测试
真实主循环
待验证
最后核对
2026年7月19日
本文目录6 个主要章节

Game.rooms 只包含当前可见的房间。用房间名读取结果可能是 undefined,因此访问 Controller、结构或 Source 前必须先判空。

先核对这些前提

第一个房间页面帮助识别己方可见房间;Observer 页面负责主动观察。本文只解释可见性与 undefined。

  • Game.rooms 只包含当前 tick 可见的 Room 对象。
  • 己方 Creep、己方结构或其他视野来源可提供房间可见性。
  • Memory.rooms 中有历史数据不代表当前存在 live Room 对象。

完整示例

代码放进 main 模块。房间、结构、资源和目标坐标必须改成自己的配置。

module.exports.loop = function () {
  const roomName = 'W2N2';
  const room = Game.rooms[roomName];

  if (!room) {
    const remembered = Memory.rooms
      ? Memory.rooms[roomName]
      : undefined;

    console.log(
      roomName,
      '当前不可见,是否有历史 Memory:',
      Boolean(remembered)
    );
    return;
  }

  const controller = room.controller;
  console.log({
    roomName: room.name,
    hasController: Boolean(controller),
    controllerOwner: controller && controller.owner
      ? controller.owner.username
      : null
  });
};

排查顺序

  1. Game.rooms 索引结果检查。
  2. 历史 Memory 与当前 Room 对象分开。
  3. controller 与 owner 逐层检查。
  4. 保存动作返回值,并对照官方 API 的错误常量。
  5. 一次性高影响动作必须保留显式请求开关。

边界和验证

本文只解释 Game.rooms[roomName]undefined 时如何安全退出,不负责主动获取或长期保存房间视野。

站内学习路径

官方资料

返回目录