Minecraftとタートルと僕

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

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

農業タートルプログラミング チュートリアル(1)

さてまず計画を立てよう。一番最初なのでシンプルに行こう。
なお、タートル自体は移動しないので燃料はいらないよ。
燃料いらずで働いてくれるとてもエコなプログラムだよ。
骨粉消費量はひどいのでスケルトンTT必須かもだけどw

Farmingについて基本情報

  • 正面の土に対して turtle.dig() すると耕す
  • 耕した正面の土に対して turtle.place() すると、選択スロットのアイテムを植える
  • 骨粉のスロットを選択しておいて、未成熟の作物に対して turtle.place() すると骨粉を振り掛ける
  • 植えたばかりのバニラ作物(小麦・ジャガイモ・人参・カカオ)を完全成熟させるには骨粉振り掛けが2~3回必要(ランダム)
  • 正面の作物に対して turtle.dig() すると収穫でき、得たアイテムはインベントリ内に入る。なお、入るスロットは現在の選択スロットを優先するが、入らない場合はそれ以降のスロットが選ばれる

仕様策定

  • スロット1は種用、スロット2は骨粉用、それ以外は収穫した作物所持用
  • まず正面の土を耕しておいて、あらかじめ決められた回数だけ種まき・骨粉・収穫を繰り返す
  • タートルプログラミングTIPS
    • 後からプログラムの設定を変えられるようにプログラム先頭で定数定義しておくと親切
    • メイン実行部分はできるだけシンプルに。サブ関数で作業をモジュール化しておくと後から機能拡張しやすい
    • 現在の選択スロットが重要になるメソッド(たとえば、place()、dig() など)を実行するときには、念のために、その直前でselect()して現在の選択スロットを確定しておくとミスが減るよ

この仕様でのプログラム

-- ########################
-- cultivate <n>
-- ########################

-- #############
-- config
MAX = 10
SEED_SLOT = 1
MEAL_SLOT = 2

-- #############
-- define functions
function plantSeed()
  turtle.select(SEED_SLOT)
  turtle.place()
end

function useMeals()
  turtle.select(MEAL_SLOT)
  turtle.place()
  turtle.place()
  turtle.place()
end

function harvest()
  turtle.select(SEED_SLOT)
  turtle.dig()
end

-- #############
-- Main
turtle.dig() 
for i=1,MAX do
  print(i,'/',MAX)
  plantSeed()
  useMeals()
  harvest()
end

プログラム解説(2013/12/18追記)

もう説明不要なくらい簡単だよね。でも最初なので一応説明しておこう。

使っているTurtle API

まず、使っているTurtle APIの機能を簡単に説明しておこうかな。

  • turtle.select(スロット番号) ・・・タートルのインベントリ中で、「選択スロット」を指定する番号に切り替える。つまり、どのスロットに注目するかということだね。
  • turtle.place() ・・・「選択スロット」のアイテムを前方に設置しようと試みる。今回は種などを前の地面に植えたり、あるいは骨粉を作物に振り掛けたりする。
  • turtle.dig() ・・・前方のブロックを掘る。今回は、前の地面を耕したり、あるいは作物を収穫するのに使う。

Main部分から見ていこう

プログラムを目で追うときにはMain部分から見ていくのがポイント。

  • まず、turtle.dig()で目の前の地面を耕している。
  • 次に for ~ end ループ。i=1からMAX(ここではMAX=10)まで一つずつカウントを増やして、計10回繰り返すことになる。その繰り返す中身は、以下のとおり。
    • いま何回目の繰り返しかをprintで画面表示
    • plantSeed() :自分で定義した関数。種を植えるよ。
    • useMeals() :自分で定義した関数その2。作物に骨粉を振りかけるよ。
    • harvest() :自分で定義した関数その3。作物を収穫するよ。

簡単だけど問題点もいくつか・・・

ただ簡単すぎていくつか落とし穴がある
・10回と決め打ちじゃなくて、プログラム実行時に繰り返し回数を指定したい
・10回くらいならいいけれど、回数が増えると骨粉が尽きて未成熟の作物を収穫してしまう
・骨粉補給してないので最大でも20~30回くらいしか繰り返しできなくね?

このあたり次回以降に解決しようね。