scratchのsb3ファイルを展開せずに中身を評価

こんにちは。佐々木です

普段はテックアカデミージュニアの開発をしています。 テックアカデミージュニアは小中高校生を対象としたプログラミング教室で、 その中でもscratchの学習をされている生徒が多いです。

きっかけ

そんな中、ほとんどの生徒さんはしっかり学習しているんですが、 ごく一部の生徒さんはscratch学習の課題を作らないまま完了のチェックを押していることがあります。 残念なことですが、これでは学習が身につかないので指導しなくてはなりません。

悩み

しかし、手抜きのsb3ファイルを見つけるのは案外大変です。 ちょっと動きの遅いscratch画面でsb3ファイルを読み込みプログラムを表示して内容を確認。 森の中で特定の木を探すような作業。

scratchのデータを時間をかけずになんとなくちゃんと作っているか確認したい!

解決策!?

ここで登場!sb3ファイル確認くん!

実はscratchのsb3ファイルはプログラムが書かれたproject.jsonファイルと画像や音声ファイルをまとめてzip圧縮したものなんです。 なのでunzipしてproject.jsonを解析することで、sb3ファイルに含まれるスプライトの数、ブロックの数、ブロックの種類が取得できます。

ひと目で手抜きファイルを発見!模範回答のsb3と比較すればなんとなく当たってそうかもわかります。

模範回答sb3ファイルとの値を比較で完全自動で確認?とも考えましたが、書き方の自由を損なうような指導になってはいけないので 値はあくまで目安で低すぎたらちゃんと書いてない程度の利用がいいのかなと思います。

コード

ruby hogehoge.rb

require 'zip'
require 'json'

exit if ARGV[0].nil?

# sb3ファイルからproject.jsonファイルを読み込む
project = Zip::File.open(ARGV[0]) { |zipfile| JSON.parse(zipfile.read('project.json')) }

# スプライトの数
puts project['targets'].select { |hoge| hoge["isStage"].eql?(false)}.count

# ブロックの数
puts project['targets'].map{|hoge| hoge["blocks"].count}.sum

# ブロックの種類数
puts project['targets'].map{|hoge| hoge["blocks"].map{|fuga,piyo| piyo['opcode']}}.flatten.uniq.count

# ブロックの種類
puts project['targets'].map{|hoge| hoge["blocks"].map{|fuga,piyo| piyo['opcode']}}.flatten.uniq

こんな感じで使います

ruby hogehoge.rb tenuki.sb3

1
3
3
event_whenflagclicked
control_repeat
motion_movesteps

スプライト1つにブロック3つで目的のものはできんだろーーー!!となります

システムに組み込まれたりしないかな

以上

  • hoge, fuga, piyo って何?(商用プログラムで変数名に使っちゃダメだよ)

ja.wikipedia.org