プログラムに縦方向と横方向の動きをカウントさせて、燃料が規定値を下回るとチェストに行って燃料を補給して元居た場所に戻っていきます。タートルの位置の把握することが重要となります。
範囲は8x8で設定しています
※自動農業でのタートルの動きを想定したプログラムです、実際に植え付けや収穫は行いません、燃料が規定値を下回ったら補給するだけです
タートルのインベントリは空にします
タートルの燃料レベルは、0です
前のチェストに木炭1スタック用意します
プログラムのタートルの動き
タートルはチェストから木炭を1入手して燃料を補給します
燃料レベルは80となります
タートルの動き
前に7ブロック進み、列を移動して、7ブロック戻るを3回繰り返します
前に7ブロック進み、列を移動して、7ブロック戻り、スタート地点に戻ります
どの位置にいても燃料レベルが40を下回るとチェストに戻って燃料を1補給します
燃料が40を下回った地点まで戻り移動を開始します
タートルの燃料値の下限
if turtle.getFuelLevel()<40 then
列の移動の変数を無限ループ1回毎にリセット
local Line=0
列の移動をしたときに+1を加えます
Line=Line+1
前に進む変数をループ毎にリセット
local Forward=0
1ブロック前に進んだときに+1を加えます
Forward=Forward+1
戻ってくる変数をループ毎にリセット
local Uturn=7
1ブロック戻ってときに-1を引きます
Uturn=Uturn-1
--####燃料低でチェストに戻り元の場所に戻るプログラム
turtle.select(1)
turtle.suck(1)
turtle.refuel(1)
turtle.up()
turtle.forward()
turtle.forward()
while true do
local Line=0
for A=1,3 do
local Forward=0
for A=1,7 do
local FuelLevel=turtle.getFuelLevel()
print("FuelLevel:",FuelLevel)
if turtle.getFuelLevel()<40 then
turtle.turnLeft()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Forward do
turtle.forward()
end
turtle.forward()
turtle.select(1)
turtle.suckDown(1)
turtle.refuel(1)
turtle.turnRight()
turtle.turnRight()
turtle.forward()
for A=1,Forward do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
end
turtle.forward()
Forward=Forward+1
print("Forward:",Forward)
end
turtle.turnRight()
turtle.forward()
Line=Line+1
print("Line:",Line)
turtle.turnRight()
local Uturn=7
for A=1,7 do
local FuelLevel=turtle.getFuelLevel()
print("FuelLevel:",FuelLevel)
if turtle.getFuelLevel()<40 then
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Uturn do
turtle.forward()
end
turtle.forward()
turtle.select(1)
turtle.suckDown(1)
turtle.refuel(1)
turtle.turnRight()
turtle.turnRight()
turtle.forward()
for A=1,Uturn do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnRight()
end
turtle.forward()
Uturn=Uturn-1
print("Uturn:",Uturn)
end
turtle.turnLeft()
turtle.forward()
Line=Line+1
turtle.turnLeft()
end
local Forward=0
for A=1,7 do
local FuelLevel=turtle.getFuelLevel()
print("FuelLevel:",FuelLevel)
if turtle.getFuelLevel()<40 then
turtle.turnLeft()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Forward do
turtle.forward()
end
turtle.forward()
turtle.select(1)
turtle.suckDown(1)
turtle.refuel(1)
turtle.turnRight()
turtle.turnRight()
turtle.forward()
for A=1,Forward do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
end
turtle.forward()
Forward=Forward+1
print("Forward:",Forward)
end
turtle.turnRight()
turtle.forward()
Line=Line+1
print("Line:",Line)
turtle.turnRight()
local Uturn=7
for A=1,7 do
local FuelLevel=turtle.getFuelLevel()
print("FuelLevel:",FuelLevel)
if turtle.getFuelLevel()<40 then
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Uturn do
turtle.forward()
end
turtle.forward()
turtle.select(1)
turtle.suckDown(1)
turtle.refuel(1)
turtle.turnRight()
turtle.turnRight()
turtle.forward()
for A=1,Uturn do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnRight()
end
turtle.forward()
Uturn=Uturn-1
print("Uturn:",Uturn)
end
turtle.turnRight()
for A=1,7 do
turtle.forward()
end
turtle.turnRight()
end
--####燃料低でチェストに戻り元の場所に戻るプログラムの終わり
プログラムには print() を使用して燃料値、移動カウントをタートル画面に表示するようにしていますが、省略すればより短くなります。また新たにチェストでのタートルの動きを function MoveChesu() と関数とすればさらに短くなります。ただし燃料値が低くなりチェストに戻る動作を関数化すると変数を反映させることが難しくなります。
新たに関数処理を加えるとメイン処理とのつながりで、タートルの位置ずれが起こることが判明しました。turtle.forward() だけのような早い処理の場合は、os.sleep(秒) などを関数の最後に入れることで解消されるようです。
--####短くしたプログラム
--####燃料低でチェストに戻り元の場所に戻るプログラム
turtle.select(1)
turtle.suck(1)
turtle.refuel(1)
turtle.up()
turtle.forward()
turtle.forward()
function MoveChest()
turtle.forward()
turtle.select(1)
turtle.suckDown(1)
turtle.refuel(1)
turtle.turnRight()
turtle.turnRight()
turtle.forward()
end
while true do
local Line=0
for A=1,3 do
local Forward=0
for A=1,7 do
if turtle.getFuelLevel()<40 then
turtle.turnLeft()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Forward do
turtle.forward()
end
MoveChest()
for A=1,Forward do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
end
turtle.forward()
Forward=Forward+1
end
turtle.turnRight()
turtle.forward()
Line=Line+1
turtle.turnRight()
local Uturn=7
for A=1,7 do
if turtle.getFuelLevel()<40 then
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Uturn do
turtle.forward()
end
MoveChest()
for A=1,Uturn do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnRight()
end
turtle.forward()
Uturn=Uturn-1
end
turtle.turnLeft()
turtle.forward()
Line=Line+1
turtle.turnLeft()
end
local Forward=0
for A=1,7 do
if turtle.getFuelLevel()<40 then
turtle.turnLeft()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Forward do
turtle.forward()
end
MoveChest()
for A=1,Forward do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
end
turtle.forward()
Forward=Forward+1
end
turtle.turnRight()
turtle.forward()
Line=Line+1
turtle.turnRight()
local Uturn=7
for A=1,7 do
if turtle.getFuelLevel()<40 then
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnLeft()
for A=1,Uturn do
turtle.forward()
end
MoveChest()
for A=1,Uturn do
turtle.forward()
end
turtle.turnRight()
for A=1,Line do
turtle.forward()
end
turtle.turnRight()
end
turtle.forward()
Uturn=Uturn-1
end
turtle.turnRight()
for A=1,7 do
turtle.forward()
end
turtle.turnRight()
end
--####燃料低でチェストに戻り元の場所に戻るプログラムの終わり
関連サイト
コンピュータークラフトを極める その3
0 件のコメント:
コメントを投稿