読者です 読者をやめる 読者になる 読者になる

Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

採掘タートルで整地する: (1)落下する砂や砂利の対策

チュートリアル Lua ComputerCraft Minecraft

はじめに

ComputerCraftに最初から入っている excavate プログラムは、指定した範囲内を現在地から下方向へと掘っていきます。

それに対してこれから考える整地プログラムは、現在地より上側にある丘や山を掘ることになります。

下方向と上方向の採掘の違いで最も重要なのは、自然落下する砂や砂利の対策です。

正面にある砂山の対策

たとえば、タートルの正面に砂山(縦に積み重なった複数の砂/砂利ブロック)があるとしましょう。

f:id:hevohevo:20140708231709j:plain

turtle.dig()して目の前の砂ブロックを1つ破壊したとしても、次の瞬間には上から砂が落ちてきてすぐに目の前は埋まってしまいます。

そのため、次のようなプログラムを組んだとしても、落ちてきた砂ブロックに突き当たってしまい、前進することはできません。

-- 砂/砂利山には無力
turtle.dig() -- 正面ブロックを採掘
turtle.forward()  -- 前進

対策として、落ちてくる砂ブロックを全て破壊してあげましょう。

正面にブロックがある限り、ずーっと掘ってあげればよいのですから、Luaのwhileループが使えますね。

-- while 構文の使い方
while (条件式) do
  条件が真のときに繰り返す部分
end

while 構文を使った典型的な砂/砂利採掘プログラムは以下の通り。

-- 正面の砂/砂利を全て採掘するプログラム
while turtle.detect() do
  turtle.dig()
end

turtle.detect()関数は、正面にブロックがあるとtrueを返します。つまり上記プログラムは、正面にブロックを検知(detect)する限り、延々と do~endの間を繰り返すわけです。

なおこのプログラムは、以下のように省略することも可能です。

while turtle.dig() do

end

もっと省略表記するならば次のように。

while turtle.dig() do end

turtle.dig()は、正面ブロックの採掘に成功するとtrueを、失敗するとfalseを返します。

while構文の「条件式」の箇所にこの関数を入れることで、次のようにプログラムが処理されます。

  1. まずwhile構文の条件式を実行(評価)する
  2. 砂ブロックの採掘に成功したら、turtle.dig()はtrueを返す
  3. つまり、while構文の条件式が真だったので、do~end部を実行
  4. 実際にはdo~end部は空なので、whileの次のループを処理する。
  5. よって1へ戻る。

もし、砂山がなくなって採掘に失敗したらturtle.dig()がfalseを返すのでこのループは終了します。

真上から落ちてくる砂/砂利の対策

上方向に採掘していくのですから、たとえば真上にある石ブロックをturtle.digUp()したときに、さらにその上にある砂/砂利が落ちてくる可能性があります。

つまり、以下の図のような状況です。

f:id:hevohevo:20140708231514j:plain

このときに、次のようなプログラムでは、

turtle.digUp() -- 真上を採掘
turtle.up() -- 真上へ上昇する

真上の石ブロックを掘った後、落ちてくる砂にふさがれて真上に上昇することができません。

上昇するためには、上から落ちてくる砂を全て採掘しなくてはなりません。

そこで、さきほどの正面の砂/砂利対策を応用して次のようなプログラムを考えることができます。

while turlte.digUp() do end

さあこれで、全ての砂を採掘が・・・できません(涙) 

1、2回程度は掘ってくれますが、それ以上は途中で止まってしまいます。

とりあえず答えだけ先に

原因の解明は後回しにして、先に解答例をお見せしましょう。

while turlte.digUp() do
  os.sleep(0.4)
end

つまり、1回真上を採掘したら、0.4秒スリープ(待機)してから次のループへ進むというプログラムです。

またこの0.4秒は試行錯誤の末に求めた最短の待ち時間であり、これよりも短い時間だと動きません。

まとめ

今回の内容を簡単にまとめます。

真正面に砂/砂利の山があったとしても全て採掘して前進するプログラム(ただし特定の状況下では失敗します。その対策は今後の回で説明する予定)

while turtle.dig() do end
turtle.forward()

そして、

真上から砂/砂利が落ちてきたとしても全て採掘して上昇するプログラム

while turtle.digUp() do
  os.sleep(0.4)
end
turtle.up()

今後作っていく整地プログラムでは、これらを頻繁に使いますので、今のうちにしっかりと理解しておきましょう。

次回は、チュートリアルから少しだけ脱線して、「真上の砂を掘るのになぜ0.4秒の待機時間が必要なのか」についての考察回になります。

お楽しみに。