Minecraftとタートルと僕スマートフォン用の表示で見るMinecraftとタートルと僕PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。Minecraftはじめに前回のプログラムによって、タートルを遠隔操作できるようになりました。メッセージ送信プログラムを実行するときに命令文を引数として与えることで、タートルに対して様々な命令ができます。Minecraftとタートルと僕しかし、致命的な問題点があります。見つけ次第駆除しましょう!)。「キーボードの特定のキーと関数文字列をあらかじめ結び付けておいて、キー操作で命令する」というプログラムに改造してみました。ソースコードの解説は後回しにして、まずは使ってみましょう。する新しいプログラムです。msg_sender2受信側(タートル側)・・・こちらは前回のものをそのまま使います。msg_receiver3ダウンロードしたら、受信側(タートル側)プログラムを起動し、待ち受け状態にします。30のように、送信先IDを引数にして実行してください。あとはキー入力でタートルを自在に操作しましょう。燃料を補給しておくのを忘れないでください。Minecraftのクリエイティブモードのキー操作をイメージして調整してあります。キーボードの「w」キーを押すと、"turtle.forward()"という文字列をタートルに送信して、タートルは前進します。バージョン3ソースコード前回のものをそのまま使います。前述の「キー・送信文字列の対応表」通りの挙動を実現するには、まず一番簡単な方法として、IF文による条件分岐を延々と繋げていく方法があります。endしかしこの方法ですと、新しいキーの追加・削除・変更などのメンテナンス性は最悪ですし、何よりプログラム行数が無駄に長くなりがちです。そこで、変換テーブルによる実装を試みました。この実装方法はハッシュ(key-value)テーブルを持つプログラム言語でよく使われます。ペアを詰め込んだテーブル「trans_tbl」を用意しています。trans_tbl["w"]のように呼び出すと、そのペア値である"turtle.forward()"が返ってきます。Luaのテーブルは、そのような値がないときには、nilを返します(例:定義されていないtrans_tbl["hogehoge"]の返値はnil)。keyイベントの利用(L24)において、os.pullEvent()関数を使っています。この関数はComputerCraftのイベントを待ち受ける関数で、イベント名"key"を引数として与えることにより、キー入力検知します。具体的には、次のような機能です。os.pullEvent(イベント名)何らかのイベントが発生するまで待ち、発生したらそのイベント名とともに様々な関連する値を返す。イベントの種類についてはこちら。省略したときは(ほとんど)全てのイベントに反応する。今回は"key"イベントについてまとめる。イベント名(文字列)。キースキャンコード(数字)。キーボードの各キーに対応した数字(たとえばスペースキーなら57)を返す。Wikiまた、ボタン入力で得たキースキャンコードですが、数字であるため、扱いづらいです(57と言われましても・・・)。扱いやすいように、キースキャンコード(数字)からキー名(文字列)に変換してくれる関数を利用しましょう。keys.getName(キースキャンコード)キースキャンコードを引数として与えると、対応するキーの名前を返す。"space"なお、CCのイベントについてより詳しく知りたい方は、以下の「CCチュートリアル目次」より「sleep実装からイベントを学ぶ」の一連の記事をご覧ください。このプログラムを起動するときに、引数として送信先のIDを指定すること。引数がないときには、エラーメッセージを出して終了します。変換テーブルの定義です。テーブルコンストラクタ{}を使っています。各行の末尾にこっそりと「,」コンマが入っているので注意(最終行除く)。このプログラムを途中でとめるときには、CTRL+Tを押してくださいね。いう注意メッセージを表示。このプログラムのメインループ。os.pullEvent("key")で、キー入力を検知。変数scancodeに、スキャンコード(数字)が入っています。スキャンコード(数字)をキー名(文字列)に変換しています。変換テーブルを用いて、キー名に対応するメッセージに変換しています。押されたキーの名前と、それに対応するメッセージが何かを画面表示。変換テーブルにないキーについては、変数messageの値がnilになっているのでprint()できない。"none"としている。Luaの決まり文句です。変数messageの値がある(変換テーブルで変換できた)ときに、メッセージを送信します。まとめ送信側プログラムの変換テーブルを編集しさえすれば、いくらでも命令を作ることができます。turtle.down()"などもいいですね(キー「x」を押すと、真下掘って下に移動)。「遠隔操作」で「好きなポイントに移動」して「複雑な穴掘りプログラムスタート」なんてできたら面白そうではありません?次回は、内容が少しだけ高度になりますが、高度な部分の説明はできるだけさらっと簡単に扱い(これは「おまじない」です)、便利なプログラムの紹介という内容でお送りする予定です。ひさしぶりの更新です。version0.4を完成させました。はてなブログPro「Minecraft」「ComputerCraft」について知りたいならば「お勧めコンテンツ」の『ComputerCraftとは』をご覧下さい。