スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回はデコードを実装したぞ!エンコードされて
意味のあるカタマリになった
文字列を
分解して、
元のデータに
直す
処理ができたわけだ。これをX
座標とY
座標に
反映すれば
同期処理が
完成するんだけど、ちょっと
待って。スクラッチの
座標はマイナスも
普通に
入ってくるよね。マイナスって「-10」とかなんだけど、ここでクラウド
変数のルールの1つを
思い
出してほしい。そう、
クラウド変数には数字しか入らなくて、文字や記号は入らないんだったね。つまり「-10」の「-」マイナス
部分はクラウド
変数には
入らないんだよ!そこで、
今回の
作戦を
発表する!
マイナスはゼロに置換して無理やりエンコード・デコードする大作戦だ!つまり、「-10」じゃ「010」にして
送信する、そして「010」を「-10」として
受信するってことだ。
ok-scratch
\u003cp\u003e1文字目が0から始まっていたらマイナスを意味するというルールってことだね。こういうプロジェクト内のルールを「仕様《しよう》」って呼ぶよ。\u003c/p\u003e
エンコードを改修する
まずはエンコードから
直そう。ゼロより
小さいときはマイナスをゼロに
置換する
処理を
追加するよ。
マイナスかどうかを調べる
ブロック
定義「エンコードする」に
処理を
追加していくぞい。
条件分岐ブロックを追加する
調べるといえば「もし~なら」という
条件分岐ブロックだね!
条件式を追加する
0より
小さければマイナスだね。
引数も「
値」って
名前だから
分かりづらいけど、
条件式に
使っているのはオレンジ
色の
変数「
値」だよ。
マイナスを0で置換する
どうやって
実現しようか?
考え
方としてはマイナスを
除去してから0をくっつけるという
手順だよ。
絶対値を求める
マイナスを
除去するには
絶対値の
演算ブロックを
使うと
便利だよ。
絶対値だから、「-10」なら「10」ってなるよ。
0とくっつける
「りんごとバナナ」ブロックで0を
前にくっつけよう!
で、こうなる↓
これで「-10」が「10」になって、
先頭に「0」をくっつけて「010」になるね!イェイ。
変数「値」にセットする
これでエンコード
側はいいね。
テスト
エンコードに
渡す
値を-10にしてからクリックでテストしよう。
よっしゃ!いい
感じだね。エンコード
文字列を
見ると3010になってるね。3の
後ろに
続く3つの
数字は
意味のあるカタマリって
分かるね。ナイスぅ!
デコードを改修する
次はデコード
側も
直していこう。このままだと010は010として
受け
取ってしまうので、-10に
直して
受け
取るようにしていくぞ。
マイナスかどうかを調べる
ブロック
定義「
順番にデコードする」を
直していこう。
条件分岐ブロックを追加する
処理の
最後に
追加するよ。
条件式を追加する
1
文字目が0から
始まってたらマイナスっていう
仕様だったね。
で、こうなる↓
マイナスに変換する
先頭の0は
特に
意識しなくても
大丈夫!
強引に
引き
算しちゃおう!
ok-scratch
u003cpu003eスクラッチなら先頭の0は無視しても大丈夫だけど、Javascriptとかだとしっかり処理をしないと計算できないこともあるよ。そのあたりは各言語を学ぶときに方法論を学べば大丈夫。u003c/pu003e
テストする
おお!ちゃんとマイナスに
戻ってるぅ!
最高!
クラウド変数にエンコード文字列をセットする
この
勢いでクラウド
変数に
値をセットする
処理も
作って、
動きの
同期まで
試してみよう!
準備する
まずテスト
用に
使ってたクラウド
変数まわりのブロックを
消そう。
エンコード文字列を初期化する
座標をエンコードする
X
座標とY
座標をエンコードしよう。
X座標をエンコードする
Y座標をエンコードする
クラウド変数をセットする
エンコード
文字列をクラウド
変数にセットするぞ!
クラウド変数をデコードして同期する
よしよしよし、この
調子で
行くぞ!つぎは
数字キー「2」を
押したときの
処理を
直していくぞ。
準備する
分かりにくいからいったんテスト
用のブロックは
消す。
外してどこかに
置いといてもOK。
変数「エンコード文字列」を更新する
送られてくるクラウド
変数1の
値を、
変数「エンコード
文字列」にセットする。
ok-scratch
u003cpu003e「え?さっきクラウド変数1をエンコード文字列にしたのに、ここではエンコード文字列をクラウド変数1にするの?」と思うかもしれない。でも今回は数字キー2を押した側の作品だってことを思い出して。こっちではクラウド変数1をエンコード文字列にする処理は止まってるから問題ないんだ。u003c/pu003e
変数「エンコード文字の順番」を初期化する
デコードの
準備として
変数「エンコード
文字の
順番」を1で
初期化しておこう。
デコードする(1回目)
デコードするぞ!
これで
変数「
値」に1つ
目のカタマリ、つまりX
座標のデータが
入った!
X座標をセットする
この
値をそのままX
座標に
割り
当てよう。
デコードする(2回目)
もういっちょ!
次はY
座標を
意味するカタマリをデコードするぞ。そして
変数「
値」をY
座標にセットするところまでやってみよう。
同期をテストする
さあどうなるかな……。そうだ、BeforeとAfterが
分かるようにクラウド
変数を2つ
使ってるときのテスト
結果も
乗せておくね。
クラウド変数2つ使ったテスト結果
エンコード・デコードを実装したテスト結果
スクラーーーーーッチ、レボリューーーーーーーションっ!スーパー
改善したね!
次回へ
え?
次があるの?もうけっこうスムーズな
同期が
実現できたんですけど?いやいやいや、
僕たちが
目指す
高みはこんなもんじゃあありません。もっと
上に
行く。スクラッチオンラインゲームの
最高峰まで
行くぞ!トップクラスのスクラッチオンラインゲームの
作り
方を
届けるから、まだまだこれからだ。ブクマして
待っててくれ!