解説動画

解答コード
const TORCH_ID: number = 50; // たいまつ
const COAL_ID: number = 173; // ゴール地点の目印(横穴・トンネル・橋のゴールで共通)
const AIR_ID: number = 0; // 空気(Stage06〜10共通、前方・足元などが塞がっていないかの判定に使う)
function digForward() {
// プレイヤーの身長(2ブロック)分の通路を前方に確保する。処理後、エージェントは元の高さ・位置に戻る
// destroyは対象がAIRだとエラーになるため、いずれも先にinspectで確認してから実行する
let aheadId: number = agent.inspect(AgentInspection.Block, FORWARD);
if (aheadId != AIR_ID) {
agent.destroy(FORWARD);
}
agent.move(UP, 1);
let aheadUpId: number = agent.inspect(AgentInspection.Block, FORWARD);
if (aheadUpId != AIR_ID) {
agent.destroy(FORWARD);
}
agent.move(DOWN, 1);
}
function placeTorch() {
// たいまつは床から1ブロック上(プレイヤーの身長と同じ高さ)の右の壁に置く。呼び出し元でスロット1を選択済み・設置可能な位置であることを確認してから呼ぶ。処理後、エージェントは床の高さへ戻る
agent.move(UP, 1);
agent.setItem(TORCH_ID, 1, 1);
agent.place(RIGHT);
agent.move(DOWN, 1);
}
player.onChat("19-7", function () {
player.say("横穴を進みながらたいまつを置きます");
agent.setSlot(1); // このあとはスロット1に常に1個だけたいまつを補充しながら使う
let reachedGoal: boolean = false;
while (!reachedGoal) {
try {
let aheadId: number = agent.inspect(AgentInspection.Block, FORWARD);
if (aheadId != AIR_ID) {
throw "天井がくずれて進めません";
}
agent.move(FORWARD, 1);
} catch (e) {
player.say("例外を検出: " + e);
player.say("掘り返してから進みます");
digForward();
agent.move(FORWARD, 1);
}
let belowId: number = agent.inspect(AgentInspection.Block, DOWN);
if (belowId == COAL_ID) {
reachedGoal = true;
} else {
placeTorch();
}
}
player.say("横穴の先まで到達しました");
});