読者です 読者をやめる 読者になる 読者になる

Minecraftとタートルと僕

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

ComputerCraftの無線通信を使いこなそう(3) ―メッセージ送信・受信プログラム

はじめに

前回は、無線通信機能をシンプルに提供してくれるRednet APIを紹介し、このAPIを使ったメッセージを送信/受信するプログラムを紹介しました。

今回は前回紹介したプログラムに少しだけ手を加えて、より使いやすく工夫しましょう。

なお、複数のコンピュータ・タートルが絡み合った場合にどのような挙動になるかも検証してみます。

ソースコード

短いですね。これだけなら、手入力でも行けそうです。

メッセージ受信側

http://pastebin.com/tkqNydw2

  • 右側にあるモデムの準備 rednet.open("right")
  • whileループでずっと動き続ける
  • 自分のIDのチャンネルで待機し、メッセージがきたら3つの値を返す。
    • 第1返値(数字): 送信者ID(誰からのメッセージ?)
    • 第2返値(文字列): メッセージ文字列
    • 第3返値(数字): 通信する2者間の距離
  • 送信者IDとメッセージを画面に表示

プログラムの使い方

プログラム名msg_receiverを実行。

> msg_receiver

メッセージ送信側

http://pastebin.com/sfpBAcfe

  • 右側にあるモデムの準備 rednet.open("right")
  • プログラム実行時の引数を処理
    • 第1引数は、送信するメッセージを入力
    • 第2引数は、送信先のコンピュータID
      • 内部的には文字列として扱われているので、数字型に変換。
  • 指定したIDのコンピュータに、指定したメッセージを送信rednet.send(receiver_id, message)

プログラムの使い方

プログラム名msg_senderを、メッセージHello、送信先ID21として実行。

> msg_sender Hello 21 

実行例その1(送信1台、受信1台)

下の画像のように、送信側をコンピュータ(ID20)、受信側をタートル(ID30)とします。

  • f:id:hevohevo:20140313204241j:plain

    1. 受信側タートル(ID30)で、msg_receiverプログラムを起動しておきます。
    2. 送信側コンピュータ(ID20)で、msg_sender Hello 30と実行します。
    3. 受信側タートル(ID30)のターミナル画面を覗きに行くと、#20: Helloと表示されているはずです。
  • f:id:hevohevo:20140313211206j:plain

実行例その2(送信2台、受信1台)

下の画像のように、送信側のコンピュータ2台(ID20)(ID21)、受信側のタートル1台(ID30)を用意します。

  • f:id:hevohevo:20140313205907j:plain

    1. 受信側タートルで、msg_receiverプログラムを起動しておきます。
    2. 送信側コンピュータ(ID20)で、msg_sender Hello 30と実行します。
    3. 送信側コンピュータ(ID21)で、msg_sender HelloHello 30と実行します。
    4. 受信側タートルのターミナル画面を覗きに行くと以下のように表示されているはずです。
  • f:id:hevohevo:20140313211306j:plain

実行例その3(送信1台、受信2台)

BLOADCASTチャンネル(65535)を試しましょう。

下の画像のように、送信側のコンピュータ1台(ID20)、受信側のタートル2台(ID30)(ID31)を用意します。

  • f:id:hevohevo:20140313205403j:plain

    1. 受信側タートル2台(ID30)(ID31)で、それぞれmsg_receiverプログラムを起動しておきます。
    2. 送信側コンピュータ(ID20)で、以下の引数でプログラムを実行します。
> msg_sender Hello 65535

受信側の2台のタートルで、それぞれ#20: Helloが表示されていたら成功です。

BLOADCASTチャンネルを使うと、同時に全てのチャンネルにメッセージを送ることができます。

まとめ

これでメッセージ送信・受信の雰囲気がつかめたのではないでしょうか。 またBLOADCASTチャンネルもうまく使えば非常に強力ですね。活用しましょう(ただし、マルチ環境では要注意)。

さて、送信プログラムmsg_senderは、引数を指定することで、送信先IDとメッセージを自由に変えて送ることができます。

たとえば、次のようなことも可能です。

> msg_sender turtle.turnRight() 30

ここで注意したいのは、"turtle.turnRight()"という文字列を送信していることです。 受信側も、これを文字列と解釈して、#20 turtle.turnRight()という文字列を表示します。

次回は、受信したこの文字列を関数として解釈させることで、受信側タートルを遠隔操作するプログラムを紹介します。

これね、笑えるほど簡単なんですよ。次回をお楽しみに。