#はじめに
初投稿です。
伝わりにくいところもあるかもしれませんがその場合はコメントでも書いていただけると嬉しいです。
また、今回作ったものはここで公開しています。
#クラウドリストis何
Scratchには「クラウド変数」という画期的な変数が存在します(1作品最大10つまで作成可能)。
これは、変数の値がサーバーに保存され全てのユーザーで共有されるというものです(New Scratcherだと使えない)。
しかし、このクラウド変数は数値しか保存できず(ユーザーが勝手にチャットなどを作られると規制が難しいため)このままだと使い勝手が悪いです。
そのためにリスト(配列)を数字に変換しクラウド変数に保存すればクラウドでリストが使えるじゃないかということから生み出された技術?です。
今回はその初歩的な部分としてクラウド変数1つを用いたクラウドリストを制作します。
#クラウド変数の仕様
クラウドリストを作るためには、クラウド変数の仕様を知ることが重要ですので、表にまとめました。
~2018/2 | 2018/2~2019/1 | 2019/1~ | |
---|---|---|---|
長さ(桁数) | 10240 | 128 | 256 |
数の種類 | 16進数(0~F) | 10進数(0~9) | 10進数(0~9) |
反映制限 | なし※ | なし※? | 100ms |
※あまりにも短期間に多く値を変えると反映されない |
このように以前(~2018/2)に比べ制限が相当厳しくなっていることがわかります。
実際は、1作品で最大10つのクラウド変数を扱えるため桁数は単純に10倍になりますが、反映制限があるためあまり使いたくはないです(保存するときにデータが壊れる可能性があるため)。
#仕組みの説明
このクラウドリストではリスト→文字列(数字)、文字列(数字)→リストという2つの機能を実装しなければなりません。
ここで「符号化」という考えを用います。
簡単に言うと表のように、aを01, bを02, cを03, ...といったものが考えられます。
符号化前 | 符号化後 |
---|---|
a | 01 |
b | 02 |
c | 03 |
d | 04 |
... | ... |
1桁の数の先頭に0をつける理由は "a" を1
としてしまうと、"aa"は11
となりアルファベットで11番目の "k" とどちらか判別できなくなるためです。"a"を01
とすることで"aa"は0101
となり符号化前に戻すことが出来ます。
これで文字列を数字の羅列に変換できますが、今回作るものは「リスト」であるためどこが要素の終わりかというものも符号化しなければなりません。
(例) → 010203040506
例のようにしてしまうとリストに戻すときにabcdefのどこからが次の要素であるか判別できなくなるため要素の終わりには00
を入れるようにします。
#実装
このクラウドリストには多くの実装方法があります。多くの人が作っているので「中を見る」のも良いと思います(残念ながら制限の変更や3.0のアップデートで壊れてしまったものも多い...)。
ここでは一例として説明します。
まず、リスト→文字列(数字)です。
解説すると、
1番外側のループが1要素ずつ進めて要素が変わったときに00
を挟む
2番目のループがその要素内で1文字ずつ進めて文字を符号化したものをtempに保存
3番目のループが文字を符号化
最後にtempからクラウド変数に代入
という実装になっています。
次に、文字列(数字)→リストです。
こちらも解説すると、
1, 最初にリストに空要素を追加して、00
が来るまで最後の要素で文字を復号化する
2, 00
が来たらリストに空要素を追加する
という実装になっています。
#最後に
今回のクラウドリストは最も簡単?なものです。
実際に使ってみるとわかると思いますが、このクラウドリストには多くの問題があります。
例えば、
・1つのクラウド変数の限界である256桁に到達した後はデータが溢れてしまう
・大文字小文字に対応できない
・ループの回数が多すぎる
が挙げられますが、これらは全て解決可能です。
いろいろな人のクラウドリストを見て学んでいきましょう!
P.S. カスタムレポーターブロックまだですか?