解説動画
解答コード
// エージェントの移動時に使うブロック番号の連想配列
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 柱の修正完了!");
});