Minecraftとタートルと僕

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

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

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

ComputerCraftの無線通信を使いこなそう(8) ―インタラクティブな遠隔操作プログラム

はじめに

さて、前回までにおおよその機能は実現できましたが、まだいくつか不満があります。

まず一つは、キー入力でタートルを自在に動かせるのは良いけれど、あらかじめ登録しておいた(プログラム中の変換テーブルに書き込みした)命令しか実行できません。

ちょっと他の命令をしたいだけなのに、わざわざプログラムを編集しなくてはいけないというのは、不便ですよね。

そこで、メッセージ送信プログラムを次のように修正してみました。 まずはインストールして、実際にプログラムを動かしてみましょう。

インストール&実行

送信(コンピュータ)側

msg_sender5のインストール。

> pastebin get mV08nRTx msg_sender5

インストールしたら、送信先IDを引数にして、これまでのように実行してください。

受信(タートル)側

msg_receiver4のインストール。 前回と同じなので、すでにインストールしてあるならそのままで。

> pastebin get dEtcqCHY msg_receiver4

msg_receiver4を実行して、待ちうけ状態に。なお、燃料はあらかじめ補給しておくこと。

プログラム実行

送信(コンピュータ)側の画面です。

  1. "space"キーや"leftShif"キーなど、あらかじめ登録してあるキーは問題なく動きます。
    • f:id:hevohevo:20140319013130j:plain

  2. ここで、"enter"キーを押してみましょう。インタラクティブモード(interactive mode)に変わります。下画像のように、プロンプト「>」が表示されます。
    • f:id:hevohevo:20140319013133j:plain

  3. 好きな命令を入力してみましょう。ここではタートルの選択スロットを変更するturtle.select()関数を入力しています。
    • f:id:hevohevo:20140319013136j:plain

  4. 入力後、再度"enter"キーを押すと、その命令を確定します。確定したら以下の画像のようにインタラクティブモードを終了して、turtle.select(1)というメッセージを送信したことがプログラムより報告されます。
    • f:id:hevohevo:20140319013139j:plain

  5. なお、"q"キーを押すことで、プログラム自体を終了します。
    • f:id:hevohevo:20140319013142j:plain

ね? このインタラクティブモードってすごくありません?

では、どのようにしてこの機能を実現したか、具体的にプログラムを見てみましょう。

メッセージ送信(コンピュータ)側 バージョン5(修正)

msg_sender5

http://pastebin.com/mV08nRTx

変更点は、L31-37だけです。

  • L31) "enter"キーが入力され、(変換テーブルに"enter"に関する記述がないために)変数messageの値がnilであるときに以下の動作を行います。
  • L32,33,35) ただの画面表示メッセージ
  • L34) io.read()関数により、ターミナル画面での1行の入力を受け取り、変数messageに代入。
  • L37) "q"キーの入力、あるいはインタラクティブモードで、"q"の入力があったときにwhileループを抜けてプログラム終了。

ポイントは、 io.read() ですね。

LuaのI/Oモデルに関しては、また時間のあるときにでも詳しく説明しましょう。

今のところは、io.read()だけで、ターミナル画面上での1行の入力を読み込みことができると覚えておけばOKです。

おわりに

さてここまでくると、命令を送信したときに、

  • 「そもそもそのような命令が有効なのかどうか」
    • たとえば、命令したけれど、スペルミスなどで命令文そのものが有効ではないとか
  • 「その命令を実行しようとして成功したかどうか」
    • たとえば、turtle.up()を実行したけれど、障害物があって上に移動できなかったとか

という反応が気になるところです。

命令したときに、命令の遂行に成功したのか失敗したのか、そして失敗したのならどのような原因で失敗したのか。これらのエラーが返ってくると、さらにわかりやすく使いやすくなりますよね。

次回はこのあたりを改造しましょう。