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
});
};
排查顺序
- Game.rooms 索引结果检查。
- 历史 Memory 与当前 Room 对象分开。
- controller 与 owner 逐层检查。
- 保存动作返回值,并对照官方 API 的错误常量。
- 一次性高影响动作必须保留显式请求开关。
边界和验证
本文只解释 Game.rooms[roomName] 为 undefined 时如何安全退出,不负责主动获取或长期保存房间视野。