ただしチェストの中の13スロットまでしかアクセスできないので、伐採した原木が増えてくるとこのプログラムは機能しなくなります。あくまでもタートルのスロットを制するのが目的なので、気にしないでことにします。
ラージチェストの横にタートルを配置します
タートルのインベントリには何も入れません
13スロット目までしかタートルはアクセスしてくれません
※チェストのインベントリをフル活用するために中身を全部出すことも考えましたが、見た目の問題で却下しました。
スロット1に苗木、スロット2に骨粉、スロット3に木炭が入ります
残りのアイテムはチェストに戻します
苗木を植えて苗木が育つまで骨粉を散布します
原木になったら伐採をスタート、原木部分がなくなるまで伐採
回転しながら葉を破壊して下降します
地上まで下降したら苗木を1回転して回収します
苗木と木炭が5個、骨粉が10個を下回るとチェストに行って補充します
スロット1.2.3に違うアイテムが入ってしまうとプログラムは機能しなくなります
燃料の補給はタートルの燃料値が、80より少なくなったら行います
自動植林 その1では、タートルは前進しませんでしたが、今回は1歩前進しますので、苗木が育ったら伐採を開始するプログラムを加えています。これがないとタートルの位置ずれが発生することがありました。
--####自動植林プログラム
while true do--メイン処理の無限ループ
local COUNT=0--上昇の変数の定義
turtle.turnLeft()
while true do--アイテム補充の無限ループの実行
if turtle.getItemCount(1)<5 or--スロット1のアイテム数が5個か
turtle.getItemCount(2)<10 or--スロット2がアイテム数が10個か
turtle.getItemCount(3)<5 then--スロット3がアイテム数が5個なら
for A=4,16 do--スロット4~16までアイテムをチェストから入手
turtle.select(A)
turtle.suck()
local SLOT=turtle.getItemDetail()
if SLOT then
if SLOT.name=="minecraft:sapling" then--苗木なら
turtle.transferTo(1)--スロット1に入れる
elseif SLOT.name=="minecraft:dye" then--骨粉なら
turtle.transferTo(2)--スロット2に入れる
elseif SLOT.name=="minecraft:coal" then--木炭なら
turtle.transferTo(3)--スロット3に入れる
end
end
end
for A=4,16 do--スロット4~16までのアイテムをチェストに戻す
turtle.select(A)
turtle.drop()
end
else break--アイテムの補充の無限ループを終える
end
end
turtle.turnRight()
if turtle.getFuelLevel()<80 then--タートルの燃料が80より少ないなら
turtle.select(3)
turtle.refuel(1)--燃料の補給
end
turtle.forward()
turtle.select(1)
turtle.place()--苗木を植える
turtle.select(2)
while true do--骨粉を巻く無限ループの実行
local ARU,NANIGA=turtle.inspect()
if ARU then
if NANIGA.name=="minecraft:log" then--前が原木なら
break--骨粉を巻く無限ループを終える
else--原木でないなら
turtle.place()--骨粉散布
os.sleep(1)
end
end
end
for A=1,20 do--原木伐採のループの実行
local ARU,NANIGA=turtle.inspect()
if ARU then
if NANIGA.name=="minecraft:log" then--前が原木なら
turtle.dig()--原木を破壊
if turtle.up() then
COUNT=COUNT+1--上昇できたら+1
else--上昇できなければ
turtle.digUp()--上の葉を破壊
turtle.up()
COUNT=COUNT+1--上昇出来たら+1
end
else break--原木でないなら原木伐採ループを終える
end
end
end
turtle.dig()
turtle.forward()
for A=1,COUNT do--上昇した分だけ下降
for A=1,4 do--回転しながら葉を破壊
turtle.dig()
turtle.turnRight()
end
turtle.down()
end
for A=1,4 do--1回転して苗木を回収
turtle.turnRight()
turtle.suck()
end
turtle.back()
turtle.back()
end--メイン処理の無限ループの終わり
なぜだか頂上で前に行けずにフリーズすることがありました、原因不明のため、前に行くを無限ループとしたり、COUNT=0の位置を工夫しましたが改善されず、どこかしらのブレークに問題があるのかなとか思います。ただまだ確認が不完全です。※確認できました
原木伐採の無限ループのブレークが全プログラム終了となってしまうことが、あったようです。骨粉散布の無限ループは「もしも原木ならブレーク」、原木伐採は「もしも原木じゃないならブレーク」と真逆なので意味合いが違います。「if not~」を使ってみましたが上手くいきませんでした。
このように変更したらプログラムが止まることがなくなりました。
while true do--原木伐採の無限ループの実行
else break--原木でないなら原木伐採の無限ループを終える
↓
for A=1,20 do--原木伐採のループの実行
else break--原木でないなら原木伐採のループを終える
lua 言語はシンプルなのかもしれませんが、単純に考えたらできるってパターンが多いです。プログラムを書くことよりも読むことを重視したら「プログラム=難しい」の無限ループから抜け出せる気がします。
チェスト2個のプログラムです、右に原木回収のチェストを置きます
上記のプログラムの最後から2行目の「end」の前に入れることで機能します
turtle.turnRight()
for A=4,16 do
turtle.select(A)
local SLOT=turtle.getItemDetail()
if SLOT then
if SLOT.name=="minecraft:log" then
turtle.drop()
end
end
end
turtle.turnLeft()
関連サイト
コンピュータークラフトを極める その2
0 件のコメント:
コメントを投稿