テラリウム徹底攻略ガイドコミュニケーションの利用大石 晃裕+デジタルアドバンテージ |
さて、ここまでで、1ターンでの1byteコミュニケーションが可能になった。そこでこの機能を利用して、少し面白いサンプル生物を作成してみた(このサンプル生物は本連載でこれまでに作成してきたKAnimalクラスを利用している)。
→サンプル動物(animalv.cs)のダウンロード
→KAnimalクラス(kanimal.cs)のダウンロード
次の画面はこのサンプル生物を実行した画面である。
サンプル生物の実行画面 |
この生物はコミュニケーションを取り合うことにより、V字型に整列する。 |
先ほどまでと同じように、まったく実用性がないのは勘弁して欲しい。ただ生物たちがVの形に整列していくだけのサンプルだ。ちなみに、あくまで簡単なサンプルなので、条件によっては、このようにうまく動かない場合も多い。
このサンプル・プログラムでは、まず始めに、すべての生物はある座標に向かうようになっている。そして、最初にその地点に到着した生物が、自分を「サーバ」と認識するようにしている。この判定は次に説明する「クライアント」にならずに、あらかじめ指定されたある座標に到着できたときに行うようになっている。サーバとなった生物は、ほかの生物に整列のための指令を出す役割を担う。
そして、あとからやってきた生物たちはListenクラスでNormalModeのデータを受信して、なおかつそれが自分のIDの最上位1byteである場合に、「もうすでにその座標に到着してサーバになっている生物がいる」と判断し、同時に、自分を「クライアント」と認識する。クライアントとなった生物は、サーバから指令を受け取り、それに従って行動する。
ちなみにここでIDの一部を発信している理由は、このコミュニケーションは「1対1」のコミュニケーションとしたいからだ。これは「1対1」でなければ、同じ指令を複数の生物が受け取ってしまう可能性があるためで、IDを使って指定することによって、それがだれに向けて発信されたメッセージかを判定できるようにしている。もちろん、この認識するためのデータを発信するのはサーバとなった生物である。
そしてサーバは、そのデータを発信した直後に、移動して欲しい座標をクライアントに対して指定する(ただし直接ではなく、それを導くことができるUInt16型の値を指定する)。それを受けて、クライアントは、サーバの指定した座標に移動する。
この通信手順をまとめると次のようになる。
自分がサーバであると認識する方法 | クライアントであると認識しないで、ある座標に到達できた場合(自分がサーバであることが確定したら、別の生物を見つけたときに、その生物に対して、それがクライアントであることを示すデータを発信する必要があるため) |
自分がクライアントであると認識する方法 | サーバからクライアントであることを示すデータを受信した場合 |
サーバになった場合に行うこと | 始めに指定されている座標の付近にとどまり、ほかの生物が近寄ってきたら、その生物に、その生物が「クライアント」であることを示すデータ(NormalModeで相手のIDの最上位1byteのデータ)を発信する。そしてその直後に、相手に移動すべき座標を示すUInt16型の値を発信する。 |
クライアントになった場合に行うこと | クライアントになった直後に送られてきた値を元に、自分の移動すべき座標を確定し、移動してその場にとどまる。 |
このサンプルで重要なのは、「複数の生物がグループで行動している」ことだ。今回は同一生物でのコミュニケーションだが、今回実装したコミュニケーション機能を使えば、まったく違った生物間でも協力することが可能である。例えばこれを応用すれば、草食動物を肉食動物によって守らせたり、自分の作成した草食動物間で植物の位置を共有したりすることなどが可能になるだろう。
INDEX | ||
[連載]テラリウム徹底攻略ガイド | ||
第7回 ダンスによる動物間コミュニケーション | ||
コミュニケーションの基本 | ||
ActualDirectionを使ったコミュニケーション | ||
Destinationを使ったコミュニケーション | ||
コミュニケーションの利用 | ||
「連載 テラリウム徹底攻略ガイド」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|