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

Minecraftとタートルと僕

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

え?シルクタッチで掘るのはやすぎ? となる事例

はじめに

前回は、シルクタッチタートルのすばらしさをアピールしました。

中でもシルクタッチ採掘に時間がかからないことはとても強力なのですが、それが問題となることがごく稀にあります。

早すぎることが問題になる場合

たとえば、砂と砂利は下のブロックがなくなると落下しますが、この処理をするプログラムを組むときには気をつけなければなりません。

f:id:hevohevo:20140221224516p:plain

高く積み上げられた砂が目の前にあるとします。目の前の砂山(柱)がなくなるまでずっと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