見出し画像

Scratchで一番効率の良いセーブコードを作る

どうも皆さんこんにちは。おもかいです。投稿が遅くなってすみません。
サンドボックス系のゲームなら絶対に要る、セーブコード。Scratchでほとんどの場合はリストに1行のセーブコードを表示して、それをコピー/メモ帳などにペーストさせ、続きからやるときはそのセーブコードをペーストすることで続きからプレイできます。
セーブコードはほとんどの場合1行で出力されますが、たくさんのデータを1行に落とし込むにはいろいろな方法がとられています。そこで今回は、一番効率の良いセーブコードを考えていきたいと思います。


効率の良いセーブコートとは

まずはここです。「効率の良い」といっても、色々な効率の良さがあります。僕は「効率の良い」を3つの要素に分けてみました。

短縮性

これはもともとのセーブコードの長さですね。もし[12,3,4]というデータを数字でセーブコードとして出力する時、
「2121314」と「[n番目の数字の長さ][n番目の数字]」とする方法や、
「1212113114」と「[n番目の数字の長さの長さ][n番目の数字の長さ][n番目の数字]」として数字の長さが10以上になっても良いようにする方法や、
「1393949」と「[9進数にしたn番目の数字][9]」と、使われない文字で区切る方法など、セーブコードを作るには様々な方法があります。この中でセーブコードとして短いのは1番目か3番目ですが、どんなに数が大きくなってもバグらない、冗長性のある3番目がいいと思います。

不可読性

これは僕が作った言葉ですが「いかに読みずらいか」ということです。読みづらくしてセーブコードでのズルを防ぐことが目的です。ただ、絶対にズルできないセーブコードを作ることはできません。なぜならセーブコードをつくるプログラムによって、どのようにセーブコードを作ればいいのかわかってしまうからです。なのでできるだけ複雑にすることが重要です。

圧縮性

これは作ったセーブコードを圧縮して短くするプログラムです。おすすめはこのプロジェクトで、10進数のセーブコードを最高で63484進数にかなりの速さで変換してくれます。圧縮性と不可読性どちらも高めてくれます。

実際に作る!

やりたいことは決まったので実際にセーブコードを作成&読み込みのプログラムを作っていきます。

セーブコードを作成するプログラムを作成する

まずセーブコードの変数を空白にして初期化します。

初期化

次にこのプロジェクトから進数変換するスプライトをバックパックで持ってきます。


バックパックを使って持ってきました

ほとんどの素材は定義ブロックに特定の値を入れるだけで変数などに値を入れて返してくれるので、中身のブロックは特に理解しないでもいいです。

はじめのうちに理解が必要かどうか

ということで進数変換のスプライトに定義を移動させます。

定義を移動
定義が移動されました

定義が移動されたら、とりあえず「スプライト1」は消してokです。

削除

では、実際にこのリストのデータの各要素を進数変換の定義を使って9進数に変換するプログラムを作ります。

リストのデータ

こんな感じになりました。

プログラム

定義を実行した結果を見るとしっかりと各要素が9進数になり、「9」という文字が使われなくなりました。次は「9」で各要素を区切ってセーブコードを作成し、それをリストに入れてコピーできるようにします。

こんな感じ。


定義の実行結果

はい。ちゃんと9進数のリストの要素が「9」で区切られています。次はもう一回進数変換してコードを圧縮します。

10進数のセーブコードを100進数にしています。
実行結果
ちなみにPriorityの定義の順番をいじることでセーブコード
をカタカナにすることもできます。試してみてください。

セーブコードを解読するプログラムを作成する

次はセーブコードを解読するプログラムを作成します。セーブコードを作るときは「10進数のデータの各要素を9進数にする→9でつなぐ→10進数を100にする」の方法だったので今度は逆の「100進数を10進数にする→9を区切り目としてリストに書き出す→各要素を9進数から10進数へ直す」というような方法でセーブコードを解読します。

つくった!

いきなり作ってしまいました。人のコード読み解くの得意な人は見たらわかると思いますが一応解説置いときます。

解説

実行結果です。

セーブコードをペースト
実行結果

はい。ちゃんとデータが復元されましたね!

まとめ

Scratchで効率の良いセーブコードを作る方法について解説しました。自分独自のセーブコードを作ってみるのも意外と楽しかったりするかもしれません。この記事作ったおもかい頑張ったなって言ってくれる人は「スキ」お願いします。それとTwitterとかにシェアしてくれるとシンプルにうれしいです。ではまた!