提供:Japanese Scratch-Wiki
Scratchではクラウド変数を利用し、日々様々な通信対戦ゲームなどが作られている。しかし、通信の技術は閉じられた技術であり、一部の高いスキルを持ったScratcherにしか作ることが出来ない現状がある。この記事では、そのような通信技術を汎用的に応用できるスクリプトを作成しながら説明する。
通信に必要なもの
実際にインターネットなどで利用されている通信の中から、今回は「UDP」と呼ばれるプロトコルを参考にしてスクリプトを作成していく。
通信の基礎
通信は行うために「住所」を必要とする。通信されるデータを「荷物」とすると、AさんがBさんに荷物を郵便で送る場合と同じことが言える。住所がなければ同姓同名の別人「B'さん」に荷物が届いてしまうかもしれない。これを防いでいるのが「住所」である。インターネット上では「IPアドレス」と言われる物である。IPアドレスがあるおかげで私たちは明示的な個人に情報を送ることが出来る。
Scratchでも同じことがいえる。クラウド変数にデータを代入した際、そのデータはすべての人が見ることが出来るが、それでは特定の人にだけ送りたい情報がすべての人に共有されてしまうことになる。これを防ぐためにクラウド変数を利用した通信にも「住所」のデータを送りたいデータと一緒に代入して、送り先の人だけがその情報をプログラム内で使うことが出来るようにプログラムを組めば、一般的にインターネットで使われている通信と同じ仕組みが作れるはずである。要するに、送り先の人(今回はBさん)にデータを送る場合、他にクラウド変数を見られる人(B'さんやCさん)は自分宛てに送られたデータではない場合、「見て見ぬふり」をすることで疑似的にプライベートな通信ができるような工夫をすれば良いと言うことになる。
ブラックボックスにして考える
まずは実行されている通信を外から見ている体で、プログラムがどのような振る舞いをするのかを考えていく。
送信する側
送信する側に必要な物は
- 相手の住所
- 送りたいデータ
の2つである。これを以下のようにまとめてクラウド変数に代入する。
[相手の住所][送りたいデータ]
送る側がする処理はこれだけで良い。このデータを「受け取る側」が解釈して通信を行う。
受信する側
受信する側に必要な物は
- 自分の住所
だけである。自分の住所がクラウド変数に含まれていればデータを取り込んで処理を行う。
実装
上記で述べたプログラムの振る舞い方を元にスクリプトを作成した。しかし、このスクリプトは最小限のものであるため、各々使いやすいように改良して利用してほしい。自分で理解しながらスクリプトを組み立てると、さらに通信に対する理解が深まるだろう。
大まかな仕様
- 「住所」は6桁の整数とした。
- 「データ」は最大250桁とした。250桁以上の入力を行うと定義「send」は強制終了する。
- 定義「catch」はループさせて使用することを前提としている。
- タイムアウトは設定されていないため、通信する相手が存在しない場合はクラウド変数をリセットする必要がある。
定義「send」
この定義は1つめの引数に送り先の住所を、2つ目の引数に送りたいデータを入力して使用する。
定義 send (送り先の住所)(データ) [send_一時記憶 v]を(送り先の住所)にする::variables もし<((send_一時記憶)の長さ)<(6)>なら{ <((send_一時記憶)の長さ)=(6)>まで繰り返す{ [send_一時記憶 v]を((0)と(send_一時記憶))にする::variables }::control }::control もし<((データ::custom-arg)の長さ)<(251)>なら{ [send_一時記憶 v]を((send_一時記憶)と(データ::custom-arg))にする::variables [☁c v]を(send_一時記憶)にする::variables }でなければ{ [send_一時記憶 v]を()にする::valiables }::control
定義「catch」
この定義はループして使用することを前提としている。
引数には自分の住所を入力する。
定義 catch (自分の住所) [catch_一時記憶 v]を()にする::variables (6)回繰り返す{ [catch_一時記憶 v]を((catch_一時記憶)と((☁c)の(((catch_一時記憶)の長さ)+(1))番目の文字::operators))にする::vcariables }::control もし<(catch_一時記憶)=(自分の住所)>なら{ [catch_一時記憶 v]を()にする::variables (((☁c)の長さ)-(6))回繰り返す{ [catch_一時記憶 v]を((catch_一時記憶)と((☁c)の(((catch_一時記憶)の長さ)+(7))番目の文字::operators))にする::variables }::control [catch_出力 v]を(catch_一時記憶)にする::variables [☁c v]を(0)にする::variables }::control
応用のヒント
上記の定義ブロックを応用して作ることが出来る物の例を幾つか挙げる。応用に迷った場合は参考にすると良いだろう。
- もし誰かが通信を行っていたら、その通信が終わるまで順番待ちをする
- タイムアウトを設ける
- 送られてきたデータに「受け取り済み」のデータ送信(正しく送信されたかの確認)を行う
- 250桁以上のデータを数回に分けて送信する
- 「住所」を自動で振り分けるプログラムを作成する
注意事項
2019年7月から、クラウド変数を利用したチャットを作ることは禁止されている。この技術を利用してチャットを作ることは絶対にしてはならない。ただし、定型文式チャットだけは例外的に許可されている。[1]