解説動画
解答画像
// -- 18-5 線路を修復する ----------------------------------------------------
// 線路パターンの連想配列
let dic_railBlocks185: { [key: number]: number[] } = {
173: [66, 66, 27, 27, 66], // 印(石炭): 線路パターン [普通, 普通, パワード, パワード, 普通]
896: [66, 27, 27, 66, 66], // 印(鉄の原石): 線路パターン [普通, パワード, パワード, 普通, 普通]
22: [66, 66, 27, 66, 28] // 印(ラピスラズリ): 線路パターン [普通, 普通, パワード, 普通, ディテクター]
};
// エージェントの状態の連想配列
let dic_agentStatus185: { [key: string]: number } = {
"block": 0, // 持つブロック番号
"forward": 0, // 前の移動距離
"right": 0, // 右の移動距離
"placeDirection": DOWN // ブロックを置く方向
};
// 修復した線路の配列
let array_builtRails185: number[] = [];
// エージェントを前へ移動させる関数
function moveForward185(agentStatus: { [key: string]: number }): boolean {
let canMove = agent.move(FORWARD, 1);
if (!canMove) {
player.say("エージェントが前へ移動できません!");
return false;
}
agentStatus["forward"] += 1;
return true;
}
// エージェントを後ろ移動させる関数
function moveBack185(agentStatus: { [key: string]: number }): boolean {
let canMove = agent.move(BACK, 1);
if (!canMove) {
player.say("エージェントが後ろへ移動できません!");
return false;
}
agentStatus["forward"] -= 1;
return true;
}
// エージェントを右に移動させる関数
function moveRight185(agentStatus: { [key: string]: number }): boolean {
let canMove = agent.move(RIGHT, 1);
if (!canMove) {
player.say("エージェントが右に移動できません!");
return false;
}
agentStatus["right"] += 1;
return true;
}
// エージェントにブロックを設置させる関数
function placeBlock185(agentStatus: { [key: string]: number }): boolean {
agent.setItem(agentStatus["block"], 1, 1);
let canPlace = agent.place(agentStatus["placeDirection"]);
if (!canPlace) {
player.say("エージェントがブロックを設置できません!");
}
return canPlace;
}
// 足元の印を探す関数
function findMarker185(agentStatus: { [key: string]: number }, pillarBlocks: { [key: number]: number[] }): number {
while (true) {
// 足元のブロックを調べます
let belowBlock = agent.inspect(AgentInspection.Block, DOWN);
// 印が見つかった場合、そのブロックIDを返します
if (pillarBlocks[belowBlock] != undefined) {
player.say(`印を発見しました:ID ${belowBlock}`);
return belowBlock;
}
// 見つからなかった場合、右に移動します
let canMove = moveRight185(agentStatus);
if (!canMove) {
// 右に移動できなくなった場合は、0を返します
return 0;
}
}
}
// 線路を修復する関数
function buildRails185(agentStatus: { [key: string]: number }, blocks: number[]) {
// スタート地点の位置を記録します
let startForward = agentStatus["forward"];
// 線路の各パーツを設置していきます
for (let i = 0; i < blocks.length; i++) {
agentStatus["block"] = blocks[i];
placeBlock185(agentStatus);
moveForward185(agentStatus);
}
// エージェントをスタート地点まで戻します
while (agentStatus["forward"] > startForward) {
moveBack185(agentStatus);
}
}
// チャットコマンドで線路を修復する処理を開始します
player.onChat("18-5", function () {
// エージェント状態を初期化します
dic_agentStatus185["block"] = 0;
dic_agentStatus185["forward"] = 0;
dic_agentStatus185["right"] = 0;
dic_agentStatus185["placeDirection"] = DOWN;
// 線路の印を記録する配列を初期化します
array_builtRails185 = [];
// エージェントを1歩前に移動させます
moveForward185(dic_agentStatus185);
while (true) {
// 地面の印を探します
let markerBlockId = findMarker185(dic_agentStatus185, dic_railBlocks185);
if (markerBlockId <= 0) {
// 印が見つけられないまま移動できなくなった場合は、終了します
player.say("エラー:移動できなくなりました");
break;
}
// 発見した印を配列に記録します
array_builtRails185.push(markerBlockId);
// 線路の材料ブロック番号の配列を取得します
let blocks = dic_railBlocks185[markerBlockId];
// 線路を修復します
buildRails185(dic_agentStatus185, blocks);
// 右へ移動します
moveRight185(dic_agentStatus185);
// すべての線路を修復し終わった場合は終了します
if (array_builtRails185.length >= Object.keys(dic_railBlocks185).length) {
player.say("すべての線路を修復しました");
break;
}
}
player.say("作業を終了します");
});