17-7 廃坑から覗く闇②

解説動画

解答コード

// エージェントの移動時に使うブロック番号の連想配列
let dic_item177: { [key: string]: number } = {
    "air": 0 // 空気ブロックの番号
};

// 柱のIDの連想配列
let dic_pilerId177: { [key: string]: number } = {
    "first": 1, // 1番目の柱
    "second": 2 // 2番目の柱
};

// 柱を構成するブロック番号配列の二次元配列
let arr_blocks177: number[][] = [
    [], // 1番目の柱を構成するブロック番号配列
    []  // 2番目の柱を構成するブロック番号配列
];

// エージェントの状態
let dic_agentStatus177: { [key: string]: number } = {
    "row": 0 // エージェントの高さ方向の位置(床上を0とする)
};

// 柱の状態
let dic_pillarStatus177: { [key: string]: number } = {
    "id": 0, // 柱のID
    "height": 6 // 柱の高さ(ブロック数)
};

// エージェントを上に1段移動します
function moveUp177(agentStatus: { [key: string]: number }, maxRow: number) {
    if (agentStatus["row"] >= maxRow) {
        return false;
    }
    agent.move(UP, 1);
    agentStatus["row"] += 1;
    return true;
}

// エージェントを下に1段移動します
function moveDown177(agentStatus: { [key: string]: number }, minRow: number) {
    if (agentStatus["row"] <= minRow) {
        return false;
    }
    agent.move(DOWN, 1);
    agentStatus["row"] -= 1;
    return true;
}

// エージェントを床の高さに移動します
function moveToFloor177(agentStatus: { [key: string]: number }) {
    while (true) {
        let shouldContinue = moveDown177(agentStatus, 0);
        if (shouldContinue == false) {
            break;
        }
    }
}

// エージェントを左の柱まで移動します
function moveToLeftPillar177(agentStatus: { [key: string]: number }) {
    let airBlockId = dic_item177["air"];

    while (true) {
        agent.move(LEFT, 1);
        let blockId = agent.inspect(AgentInspection.Block, FORWARD);
        if (blockId !== airBlockId) {
            break;
        }
    }
}

// エージェントを背後の柱まで移動します
function moveToRearPillar177(agentStatus: { [key: string]: number }) {
    let airBlockId = dic_item177["air"];

    agent.turn(RIGHT);
    agent.turn(RIGHT);
    while (true) {
        agent.move(FORWARD, 1);
        let blockId = agent.inspect(AgentInspection.Block, FORWARD);
        if (blockId !== airBlockId) {
            break;
        }
    }
}

// 柱をコピーします
function copyPillar177( agentStatus: { [key: string]: number }, 
                        pillarStatus: { [key: string]: number }, 
                        blocks: number[][]) {
    // 柱の情報を取り出します
    let pillarId = pillarStatus["id"]; // 柱のID
    let maxRow = pillarStatus["height"] - 1; // エージェントを移動させる高さ位置の最大値

    // 柱を構成するブロックを、床から天井まで順番にコピーします
    while (true) {
        // 柱のブロック番号を調べて登録する
        let blockId = agent.inspect(AgentInspection.Block, FORWARD);
        blocks[pillarId - 1].push(blockId);
        // 上にひとつ登る(高さの最大値まで)
        let shouldContinue = moveUp177(agentStatus, maxRow);
        if (shouldContinue == false) {
            break;
        }
    }
}

// 柱をペーストします
function pastePillar177(agentStatus: { [key: string]: number }, 
                        pillarStatus: { [key: string]: number }, 
                        blocks: number[][]) {
    // 柱の情報を取り出します
    let pillarId = pillarStatus["id"]; // 柱のID
    let maxRow = pillarStatus["height"] - 1; // エージェントを移動させる高さ位置の最大値

    // 柱を構成するブロックを、床から天井まで順番に置き換えます
    while (true) {
        // 柱のブロック番号を取り出して置き換える
        let blockId = blocks[pillarId - 1][agentStatus["row"]];
        agent.destroy(FORWARD);
        agent.setItem(blockId, 1, 1);
        agent.place(FORWARD);
        // 上にひとつ登る(高さの最大値まで)
        let shouldContinue = moveUp177(agentStatus, maxRow);
        if (shouldContinue == false) {
            break;
        }
    }
}

// チャットコマンド「17-7」で柱の修正を開始します
player.onChat("17-7", () => {

    player.say("=== 柱の修正開始 ===");

    dic_agentStatus177["row"] = 0; // エージェントの床からの高さを初期化します
    arr_blocks177 = [[],[]];   // 柱を構成するブロック番号配列の配列を初期化します
    
    // 1番目の柱をコピーします
    dic_pillarStatus177["id"] = dic_pilerId177["first"]; // 柱のIDを1番目に設定します
    copyPillar177(dic_agentStatus177, dic_pillarStatus177, arr_blocks177);

    // 床の高さに戻ります
    moveToFloor177(dic_agentStatus177);

    // 2番目の柱へ移動します(エージェントから見て背後の柱)
    moveToRearPillar177(dic_agentStatus177);

    // 2番目の柱をコピーします
    dic_pillarStatus177["id"] = dic_pilerId177["second"]; // 柱のIDを2番目に設定します
    copyPillar177(dic_agentStatus177, dic_pillarStatus177, arr_blocks177);

    // 床の高さに戻ります
    moveToFloor177(dic_agentStatus177);

    // 右奥の柱へ移動します(エージェントから見て左にある柱)
    moveToLeftPillar177(dic_agentStatus177);

    // 右奥の柱へ2番目の柱をペーストします
    pastePillar177(dic_agentStatus177, dic_pillarStatus177, arr_blocks177);

    // 床の高さに戻ります
    moveToFloor177(dic_agentStatus177);

    // 左奥の柱へ移動します(エージェントから見て背後の柱)
    moveToRearPillar177(dic_agentStatus177);

    // 左奥の柱へ1番目の柱をペーストします
    dic_pillarStatus177["id"] = dic_pilerId177["first"]; // 柱のIDを1番目に設定します
    pastePillar177(dic_agentStatus177, dic_pillarStatus177, arr_blocks177);

    player.say("17-7 柱の修正完了!");
});