だいぶ日にちがあいてしまった。
別に旅行に行って遊びまくっていたわけじゃないんだからね!!
それはともかくとして今度は実際にタートルが移動するプログラムを組もうね。
課題はサトウキビ収穫プログラムだよ。
え?サトウキビ?
FFMとかMFRとかに自動収穫装置あるじゃないという突っ込みはスルーの方向でお願いします。
ではプログラム仕様の説明をば
サトウキビ収穫プログラムの仕様
農地の形状
以下は想定する農地の形状で、これを1セットとする。
この右側に同じ形状を好きなだけ繰り返すことができる。
今回想定する農地の形状を上から見た図。 (O:サトウキビ、W:水、T:タートル) OWO OWO OWO OWO OWO T
以下のような形状の農地もよく見るけれど、
無駄な移動を少なくするために上記の形状を採用するよ。
よく見かける農場(今回は不採用) OWO WOW OWO WOW OWO WOW
タートルの初期位置と収穫時の動き
- タートルは上図のように、農地の一番左下の位置をホームポジションとし、待機している。
- タートルはサトウキビの一番高い部分である高さ3を常時移動する。
- プログラムの設定項目として奥行きの数値(変数名、Z_SIZE)と、セットの繰り返し回数(COUNT)を指定できる。
- プログラムを実行するとすぐに収穫作業を開始し、終わったら待機(sleep)。30分後にまた再開。
- タートルの動き(「」内はプログラム中での関数名)
- 「goForward()」: まず前方のサトウキビをturtle.dig()で収穫、そして1歩前進してから真下のサトウキビをturtle.dig()する。あとはこれを繰り返して前進していく。
- 「goRightLine()」: 一番奥に着いたら、右を向いて前進2回、もう一度右を向くことで折り返す。
- 続けて、来たときと同じステップ数だけ前進(goForward)する
- 「goLeftLine()」: 折り返して戻ってきたら次のセットの開始位置につくため、左を向いて前進、左を向く。
- 「harvest()」ここまでの1~4を1セットとして、繰り返し回数(COUNT)分だけこれを繰り返す。
- 「backToChest()」: ホームポジションに戻る。
- 「dropItems()」:ホームポジションに戻ってきたら真下のチェストにアイテムをドロップする。
タートルの燃料補給について
- 燃料の仕様
- タートルは1歩進むごとに燃料値を1消費する。燃料値は燃料アイテムを補給「turtle.refuel()」することで増やすことができる。
- カマドで使えるアイテムを燃料として補給できるが、アイテムによって補給できる値は異なる。
- 本プログラムの仕様
- 移動予定距離がわかっているので必要燃料を最初に計算して、これを最低限必要な燃料(minFuelLevel)とする。
- プログラム開始時にスロット16にある燃料アイテムを補給する。
- 燃料補給しても必要燃料に届かない場合はエラーを返して終了する。
プログラム
-- #################################### -- harvest_millet -- version 0.1 -- http://hevohevo.hatenablog.com/ -- #################################### -- turtle position -- ######################### -- TOP view -- T: turtle, o: millet, W: water -- Z_SIZE=5, COUNT=1 -- oWo -- oWo -- oWo -- oWo -- oWo -- T -- Z_SIZE=5, COUNT=3 -- oWooWooWo -- oWooWooWo -- oWooWooWo -- oWooWooWo -- oWooWooWo -- T -- ######################### -- Side view -- Y position is 3, same as the top of the millet. -- T: turtle, o: millet, C: Chest for droping down millets -- oT -- oC -- o -- #################### -- config FUEL_SLOT = 16 Z_SIZE = 33 COUNT = 5 minFuelLevel = ((Z_SIZE + 2 + Z_SIZE + 1) * COUNT) + (3 * COUNT) -- ################### -- define functions function goForward(n) for i=1,n do turtle.dig() turtle.forward() turtle.digDown() end end function goRightLine() turtle.turnRight() goForward(2) turtle.turnRight() end function goLeftLine() turtle.turnLeft() goForward(1) turtle.turnLeft() end function harvest() for i=1,COUNT do goForward(Z_SIZE) goRightLine() goForward(Z_SIZE) goLeftLine() end end function backToChest() turtle.turnLeft() for i=1,COUNT*3 do turtle.forward() end turtle.turnRight() end function dropItems(begin_slot, end_slot) print('drop items: slots ',begin_slot,'-',end_slot) for i=begin_slot, end_slot do turtle.select(i) turtle.dropDown() end turtle.select(1) end -- ################### -- Main while true do turtle.select(FUEL_SLOT) print('harvest_millet ',Z_SIZE,' ',COUNT) print(' needed fuelLevel = ',minFuelLevel) turtle.refuel() turtle.select(1) if (turtle.getFuelLevel() < minFuelLevel) then print("Please insert fuel into slot ",FUEL_SLOT) return false end print('Starting harvest!') harvest() backToChest() dropItems(1,16) print('Finished!') sleep(1800) end
次回、改造案
実際に動かすといくつか不満が出てくるね。
次回は以下のような修正を施してみよう。
- プログラム実行時に奥行きや繰り返し回数を指定したい。
- 燃料を毎回スロット16に置くのが面倒。自分で補給させたい。