- スターター作品
- なし
- 今回の完成サンプル
- なし
前回はエンコードを実装したぞ!X座標とY座標をまとめて意味のあるカタマリにしたんだよね。
こうすることでクラウド変数1つでXとYの2つのデータを渡される予定!なぜ1つのクラウド変数にまとめたいかというと、2つだとラグが大きくなりすぎるからだったね。
で、今回はこのカタマリを分解するデコード処理というものに取り掛かっていくぞ!
今回の目標「デコード処理を作る」
エンコード(合体)された文字列を、今度はデコード(分解)していこう!
デコードの作戦としてはこうだ。
例えばX座標142とY座標30をエンコードした、3142230という文字列があるとする。(この文字列の意味がわからないという人は前回のレッスンを見てね)
デコードする際はまず1文字目を取得する。3142230の1文字目は「3」だね。これはケタ数だよね。だから2文字目、3文字目、4文字目の3つを取得するんだ。そうすると1と4と2が取れる。
![](https://scratch.coach/wp-content/uploads/2023/06/5e3120cb389159b6af40659d53eb9132-1024x633.png)
こうやってデコード処理を進めていこうと思う!
準備する
やってみよう。
変数「エンコード文字の順番」を作る
順番というのは専門的に言うとIndexと呼んでいるんだけど、分かりやすく「エンコード文字の順番」という名前で変数を作っておこうと思う。インデックスという言葉が分かりやすいなら、エンコードインデックスやエンコードindexや動画に合わせてencoded idxでもOKだよ。
![](https://scratch.coach/wp-content/uploads/2023/06/5784cbd0a49a51ead697746f2a95017b.png)
初期化する
適当なところに置いて1で初期化しておこう。
![](https://scratch.coach/wp-content/uploads/2023/06/4cdb25c1c72d6b05225c4d4a9386d632.png)
ブロック定義を用意する
デコード用の処理をブロック定義にまとめておく必要があるよ。「順番にエンコードする)エンコード文字列 → 値」というちょっと長い名前にしておく。この処理でエンコード文字列を1カタマリ(X座標とかY座標とか)ずつ読み込んで変数「値」にセットしていく予定だよ。
![](https://scratch.coach/wp-content/uploads/2023/06/1428c08e04c9f480b295cdd4f8945dc1.png)
テスト用に配置してみる
![](https://scratch.coach/wp-content/uploads/2023/06/83fa2779f33b3a00f87188a89403b3bc.png)
これで一回クリックしておけば変数「エンコード文字の順番」の中身は1になるね。
変数「値」を初期化する
変数「値」はエンコードでもデコードでも都合がいいので使っていこう。エンコードの文字が入ったままだとマズイので、空白で初期化してから使うよ。
![](https://scratch.coach/wp-content/uploads/2023/06/9b62cc9e382150a3f3cdbd27fc56bcbf.png)
ケタの数だけループを回す
さて、エンコード文字列の分解に取り掛かろう。現在の変数の中身を確認しておくよ。
- 変数「エンコード文字列」の中身は、11123345(前回レッスン)
- 変数「エンコード文字の順番」の中身は、1
- 変数「値」の中身は、空白
ケタ数を調べる
適当なところに次のブロックを置いてみよう。
![](https://scratch.coach/wp-content/uploads/2023/06/a3559b130ec1dae08b0713da2ae8e349.png)
合わせてこうなる↓
![](https://scratch.coach/wp-content/uploads/2023/06/cf5efbd0cd0ffe9c217753ae2684677a.png)
エンコード文字列かエンコード文字の順番に値が入ってないと結果が空白になってしまうから、この段階でチェックしておいてね。もし空白なら両変数のチュートリアル部分を見直してみて。
![](https://scratch.coach/wp-content/uploads/2023/06/3110025d69db108dc6af0aefd9a8a85b-1.png)
繰り返しループを作る
この値の数だけ繰り返すループを作ろう
![](https://scratch.coach/wp-content/uploads/2023/06/cea4bd857f4f32dff7c7810f15bea3c3.png)
こうなる↓
![](https://scratch.coach/wp-content/uploads/2023/06/182caf227bfddd2f795ee28b0ef5b3b1.png)
11123345の1桁目は「1」だから1回繰り返すだけの処理だね、とりあえず。
デコード(分解)を実装する
このループの中で分解作業をしていくぞ!
変数「エンコード文字の順番」に1つ加算する
分解処理ではケタ数の次から調べたいので、文字の順番を1つ進めよう。
![](https://scratch.coach/wp-content/uploads/2023/06/2aa499ef0fb64a18fa05c1f299c75ca1.png)
これで変数「エンコード文字の順番」の中身は2になったね。
次の数字を取得する
![](https://scratch.coach/wp-content/uploads/2023/06/59d2bc72960ee8aaeaec901287b57a13.png)
次の数字も「1」だね。これを取得して変数「値」に入れよう。
変数「値」にセットするブロックを置いておく
![](https://scratch.coach/wp-content/uploads/2023/06/2e9eaba01c227906d4413a390e83d8f6.png)
とりあえず0のままでOK。
追加するようにする
変数「値」にはどんどん文字を追加したいから、次の演算ブロックをハメておこう。
![](https://scratch.coach/wp-content/uploads/2023/06/b96ad8f65ac07fe008ebe99881f59529.png)
1つ目の引数は変数「値」
これで値の後ろにどんどん追加されるようになる。
![](https://scratch.coach/wp-content/uploads/2023/06/3abd15f5d44363090c0d8431559049d7.png)
2つ目の引数はエンコード文字
すでに作った演算ブロックの組み合わせを流用できそうだから複製して使っちゃおう!
![](https://scratch.coach/wp-content/uploads/2023/06/3ed82de640b9d22f7691078128151a3f.png)
で、こうする↓
![](https://scratch.coach/wp-content/uploads/2023/06/da5bd1859433c415c6c3a545f0db751d.png)
順番を進めておこう
処理の最後に変数「エンコード文字の順番」を1つ進めておこう。
![](https://scratch.coach/wp-content/uploads/2023/06/7a48b291ac7b1b263dd951cbe0004511.png)
これでこのブロック定義を実行するたびに次のカタマリが変数「値」に入ることになるよ。
![](https://scratch.coach/wp-content/uploads/2023/06/bdde67efb4437f55fd0a88cb954a24e9.png)
テストしてみよう!
![](https://scratch.coach/wp-content/uploads/2023/06/e4e95aa20b85f6d27411159627bd5012.png)
よし。じゃあ今度は変数「エンコード文字の順番」の初期化部分をどけてクリックしてみる。
![](https://scratch.coach/wp-content/uploads/2023/06/5f7015f3e4b9b31672a76e5beb75cd9f.png)
よっしゃ!11123345の2つ目のカタマリは「2」で正解だね!
じゃあもう一回クリックしてみよう。
![](https://scratch.coach/wp-content/uploads/2023/06/ebf98b8e152c10e955494730e9e3cb9d.png)
キタ━━━━(゚∀゚)━━━━!!
デコードがデキータ!
次回へ
エンコードした文字を再び1つ1つのデータに分解するデコード処理が完成したぞ。でもまだ不完全なんだ。
スクラッチの座標にはマイナス値があるよね。マイナスって「-」っていう記号を使って表現するから、クラウド変数の「数字しか入らない」というルールに抵触してしまうんだよね。どうしようか。もちろん解決策はあるから安心してね!
次回はマイナス値にタックルしていこう!明後日あたり!