Minecraftとタートルと僕スマートフォン用の表示で見るMinecraftとタートルと僕PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。Turtleを紹介しました。前々回に紹介した回転式直下掘りプログラムを、シルクタッチを使うよう改造しましょう。最終的なソースコードはこの記事の最後に挙げるとして、まず改造のポイントを抑えていきます。turtle.dig()を、digSilkTouch()に置き換える。ポイント2)燃料消費の激しさを考慮したパラメータ調整ポイント3)ついでに、採掘結果を最後に表示するポイント4)その他、エラー処理など主にこの4点を改造しました。それぞれ具体的に見ていきましょう。turtle.dig()を、digSilkTouch()に置き換える。turtle.dig_org関数へとバックアップをとりdigSilkTouch関数を、turtle.dig関数へと置き換えしています。関数の置き換えですが、なぜこのようなことができるのかできるだけ簡単に説明するならば、Luaの関数はすべてが無名関数を変数に代入したものだからです。「turtle.dig」は変数名であり、中には実際に穴を掘る関数(function)オブジェクトが代入されています。「turtle.dig()」とすることで変数内に入っている関数を実行します。このあたりの詳しい話は以下の記事をどうぞ。Minecraftとタートルと僕そしてもう一つ。以下の構文をはじめて見た人は戸惑うかもしれません。解釈し、「=」の右側から処理します。条件式1が「偽(nil/false)ではないとき」に条件式1をそのまま変数に代入します。逆に条件式1が「偽のとき」には条件式2の結果を変数に代入します。Luaでは、そもそも存在しない変数を参照すると偽(false)というルールがあるので、この構文は、変数(条件式1)がすでにあるときにはその値を使って、まだ未定義ならば初期値(条件式2)を設定するという、よくある慣用表現となっています。今回は、このプログラムをCCコンピュータを再起動せずに何度も実行したときに、オリジナルdig_org()をさらに上書きしてしまうことを防いでいます。dig_org()バックアップがあるなら、もうそれにはもう触らないようにしているのです。turtle.dig()/turtle.digDown()するだけで、シルクタッチができるようになりました。ポイント2)燃料消費の激しさを考慮したパラメータ調整シルクタッチ採掘をするたびに燃料を1消費することに注意しなくてはなりません。そのために、燃料に関するパラメータを調整しています。具体的には以下の2箇所。MIN_FUEL_LEVEの値を増やしています。revolve()関数の中で、燃料が足りなくなったら途中で採掘をやめる処理がありますが、余裕を持たせるために上に戻るために必要な燃料に+10しています。ポイント3)ついでに、採掘結果を最後に表示する採掘終了後に、残った現在の燃料といくつ掘ったのかを報告します。そのため掘ったブロックのカウント用に、L49でグローバル変数Countを用意し、L52とL56でdig()に成功したらカウントを増やしています。ポイント4)その他、エラー処理など採掘開始時、穴にフタをする(CLOSE_HOLEフラグがtrue)予定なのに、フタ用のブロックをインベントリに入れていない場合はエラーを返してプログラムを終了するようにしました。このエラー処理に、Luaの「assert」関数を使っています。第1引数が偽のときに、エラーメッセージを表示してプログラムを緊急終了する。)つまり、L86-89によって、「CLOSE_HOLE_FLAGがtrue」のときに、フタ用ブロックが5個未満ならエラーで停止し、エラーメッセージを表示します。フタ用ブロックをスロット1に入れておけば、問題なく採掘を開始します。燃料やフタ用アイテムを入れてから、手動でプログラム名を入力して実行、という手順が非常に面倒です。次回は、startupなどでプログラムを自動起動後に、必要アイテムがインベントリ内に入っていないことがわかったら、入れられるまで待つというプログラムを検討してみます。はてなブログPro「Minecraft」「ComputerCraft」について知りたいならば「お勧めコンテンツ」の『ComputerCraftとは』をご覧下さい。