はじめに
前回は、シルクタッチタートルのすばらしさをアピールしました。
中でもシルクタッチ採掘に時間がかからないことはとても強力なのですが、それが問題となることがごく稀にあります。
早すぎることが問題になる場合
たとえば、砂と砂利は下のブロックがなくなると落下しますが、この処理をするプログラムを組むときには気をつけなければなりません。
高く積み上げられた砂が目の前にあるとします。目の前の砂山(柱)がなくなるまでずっとdig()し続けるプログラムは次のようになります。
while turtle.detect() do turtle.dig() end
このプログラムで、砂も砂利も問題なく山を崩し続けることができます。 おそらく、detectの0.05秒、dig()の0.35秒という処理時間がうまく効いて、落下する砂・砂利の検出が問題なくできるのでしょう。
しかしこれがシルクタッチタートルのdigSilkTouch()だと問題が生じることがあります。
silkP = peripheral.wrap("right") while turtle.detect() do silkP.digSilkTouch() end
このプログラムでは、砂や砂利の山をうまく崩せません。1回digSilkTouch()を実行したら次のwhileループでdetect()に失敗して、ループから抜け出してしまいます。
実質的に経過時間がdetect()による0.05秒しかなく、処理が早すぎるために、落下する砂・砂利の検出に失敗しているためだと思われます。
sleep()で問題解決
うまく動くようにするにはsleepを入れてあげましょう。
silkP = peripheral.wrap("right") while turtle.detect() do silkP.digSilkTouch() os.sleep(0.3) end
なお、試行錯誤の結果、sleep(0.25)ではダメで、sleep(0.3)が必要なようです。
つまり、turtle.detect()の0.05秒と合わせて、砂ブロックの落ちる時間は0.35秒のようです(digSilkTouch()は時間がかからない)。
追記
1つのブロックをdig()するのに0.35秒かかることから、turtle.detect()は必要なく、 以下のコードでも問題なく動きます。
while turtle.dig() do -- nothing to do end
あるいはdigSilkTouch()ならば、
while digSilkTouch() do os.sleep(0.35) end