本ツールで使用しているオープンソースライブラリ

本ツールのコードには 1 個のオープンソースライブラリが含まれています。

Scratch チートシート — クイックリファレンス

Scratch 3 のブロックプログラミング早見表:変数・リスト・クローン・メッセージと 9 つのブロック分類を網羅し、初心者のゲーム・アニメ・ストーリーづくりをカバーします。

S3

Scratch Scratch 3.0 (online editor)

Scratch 3(ブロック型) · イベント駆動・ビジュアル・協調的シングルスレッド · 動的(弱型付け変数)

おすすめの学習パス

まず最初のプログラム:緑の旗 + 言うブロック → 変数・リストと制御フロー(もし/繰り返し)を習得 → 調べる系でキーボード・マウスを読み、メッセージでスプライトを会話させる → カスタムブロックでコードを整理し、クローンで複数スプライトを扱う → 最後に FAQ で落とし穴を避け、タイマー計測とクラウド変数による記録を覚えましょう。

1.Hello World と最初の一歩

緑の旗から始まる最初のプログラム:スプライトにしゃべらせ、コスチュームや背景を切り替え、9 つのブロック分類を紹介します。

最小プログラム

緑の旗をクリックしてスプライトにしゃべらせる──すべての Scratch プロジェクトの入口です。最小プログラムはイベントと見た目ブロックだけを使います。

1
2
when green flag clicked
say (Hello, world!) for (2) seconds

緑の旗で開始

緑の旗ブロックはプロジェクト全体の起動スイッチ。ステージ上の旗をクリックすると、そこから始まるスクリプトが一斉に走り、停止ボタンで全部止まります。

1
2
3
4
5
when green flag clicked
forever
move (10) steps
if on edge, bounce
end

スプライトにしゃべらせる

「言う」と「考える」ブロックはスプライトの吹き出しに文字を出す、最も直接的な出力手段。秒数を指定すればその時間後に消え、未指定なら表示し続けます。

1
2
3
4
when green flag clicked
say (你好,我是小猫!) for (2) seconds
think (接下来要做什么呢…) for (2) seconds
say (点击我开始!)

コスチューム切替

各スプライトは複数のコスチュームを持ち、切り替えることで歩行やまばたきなどのアニメを作れます。「次のコスチューム」は順番に送ります。

1
2
3
4
5
when green flag clicked
forever
next costume
wait (0.2) seconds
end

背景切替

ステージの背景はシーンにあたり、物語に合わせて切り替えられます。「背景が切り替わったとき」ブロックと組み合わせれば背景ごとに違うスクリプトを走らせられます。

1
2
3
4
when green flag clicked
switch backdrop to (森林)
wait (3) seconds
switch backdrop to (城堡)

9 つのブロック分類

ブロックは機能ごとに 9 つの色分けカテゴリに分類されます:動き(青)・見た目(紫)・音(ピンク)・イベント(黄)・制御(オレンジ)・調べる(水色)・演算(緑)・変数(オレンジ)・ブロック定義(紫)。

1
2
3
4
5
// イベント(黄) 制御(橙) 動き(青) 見た目(紫) 音(ピンク)
// 調べる(シアン) 演算(緑) 変数(橙) 自作ブロック(紫)
// 左のパネルからブロックを真ん中のスクリプト領域にドラッグして組み立てる
when green flag clicked
say (欢迎来到 Scratch!)

スクリプトは上から下へ

同一スクリプト内ではブロックが上から下へ順に実行され、前のブロックが完了してから次へ進むため、順序がそのまま動作の前後を決めます。

1
2
3
4
5
when green flag clicked
move (100) steps
turn right (90) degrees
move (100) steps
// まず直進、次に右折、さらに直進

保存と共有

サインイン後はプロジェクトが自動でクラウドに保存されます。「ファイル」メニューからパソコンにダウンロードでき、右上の「共有」で公開してオンライン遊ばせます。

1
2
3
4
// ファイルメニューから「コンピューターに保存」または「コンピューターからアップロード」
// ログインするとプロジェクトは自動でクラウドに保存される
// 右上の「共有」を押すと Scratch サイトに公開できる
// 他人が作品を実行するのはオンライン実行で、ダウンロード不要

2.変数と定数

変数の作成、値の設定・変更、表示・非表示、クラウド変数とローカル変数。

変数を作る

「変数」カテゴリの「変数を作る」をクリックし、名前(例:スコア)を入力します。変数はボックスのように数値・文字列・真偽値を保持できます。

1
2
3
4
// 変数カテゴリ > 変数を作る > 名前を入力:分数
set [分数 v] to (0)
set [姓名 v] to (小猫)
set [胜利 v] to (false)

代入と増減

「〜にする」は変数に値を代入し、「〜ずつ変える」は現在の値から増減します。スコアやライフの更新は「〜ずつ変える」が定番です。

1
2
3
4
set [分数 v] to (0)
change [分数 v] by (10) // 分数は 10 になる
change [分数 v] by (-5) // 分数は 5 になる
set [分数 v] to (100) // 直接 100 に設定

表示と非表示

変数はデフォルトでステージ左上に表示され、ドラッグで位置を変えられます。不要な変数は「変数を隠す」ブロックで隠して画面を整理できます。

1
2
3
4
set [分数 v] to (0)
show variable [分数 v]
wait (2) seconds
hide variable [分数 v]

リスト変数

リストはたくさんの値を入れられる変数で、箱が並んでいるイメージです。位置を指定して追加・削除・読み出しができます。

1
2
3
4
5
6
add (苹果) to [水果 v]
add (香蕉) to [水果 v]
add (西瓜) to [水果 v]
// 水果 = [苹果, 香蕉, 西瓜]
item (2) of [水果 v] // 香蕉
length of [水果 v] // 3

定数と固定値

ブロックに直接書いた数字や文字が定数で、実行中に変化しません。値が変わり得るデータだけを変数にします。

1
2
3
4
move (10) steps // 10 は定数
wait (1) seconds // 1 は定数
say (固定提示文字) // 文字定数
set [速度 v] to (10) // 定数を変数に格納

クラウド変数

クラウド変数はサーバーへ値を保存し、プロジェクトを開くすべてのユーザーが同じ値を共有します。ランキングに最適ですが、数値のみ対応です。

1
2
3
4
5
// 変数を作る時に「クラウド変数」をチェック(ログイン必須、数値のみ)
set [最高分 v] to (分数)
if <(分数) > (最高分)> then
set [最高分 v] to (分数)
end

ローカル変数

既定では変数はプロジェクト全体で共有されます。「このスプライトのみ」をチェックするとそのスプライト専用になり、クローンもそれぞれ独立したコピーを持つようになります。

1
2
3
// 変数を作る時に「このスプライトのみ」を選択
when green flag clicked
set [私有值 v] to (0)

スライダー変数

ステージ上の変数モニターを右クリックするとスライダーに切り替えられ、マウスでドラッグして値をリアルタイムに変更できます。音量や速度など調整可能なパラメータに最適です。

1
2
3
4
// 変数モニターを右クリック > スライダー
// 範囲(最小値/最大値)を設定してドラッグ
set [音量 v] to (slider value)
set volume to (音量) %

3.データ形式

Scratch のデータは数値・文字列・ブールの 3 種類で、変数は型を自動推論します。

数値

数値はブロックの白い丸穴に直接入力でき、正負や小数も扱える。四則演算のブロックは数値を返す。

1
2
3
4
5
set [分数 v] to (100)
set [步长 v] to (0.5)
(10) + (5) // 15
(7) * (8) // 56
((分数) / (2)) // 50

文字列

文字列は白い丸/楕円のスロットに入れます。「言う」「考える」やリストの中身も文字列にできます。

1
2
3
set [名字 v] to (小猫)
say (你好,我的名字是小猫)
join (苹果) (香蕉) // 苹果香蕉

真偽値

比較・論理ブロックは真(true)/偽(false)を返し、条件用の六角スロットにのみ入ります。

1
2
3
4
<(分数) > (99)> // true または false
<(分数) = (100)>
<<(a) > (0)> and <(b) > (0)>> // 両方真なら真
<not <(分数) < (0)>>

リストの要素

リストの要素は数値でも文字列でもよく、インデックスで n 番目を読み出します。要素型は固定されていないので混在も自在です。

1
2
3
4
add (100) to [数据 v]
add (小猫) to [数据 v]
item (1) of [数据 v] // 100
item (2) of [数据 v] // 小猫

型の自動推論

Scratch では型宣言は不要で、変数には何でも代入でき、いつでも別の型を入れ直せる。演算時には数値と文字列が自動的に変換される。

1
2
3
set [x v] to (10) // 数値
set [x v] to (文字) // 文字列に変更
set [x v] to (<(1) > (0)>) // 真偽値

入力の形式

「聞いて待つ」ブロックでユーザに入力を求め、「答え」ブロックは常に文字列を返します。数値として使う場合は演算ブロックで変換します。

1
2
3
4
5
ask (你的年龄是几岁?) and wait
set [年龄 v] to (answer)
if <(年龄) > (6)> then
say (可以玩更复杂的游戏)
end

出力の形式

「言う」「考える」ブロックはデータを見える文字列にする。演算結果やリストの要素をそのまま出力ブロックに流せる。

1
2
3
say (join (得分:) (分数))
say (join (item (1) of [排名 v]) ( 获得了第一名))
set volume to (音量) %

数値と文字列の変換

round は四捨五入、mod は剰余。文字列連結に混ぜると数値は自動で文字列化されます。

1
2
3
4
5
round (3.7) // 4
round (3.2) // 3
((10) mod (3)) // 1
// 数字を文字列に直接連結すると自動変換される
say (join (分数:) (分数))

4.変数とデータ保存

変数とリストでデータを保持し、クローン・メッセージ・クラウド変数でスプライト間でデータを渡します。

変数による保存

変数はデータの「居場所」:値を設定してから使います。スクリプト間で同じ変数の読み書きでデータを共有しますが、読むタイミングに注意が必要です。

1
2
3
4
when green flag clicked
set [金币 v] to (0)
when this sprite clicked
change [金币 v] by (1)

リストで複数件保存

リストは配列のように複数件を保持します。インデックスで読み書きし、1 ラウンドの全スコアや敵の座標などに向きます。

1
2
3
4
5
delete (all) of [得分 v]
repeat (5)
add (pick random (0) to (100)) to [得分 v]
end
item (1) of [得分 v]

クローンがデータを持つ

クローンはスプライトのスクリプトと変数をすべてコピーします。「このスプライトのみ」変数はクローンごとに独立し、ID で互いに区別できます。

1
2
3
4
5
when green flag clicked
create clone of (我自己)
create clone of (我自己)
when I start as a clone
go to x: (pick random (-200) to (200)) y: (pick random (-150) to (150))

プライベート変数

「このスプライトのみ」をチェックした変数はクローンごとに一つずつあり、一つを変更しても他に影響しません。クローンを区別する鍵です。

1
2
3
4
5
6
7
8
when green flag clicked
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
when I start as a clone
say (join (我是克隆体) (编号))

クラウド変数

クラウド変数は数値をサーバーと同期し、全プレイヤーが同じデータを共有します。ランキングやオンライン対戦に適しますが、数値のみです。

1
2
3
// 変数を作る時に「クラウド変数」をチェック
when green flag clicked
set [在线人数 v] to (0)

メッセージでデータを渡す

メッセージは「メッセージ名」しか運べません。データを渡したい場合はグローバル変数に書き込んでからメッセージを送り、受信側が変数を読みます。

1
2
3
4
5
when green flag clicked
set [得分 v] to (100)
broadcast (游戏结束)
when I receive (游戏结束)
say (join (最终得分:) (得分))

グローバル変数とローカル変数

既定の変数はすべてのスプライトから読み書き可能なグローバル変数です。「このスプライトのみ」を選ぶとそのスプライト(またはそのクローン)だけに属します。

1
2
3
4
// グローバル変数:すべてのスプライトで共有
set [总分 v] to (100)
// ローカル変数:このスプライトのみに見える
set [自身速度 v] to (5)

データの永続化

変数はプロジェクト実行中のみ存在し、ページ再読み込みや終了で消えます。長期保存にはクラウド変数やデータの書き出しを使います。

1
2
3
4
5
6
// クラウド変数:ログイン後サーバーに保存され、長期間保持
// データのエクスポート:リスト内容を整理してメモ帳にコピー
ask (要载入之前的记录吗?) and wait
if <(answer) = (是)> then
say (读取云变量最高分)
end

5.制御フロー

条件分岐とループでスクリプトの流れを制御する:もし、繰り返し、〜まで繰り返す、待つ、止める。

もし判定

「もし〜なら」は条件が真のときだけ内側のブロックを実行します。条件は六角スロットに入れ、比較や論理ブロックを配置します。

1
2
3
if <(分数) > (99)> then
say (满分!)
end

もし〜でなければ

「もし〜なら…でなければ」で二択になります。真なら前段、偽なら後段。勝ち負けやオン/オフの切り替えに向きます。

1
2
3
4
5
if <key (空格 v) pressed?> then
say (跳)
else
say (蹲下)
end

N 回繰り返す

「N 回繰り返す」は中身を N 回ループし、少しずつ移動する描画や効果音の連続再生などに使われます。

1
2
3
4
repeat (10)
move (5) steps
end
// 移動 10 回 × 5 歩 = 合計 50 歩

ずっとループ

「ずっと」は自分では止まらないため、停止ブロックや条件で抜け出します。スプライトの巡回や背景スクロールのような継続動作を置きます。

1
2
3
4
forever
move (10) steps
if on edge, bounce
end

〜まで繰り返す

「〜まで繰り返す」は中身を先に実行してから条件を判定し、真になったら抜けます。キー入力待ちやスコア到達待ちに向きます。

1
2
3
4
repeat until <key (空格 v) pressed?>
wait (0.1) seconds
end
say (终于按了空格!)

待つ

「1 秒待つ」は現在のスクリプトを一時停止し、「〜まで待つ」は条件が真になるまで停止します。注意:待ちは現在のスクリプトだけを止め、他のスクリプトは通常通り動きます。

1
2
3
4
5
when green flag clicked
say (预备)
wait (1) seconds
say (开始!)
wait until <(计时器) > (10)>

スクリプトの停止

「すべてを止める」は全スクリプトを終了、「このスクリプトを止める」は現在のスクリプトだけ、「このスプライトの他のスクリプトを止める」は自身だけ動かして他を止めます。

1
2
3
4
5
6
when green flag clicked
forever
if <(生命值) < (1)> then
stop (all)
end
end

複合条件

かつ・または・ではないで複数条件を一つにまとめます。かつは全部真、またはは少なくとも 1 つ真、ではないは結果を反転します。

1
2
3
4
5
6
if <<key (w v) pressed?> or <key (上 v) pressed?>> then
change y by (10)
end
if <<(分数) > (0)> and <(分数) < (100)>> then
say (分数在范围内)
end

6.カスタムブロック(関数)

カスタムブロックは繰り返しのコードをパラメータ・返り値付きの再利用可能な塊にまとめる、いわば関数です。

ブロックを作る

「ブロック定義」カテゴリの「新しいブロックを作る」から名前とパラメータを指定すると、スクリプトエリアに「定義」ブロックが現れ、ロジックを書けます。

1
2
3
4
define 跳跃
change y by (50)
wait (0.2) seconds
change y by (-50)

パラメータ付き

定義時に数値・文字列の入力を追加し、呼び出し時に値を渡します。パラメータはローカル変数で、ブロック内でのみ有効です。

1
2
3
4
5
6
7
define 画正方形 (边长)
repeat (4)
move (边长) steps
turn right (90) degrees
end
画正方形 (50)
画正方形 (100)

値を返す

カスタムブロックは既定では値を返しません。「戻り値」を実現するには、結果を変数に入れて呼び出し後に読みます。

1
2
3
4
define 计算平方 (n)
set [平方 v] to ((n) * (n))
计算平方 (7)
say (join (7 的平方是) (平方))

カスタムブロックを呼ぶ

定義後は必要な場所に呼び出しブロックを置くだけで実行されます。呼び出し 1 回ごとに中のスクリプトが 1 回走ります。

1
2
3
4
5
define 打招呼 (名字)
say (join (你好,) (名字))
when green flag clicked
打招呼 (小猫)
打招呼 (小狗)

再帰

カスタムブロックは自分自身を呼べます(再帰)。Scratch にはスタック深さの上限があるため、深すぎる再帰は避け、ループで書き直すのが安全です。

1
2
3
4
5
6
define 数数 (n)
if <(n) > (0)> then
say (n)
数数 ((n) - (1))
end
数数 (3)

画面を再描画しない

カスタムブロック編集時に「画面を再描画せずに実行」をチェックすると、ブロックが一気に瞬時実行されます。リストの大規模演算や高速計算に向きます。

1
2
3
// define ブロックを編集 > 「画面更新せずに実行」をチェック
define 批量处理
// ループ内の大量計算を 1 フレームずつ描画しない

パラメータの局所性

カスタムブロックのパラメータはブロック内のみですが、ブロック内で作った変数は既定でグローバルになり、外部の同名変数と衝突する危険があります。

1
2
3
define 加分 (amount)
change [分数 v] by (amount) // グローバル変数を変更
加分 (10)

再利用と分割

ロジックのかたまりをカスタムブロックに抽出すると、複数のイベントから再利用できるため、コードが整理されてデバッグもしやすくなります。

1
2
3
4
5
6
7
define 重新开始
set [分数 v] to (0)
switch backdrop to (开始界面)
when green flag clicked
重新开始
when I receive (失败)
重新开始

7.文字列

連結・文字取り出し・長さ・含む判定など、文字列の基本的な演算をサポートします。

テキストの連結

「連結」は 2 つの文字列を前後につないで新しい文字列にします。プロンプトや座標の組み立てに多用されます。

1
2
3
join (你好,) (小猫) // 你好,小猫
join (X=) (x position) // 数字を文字列に連結
say (join (得分:) (分数))

文字を取り出す

「N 文字目」は指定位置の文字を返します。日本語の文字も 1 文字扱い、空白も 1 文字として数えられます。

1
2
3
letter (1) of (Scratch) // S
letter (2) of (Scratch) // c
length of (你好) // 2

文字列の長さ

「文字列の長さ」は文字数を返します。英字・スペース・日本語の文字もすべて 1 文字。空文字列判定や入力長の上限制限に使います。

1
2
3
4
5
length of (Scratch) // 7
length of (你好世界) // 4
if <(length of (answer)) > (10)> then
say (太长了!)
end

含むかの判定

「〜を含む」はある文字列が別の部分文字列を含むかを判定し、真偽値を返します。キーワード検出に利用できます。

1
2
3
4
<(Scratch 真有趣) contains (有趣)?> // true
if <(answer) contains (猫)> then
say (你喜欢猫)
end

位置の検索

「N 文字目」と「文字列の長さ」を組み合わせれば手作業で検索できます。位置を 1 つずつ進めて一致した位置を返すだけです。

1
2
3
4
5
6
7
set [位置 v] to (0)
repeat (length of (文本))
change [位置 v] by (1)
if <(letter (位置) of (文本)) = (目标)> then
say (join (找到位置:) (位置))
end
end

リストに分解

文字列を 1 文字ずつリストに格納すれば、繰り返しで 1 文字ずつ処理できます。

1
2
3
4
5
6
delete (all) of [字符表 v]
set [i v] to (1)
repeat (length of (文本))
add (letter (i) of (文本)) to [字符表 v]
change [i v] by (1)
end

空文字列の判定

「長さ = 0」が空文字列を意味します。未入力時の答えも空文字列なので、必ず長さを確認してから使います。

1
2
3
4
5
6
ask (输入你的名字) and wait
if <(length of (answer)) = (0)> then
say (名字不能为空)
else
say (join (你好,) (answer))
end

長い文章を連結

Scratch のテキストブロックは単一行入力なので、長い文章は複数の連結ブロックでつなぎます。カンマや空白もそのまま保持されます。

1
say (join (第一行,) (join (第二行,) (第三行)))

8.リストとデータ構造

リストは Scratch の中核データ構造で、追加・削除・変更・参照・走査・二次元シミュレーションが可能です。

リストを作る

「変数」カテゴリの「リストを作る」をクリックし、変数と同じようにスクリプト領域に現れます。ステージ上のリストモニターは表示/非表示を切り替えられます。

1
2
3
// 変数カテゴリ > リストを作る > 名前を入力:背包
add (苹果) to [背包 v]
show list [背包 v]

追加と削除

「追加」は末尾に新しい要素を入れ、「削除」は指定インデックスまたはすべてを消します。削除後はインデックスが自動で前に詰められます。

1
2
3
4
5
add (苹果) to [背包 v]
add (盾牌) to [背包 v]
delete (1) of [背包 v]
// 背包 = [盾牌]
delete (all) of [背包 v]

要素の読み出し

「リストの N 番目」はインデックスで取得し、開始は 1 です。範囲外はエラーにならず空を返します。

1
2
3
4
5
add (金) to [宝箱 v]
add (银) to [宝箱 v]
item (1) of [宝箱 v] // 金
item (2) of [宝箱 v] // 银
item (5) of [宝箱 v] // 空

要素の置換

「N 番目を〜で置き換える」は指定位置の値だけ書き換え、長さは変わりません。特定スロットの中身更新に向きます。

1
2
3
add (旧药水) to [背包 v]
replace item (1) of [背包 v] with (新药水)
item (1) of [背包 v] // 新药水

要素の挿入

「N 番目に挿入」は指定位置に新しい要素を差し込み、以降の要素は自動で後ろにずれ込みます。

1
2
3
4
add (苹果) to [背包 v]
add (梨) to [背包 v]
insert (西瓜) at (2) of [背包 v]
// 背包 = [苹果, 西瓜, 梨]

要素の検索

「リストに含まれる」は指定要素が存在するかを判定し、真偽値を返す。空の要素を読むのを避けるため、先に存在を確認してから利用する。

1
2
3
4
5
if <[背包 v] contains (钥匙)> then
say (你有一把钥匙)
else
say (没有钥匙,去找找吧)
end

リストの走査

「〜まで繰り返す」とインデックス変数を組み合わせて 1 件ずつ処理するのが、リスト走査の一般的な書き方です。

1
2
3
4
5
set [i v] to (1)
repeat until <(i) > (length of [背包 v])>
say (item (i) of [背包 v])
change [i v] by (1)
end

二次元データの模擬

リストは 1 次元なので、インデックス = 行 × 列数 + 列 で 2 次元グリッド(マップやボード)をシミュレートできます。

1
2
3
4
// 4 行 3 列グリッド、マス番号 1-12
set [编号 v] to (((行) * (3)) + (列))
add (格子内容) to [地图 v]
item (编号) of [地图 v]

9.プロジェクトとリソース管理

スプライト数・リストサイズ・クローン上限を管理し、プロジェクトの性能と引っかかりを最適化します。

クローン上限

Scratch では 1 プロジェクトあたり同時に存在できるクローンは最大 300 個です。上限を超えると最も古いクローンが自動で削除されます。

1
2
3
4
5
6
// クローン体の上限は 300 個、無限クローンを避ける
when green flag clicked
set [计数 v] to (0)
repeat (10)
create clone of (我自己)
end

リストサイズの制御

リストが無限に大きくなるとプロジェクトが重くなります。不要になったデータは削除し、最大件数を制限します。

1
2
3
4
add (新成绩) to [成绩 v]
if <(length of [成绩 v]) > (100)> then
delete (1) of [成绩 v]
end

スプライト数

スプライトが多いほど 1 フレームの計算量が増えます。同種オブジェクトは別スプライトを増やさずクローンで処理します。

1
2
3
4
5
// 敵 50 体:1 スプライト + クローン 50 回で、50 体作るより速い
when green flag clicked
repeat (50)
create clone of (敌人)
end

メッセージの嵐

毎フレームのように大量にメッセージを送ると、すべての受信側が毎回再起動して重くなります。何かが変化したときだけ送るようにします。

1
2
3
4
5
// forever の中で無闇にブロードキャストしない
// 位置が変わった時だけブロードキャストして、メッセージの嵐を減らす
if <not <(x position) = (上一帧x)>> then
broadcast (位置)
end

変数のキャッシュ

繰り返しの計算結果を変数に格納し、都度複雑な計算をしなくて済むようにします。何度も使う値は事前に計算して保持します。

1
2
3
4
5
// 一度計算して、複数箇所で再利用
set [距离 v] to ((x position) - (目标x))
if <(距离) < (50)> then
say (快到了)
end

スプライトリストの管理

ステージ右下のスプライトリストにすべてのスプライトが並びます。ドラッグで順番を移動、右クリックで複製・書き出し・削除ができます。

1
2
// スプライトのサムネイルを右クリック > 複製/書き出し/削除
// 複製したスプライトは同じスクリプトを持ち、コスチューム変更で新キャラになる

パフォーマンス最適化

毎フレームの再描画を減らし、大量のリスト演算を避け、クローンとパーティクル数を制限すると、プロジェクトが滑らかになります。

1
2
3
4
5
6
7
// ちらつきを減らす:先にスプライトを隠してからまとめて移動
hide
repeat (20)
change x by (5)
end
show
// 大量計算は「画面更新せずに実行」の自作ブロックに入れる

コスチュームと音素材

コスチューム・音はすべてリソースで、数が増えるとファイルが大きくなり読み込みも遅くなります。不要なものは削除し、読み込み前に画像を圧縮します。

1
2
// 使わないコスチュームと音を削除して、.sb3 のサイズを小さく
// 画像は読み込み前に圧縮して、読み込み時間を短縮

10.スプライト=オブジェクト

各スプライトは変数とスクリプトを持つオブジェクトで、クローンはそのインスタンスです。

スプライト=オブジェクト

スプライトはコスチューム・変数・スクリプトをまとめた小さなオブジェクトです。ステージはグローバルなコンテナにあたります。

1
2
3
4
// スプライト「猫」:変数 名前 + スクリプト
when green flag clicked
set [名字 v] to (小猫)
say (join (你好,) (名字))

クローン=インスタンス

クローンはスプライトの複製インスタンスで、コスチュームと非専用スクリプトは共有しつつ、位置・サイズ・プライベート変数はそれぞれ独立しています。

1
2
3
4
5
6
when green flag clicked
repeat (3)
create clone of (我自己)
end
when I start as a clone
go to x: (pick random (-200) to (200)) y: (0)

メッセージ=メソッド呼び出し

メッセージは他の「オブジェクト」へ送る通知で、受信側のブロックがそれを処理します。オブジェクト指向のメソッド呼び出しに似ています。

1
2
3
4
5
when this sprite clicked
broadcast (受伤)
when I receive (受伤)
say (啊!)
change [生命 v] by (-1)

プライベート属性

「このスプライトのみ」変数はオブジェクトのプライベート属性で、クローンごとに独立して他への影響は出ません。

1
2
3
4
5
6
when green flag clicked
set [编号 v] to (1)
create clone of (我自己)
when I start as a clone
set [编号 v] to (2) // このクローン体だけ変更
say (编号)

クローンで再利用

スプライトのクローンは同型の「テンプレート」を生み出し、スクリプトや変数を変更して振る舞いの違うインスタンスを派生させます。継承に似た発想です。

1
2
3
4
5
6
7
// 敵のテンプレートをクローン → それぞれに異なる速度を設定
when I start as a clone
set [速度 v] to (pick random (1) to (5))
forever
move (速度) steps
if on edge, bounce
end

状態と振る舞い

オブジェクトの状態は変数に、行動はスクリプトに持たせます。状態変数で分岐して行動セットを切り替えます。

1
2
3
4
5
6
7
8
9
if <(状态) = (巡逻)> then
move (5) steps
if on edge, bounce
else
if <(状态) = (追踪)> then
point towards (玩家)
move (8) steps
end
end

イベント駆動モデル

Scratch はイベント駆動:緑の旗・キー・クリック・メッセージがそれぞれスクリプトを起動します。main 関数はなく、すべてはイベントから始まります。

1
2
3
4
5
6
7
8
when green flag clicked
启动游戏
when this sprite clicked
播放音效
when key (空格 v) pressed
跳跃
when I receive (过关)
进入下一关

メッセージング

スプライト同士は互いの変数に直接アクセスせず、メッセージと共有変数経由で協調します。結合度が下がり見通しが良くなります。

1
2
3
4
5
6
7
// プレイヤーの得点 → スコアボードのスプライトへブロードキャスト
when this sprite clicked
change [分数 v] by (1)
broadcast (加分动画)
// スコアボード側が受信
when I receive (加分动画)
set [显示分数 v] to (分数)

11.デバッグとエラー処理

Scratch には例外機構がないため、変数の監視・言うブロック・境界チェックで問題を発見します。

例外機構がない

Scratch は例外を投げず、バグは誤ったまま静かに動きます。事前の値チェックと能動的な防御が重要です。

1
2
3
// エラーにはならず、おかしな結果になるだけ
// リストの範囲外読み出しは空を返し、比較が常に偽になることも
// 事前にデータをチェックするのが唯一の防衛策

変数を監視する

ステージの変数モニターを右クリックすると「通常読み取り」「大きな読み取り」「スライダー」「隠す」を切り替えられ、値をライブで観察できます。

1
2
3
4
// ステージ上の変数モニターを右クリック:
// 通常表示 / 大きい表示 / スライダー / 隠す
set [分数 v] to (0)
change [分数 v] by (1)

言うブロックでデバッグ

怪しい箇所に「(変数)を言う」を置いて中間値を出力し、ロジックを調査します。調査後は忘れずに削除します。

1
2
3
define 计算得分
set [总分 v] to ((a) + (b))
say (总分) // 一時的なデバッグ出力

境界チェック

リストの要素を読む前にインデックスが範囲内かをチェックして空読みを防ぎます。有効範囲は 1 から長さまでです。

1
2
3
4
5
if <<(i) > (0)> and <(i) <= (length of [背包 v])>> then
say (item (i) of [背包 v])
else
say (序号越界)
end

空チェック

答えが空、リストが空のときは長さを先に確認してから使い、空値の演算で奇妙な結果が出るのを防ぎます。

1
2
3
4
5
if <(length of [背包 v]) = (0)> then
say (背包是空的)
else
say (item (1) of [背包 v])
end

リストの範囲外

リストのインデックスは 1 から始まり、削除後は自動で前に詰まります。長さ」を上限にすれば範囲外を防げます。

1
2
3
4
5
delete (1) of [背包 v]
// 削除後、元の 2 番目が 1 番目になる
if <(i) > (length of [背包 v])> then
set [i v] to (length of [背包 v])
end

ステップデバッグ

大きなスクリプトは小さな単位に分けて段階的にテストするか、待ちブロックで速度を落として各ステップを観察します。

1
2
3
4
5
6
when green flag clicked
初始化
wait (0.5) seconds // ゆっくり観察するため
计算得分
wait (0.5) seconds
显示结果

よくあるエラーチェックリスト

エラーの原因は多くの場合、変数の未初期化、条件の反転、範囲外のインデックス、誰も受信しないメッセージです。チェックリストで 1 つずつ潰します。

1
2
3
4
5
// 変数が代入後に使われているか確認
// 比較の向きが正しいか確認
// リストの番号が範囲内か確認
// ブロードキャストと受信の名前が一致するか確認
// クローン体が上限を超えていないか確認

12.入力と出力

調べる系ブロックでキーボード・マウス・質問を読み、言う・コスチューム・背景で出力し、クラウド変数でデータを保存します。

キーボード入力

「スペースキーが押された?」はキーが押されているかを判定します。ループと組み合わせれば連続移動、1 回判定ならジャンプに使えます。

1
2
3
4
5
6
7
8
forever
if <key (右移 v) pressed?> then
change x by (5)
end
if <key (左移 v) pressed?> then
change x by (-5)
end
end

マウス入力

マウスポインタの位置とボタンの押下状態を読み取れば、スプライトをマウスに追従させたりクリックに反応させたりできます。

1
2
3
4
5
6
7
8
forever
go to (mouse-pointer)
if <mouse down?> then
set size to (120) %
else
set size to (100) %
end
end

質問と回答

「〜と聞いて待つ」は入力ダイアログを開き、ユーザーの返答を「答え」ブロックに格納します。常に文字列です。

1
2
3
4
ask (你叫什么名字?) and wait
say (join (你好,) (answer))
ask (你今年几岁?) and wait
set [年龄 v] to (answer)

接触の検知

スプライトがマウス・他のスプライト・色に接触しているかを検知します。衝突判定やアイテム取得に使われます。

1
2
3
4
5
6
7
8
forever
if <touching (敌人 v)?> then
change [生命 v] by (-1)
end
if <touching (mouse-pointer v)?> then
say (抓到我了)
end
end

センシング値の出力

x 座標・y 座標・向き・音量・タイマーなどは読み取り可能な調べる値で、そのまま演算に渡せます。

1
2
3
say (join (x=) (x position))
say (join (y=) (y position))
say (loudness) // マイク音量 0-100

メッセージ出力

メッセージは他のスプライトの動作を同期させる主要な出力チャネルで、受信側が反応します。

1
2
3
4
5
when this sprite clicked
broadcast (开门)
when I receive (开门)
switch costume to (门开了)
play sound (咔嗒 v)

クラウド変数で保存

クラウド変数は数値をサーバーに保存し、全プレイヤーで共有します。ハイスコアやオンライン統計に向きます。

1
2
3
4
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

画面への出力

「言う」と「考える」で文字、コスチューム切替で画像、音の再生で音声を出力します。これらを組み合わせてフィードバックを作ります。

1
2
3
4
5
6
when this sprite clicked
say (嗷呜!) for (1) seconds
play sound (咆哮 v)
switch costume to (张嘴)
wait (0.3) seconds
switch costume to (闭嘴)

13.よくある落とし穴

初心者が最も陥りやすい 8 つの落とし穴。BAD が誤った書き方、GOOD が正しい書き方です。

ずっとループで固まる

ずっとループ内のに待ちを入れ、条件が永遠に満たされないとスクリプトが固まります。ループ内で条件を進め、または抜けられるようにします。

1
2
3
4
5
6
7
8
// BAD 決して満たされない条件を待つ
forever
wait until <(x position) > (1000)>
end
// GOOD ループ内で条件を進めるか、ループが抜けられるようにする
repeat until <(x position) > (240)>
change x by (5)
end

メッセージの時系列

メッセージは非同期で、送った側はすぐに次へ進み、受信側は並行に走り出します。順序が必要なときは「メッセージを送って待つ」を使います。

1
2
3
4
5
6
// BAD ブロードキャスト直後に受信側が設定した値を読むと、まだ更新されていないかも
broadcast (开始动画)
say (动画结束)
// GOOD 「ブロードキャストして待つ」で受信側の完了を待つ
broadcast (开始动画) and wait
say (动画结束)

クローン変数の混線

グローバル変数はクローン間で共有されるため、1 つを変えると全部に反映されます。クローンを区別するには「このスプライトのみ」のプライベート変数を使います。

1
2
3
4
5
6
7
8
9
// BAD グローバル変数を番号に使うと、すべてのクローン体が同じ値を読む
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
// GOOD プライベート変数はクローン時にクローン体へコピーされる
when I start as a clone
say (编号)

待ち条件が満たされない

「〜まで待つ」の条件が別のスクリプトで設定される場合、そのスクリプトが動いていない可能性があります。条件を変える何かが必ず動くようにします。

1
2
3
4
5
// BAD 条件が停止したスクリプトによってしか変わらない
wait until <(加载完成) = (1)>
// GOOD 変数のポーリングではなく、イベントで待つ
when I receive (加载完成)
say (加载好了)

空値の演算

答えやリスト要素が空のとき比較・演算に混ぜると偽や奇妙な結果になります。長さを先に判定してから使います。

1
2
3
4
5
6
7
8
9
10
11
ask (输入数字) and wait
// BAD 空入力を数値として比較、常に偽
if <(answer) > (10)> then
say (大于10)
end
// GOOD 先に空かどうかをチェック
if <(length of (answer)) > (0)> then
say (join (你输入了) (answer))
else
say (你没有输入)
end

リストのインデックス範囲外

リストのインデックスは 1 から始まり、最大は長さです。0 や範囲を超えたインデックスでは読めず、バグの温床になります。

1
2
3
4
5
6
7
add (苹果) to [背包 v]
// BAD 0 番目や大きすぎる番号でリストを読む
say (item (0) of [背包 v])
say (item (9) of [背包 v])
// GOOD 1..長さ の範囲の番号を使う
say (item (1) of [背包 v])
say (item (length of [背包 v]) of [背包 v])

コスチューム名不一致

コスチューム切替の名前はパネルと完全一致させる必要があります。空白が 1 つ多かったり欠けていると切替は静かに失敗します。

1
2
3
4
// BAD コスチューム名に余分なスペースがあり、切り替えが効かない
switch costume to (新造型 )
// GOOD コスチューム名がパネルと完全に一致
switch costume to (新造型)

再帰が深すぎる

Scratch の再帰にはスタック深さの上限があり、深すぎると静かに停止/異常動作します。深い再帰はループで書き直します。

1
2
3
4
5
6
7
8
9
// BAD 深い再帰は Scratch のスタック上限を超えるかも
define 数到 (n)
数到 ((n) + (1))
数到 (0)
// GOOD ループで数えて、深さ制限なし
set [n v] to (0)
repeat (10000)
change [n v] by (1)
end

14.マルチスクリプトと並行処理

複数のイベントスクリプトが並行に走り、メッセージと待ちで実行順序を協調します。

並行スクリプト

1 つのスプライトでも複数の独立したスクリプトを保持でき、それぞれ独自のイベントから並行に走り、お互いを待ちません。

1
2
3
4
5
6
7
8
9
10
when green flag clicked
forever
move (5) steps
if on edge, bounce
end
when green flag clicked
forever
play sound (节拍 v)
wait (1) seconds
end

イベント=スレッド

各イベント(緑の旗・キー・クリック・メッセージ受信)は専用スクリプトを起動し、それぞれスレッドに相当します。

1
2
3
4
5
6
when green flag clicked
say (开始了)
when key (空格 v) pressed
say (按了空格)
when this sprite clicked
say (被点击)

共有変数

全スクリプトがグローバル変数を共有します。複数のスクリプトが同時に同じ変数に書き込むと更新が上書きし合います。

1
2
3
4
5
6
7
when green flag clicked
forever
change [分数 v] by (1)
wait (0.1) seconds
end
when this sprite clicked
change [分数 v] by (10)

競合状態

二つのスクリプトが同じ変数に対し「読み取り → 変更 → 書き込み」を並行に行うと更新が失われることがあります。重要な更新は 1 本のスクリプトにまとめます。

1
2
3
// 2 つのスクリプトが同時に同じ変数を change
// 旧値を読む→加える→書き戻す の途中に割り込まれる可能性
// 対策:重要なカウントを 1 つのスクリプトに集約して処理

メッセージ同期順序

「メッセージを送って待つ」はすべての受信側スクリプトが完了するまで送り手を止め、多段アニメの順序制御に利用できます。

1
2
3
broadcast (第一幕) and wait
broadcast (第二幕) and wait
broadcast (第三幕) and wait

スレッド停止

「停止」ブロックは指定したスクリプトを停止できる。「すべて」「このスクリプト」「このスプライトの他のスクリプト」のいずれかを対象に選ぶ。リセット処理によく使われる。

1
2
3
4
5
when green flag clicked
broadcast (重新开始)
when I receive (重新开始)
stop (other scripts in sprite)
set [分数 v] to (0)

スプライト間の協調

複数のスプライトが並行に動くときは、共有変数と待ちを使って、揃って進む/順番に動くよう調整します。

1
2
3
4
5
6
7
when green flag clicked
set [信号 v] to (0)
when I receive (齐步走)
set [信号 v] to (1)
when green flag clicked
wait until <(信号) = (1)>
say (开始前进)

協調的シングルスレッド

並行に見えても、各スクリプト内部は上から下へ 1 ブロックずつ進みます。長時間ループは同じスプライトの他スクリプトも止めてしまいます。

1
2
3
4
5
// 1 つのスクリプト内の長いループは、そのスプライトの他のスクリプトをブロックする
// 「ブロードキャスト」でタスクを別のイベントに分ける
repeat (100)
复杂计算
end

15.ネットワークと拡張

クラウド変数でプロジェクトをネット越しに共有し、拡張ブロックで翻訳や読み上げなどのオンライン機能を提供します。

クラウド変数のネット同期

クラウド変数は数値をサーバーにリアルタイム同期し、複数ユーザーが同じプロジェクトを動かしてもデータが共有されます。ランキングや簡易な対戦に向きます。

1
2
3
4
5
// 変数を作る時に「クラウド変数」をチェック(数値のみ)
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

翻訳拡張

「翻訳」拡張はオンライン翻訳を呼び出し、テキストを任意の言語に訳した文字列を返します。

1
2
3
// 拡張機能を追加 > 翻訳
say (translate (你好) to (英语 v))
say (translate (Hello) to (中文 v))

音声合成

「音声合成」拡張は文字を音声で読み上げ、言語とボイスを切り替えられます。オンラインの音声サービスが必要です。

1
2
3
// 拡張機能を追加 > テキスト読み上げ
speak (欢迎来到我的游戏)
set voice to (Kitty v)

ビデオモーション

「ビデオモーション」拡張はカメラで動きを取り込み、プレイヤーの手振りでスプライトを操作できます。初回はカメラ権限の許可が必要です。

1
2
3
// 拡張機能を追加 > ビデオセンサー
when video motion > (50)
say (有动作!)

サイトで共有

右上の「共有」をクリックするとプロジェクトを Scratch サイトに公開でき、誰でもオンラインで遊んだりいいね・コメントをしたりできます。

1
2
// ログイン → 右上の「共有」をクリック
// 公開後、リンクをコピーして友達に共有

リミックス

サイトで「リミックス」を押すと他人のプロジェクトを複製して自分用に改造でき、原作者のクレジットは保持されます。

1
2
// 他人のプロジェクトを開く → 「リミックス」をクリック
// リミックス後、スクリプトを編集して共有すると自分の作品になる

クラウド変数の制限

クラウド変数には制限があります:1 プロジェクトあたりの数に上限があり、値は数値かつ短く、頻繁な更新はサーバ側で制限されます。

1
2
3
4
// 各プロジェクトのクラウド変数の数には上限がある
// クラウド変数は数値しか保存できず、文字列は不可
// 頻繁な更新はサーバーに制限される
// クラウド変数を使う前にはログインが必要

ネットの安全性とプライバシー

オンラインのプロジェクトは公開されます。本名・住所・電話番号などの個人情報は作品に入れないでください。

1
2
3
// 作品内で実名や個人情報を明かさない
// 見知らぬ人から届いた不審なファイルをダウンロード・実行しない
// 仮名を使って個人のプライバシーを守る

16.時間とタイミング

タイマー・待ち・2000 年からの日数ブロックで、 countdown、ストップウォッチ、制限時間付きステージを作ります。

タイマー

「タイマー」はプロジェクト開始からの経過秒を小数で返し、ストップウォッチやカウントダウンの中核です。

1
2
3
4
5
when green flag clicked
say (计时器)
forever
say (join (已用:) (timer))
end

タイマーをリセット

「タイマーをリセット」はタイマーを 0 に戻し、新しい計測を始めるときに使います。

1
2
3
4
when green flag clicked
reset timer
wait (5) seconds
say (join (用时:) (timer))

日数カウント

「2000 年からの日数」は 2000-01-01 からの経過日数を返します。日跨ぎの計測や「最後に開いた日」の記録に利用できます。

1
2
say (days since 2000)
// 小数付きの日数を返す、例:9678.5 は半日を表す

秒数待ち

「N 秒待つ」は現在のスクリプトを N 秒止めます。テンポ・遅延・アニメのフレーム間隔に使います。

1
2
3
4
5
when green flag clicked
say (3) for (1) seconds
say (2) for (1) seconds
say (1) for (1) seconds
say (起飞!)

カウントダウン

タイマーと引き算でカウントダウンを作り、ゼロになった終了イベントを送ります。

1
2
3
4
5
6
7
8
9
10
when green flag clicked
set [剩余 v] to (30)
forever
set [剩余 v] to ((30) - (timer))
if <(剩余) < (0)> then
set [剩余 v] to (0)
broadcast (时间到)
stop (this script)
end
end

ストップウォッチ

タイマーの差分を取れば、ある操作に要した時間を測れる。反応テストのミニゲームに適している。

1
2
3
4
5
when green flag clicked
wait until <key (空格 v) pressed?>
reset timer
wait until <key (空格 v) pressed?>
say (join (你的反应:) (join (timer) ( 秒)))

制限時間ステージ

制限時間内にゴールし、超过すれば失敗。カウントダウンと勝利条件を組み合わせます。

1
2
3
4
5
6
7
8
9
10
11
when green flag clicked
set [倒计时 v] to (10)
repeat until <(倒计时) < (1)>
wait (1) seconds
change [倒计时 v] by (-1)
if <(通关) = (1)> then
say (过关!)
stop (this script)
end
end
say (时间到!)

タイマー駆動アニメ

アニメをフレームレートではなくタイマー基準で駆動すれば、パソコンごとに速度が変わる問題を避けられます。

1
2
3
4
forever
go to x: ((timer) * (100)) y: (0)
end
// キャラクターが時間に応じて等速移動、マシンの速さに依存しない

17.スクリプトのライフサイクル

スクリプトは Scratch 最小の実行単位。起動・実行・停止を理解すれば、プロジェクト全体が見えます。

スクリプト=手続き

イベントブロックから始まり末尾までの一連のスクリプトが小さな手続きであり、複数合わさってプログラムになります。

1
2
3
when green flag clicked // 始点
say (第一步)
say (第二步) // 順に実行

緑の旗で起動

緑の旗は標準の起動エントリで、クリックすると「緑の旗が押されたとき」スクリプトが一斉に始まります。main 関数のようなものです。

1
2
3
when green flag clicked
初始化所有变量
显示开始界面

イベントハンドラ

イベントブロックはスクリプトの「帽子」で、トリガされたときだけ走ります。トリガがなければ自動的には始まりません。

1
2
3
4
5
6
when key (空格 v) pressed
跳跃
when this sprite clicked
打招呼
when I receive (过关)
next backdrop

アトミック実行

「画面を再描画せずに実行」をチェックしたカスタムブロックは一気に完走し、再描画を挟まないため、バッチ処理などの高速計算に向きます。

1
2
3
define 大量计算
// 「画面更新せずに実行」をチェック
// 1 フレーム内で完了し、ブロックごとに描画しない

並行ライフサイクル

各スクリプトは独立に起動・停止します。停止ブロックで「すべて/このスクリプト/このスプライトの他スクリプト」を精准に制御できます。

1
2
3
4
5
6
when green flag clicked
主循环
when I receive (暂停)
stop (other scripts in sprite)
when I receive (继续)
主循环

停止のスコープ

「このスクリプトを止める」は自分だけ、「このスプライトの他のスクリプトを止める」は同スプライトの他、「すべてを止める」は全クリア。

1
2
3
stop (this script)
stop (other scripts in sprite)
stop (all)

ステートマシン手順

現在の状態を変数に持たせ、状態間で遷移させることでメニュー・プレイ中・エンディングなどの場面を切り替えます。

1
2
3
4
5
6
7
if <(场景) = (菜单)> then
switch backdrop to (菜单背景)
else
if <(场景) = (游戏中)> then
switch backdrop to (游戏背景)
end
end

プロジェクトのライフサイクル

プロジェクトはリソース読み込み → 緑の旗で起動 → 実行 → 停止ボタン → 保存・共有というライフサイクルを持ちます。

1
2
3
4
5
// 読み込み:コスチューム、音、変数を読み込む
// 起動:緑の旗をクリックして各スクリプトが開始
// 実行:イベントとループが継続して実行
// 停止:赤い丸ボタンで全部停止
// 保存:自動保存または手動で .sb3 をダウンロード

18.テキストパターンマッチ

Scratch に正規表現はないため、含む・文字判定・リスト分解で簡易マッチングを行います。

正規表現がない

Scratch には正規表現ブロックがありません。複雑なパターンマッチは演算ブロックで自前で組むか、拡張に任せます。

1
2
// Scratch には正規表現がない
// 「含む」「N 文字目」などのブロックで自分で実装する

含むマッチ

「含む」は最もシンプルな部分文字列マッチで、テキストに特定の語があるかを判定します。

1
2
3
if <(台词) contains (危险)> then
say (出现危险词!)
end

先頭判定

1 文字目を読み出して先頭文字と一致するかを判定し、プレフィックス検出に使います。

1
2
3
if <(letter (1) of (命令)) = (跳)> then
say (执行跳跃指令)
end

末尾判定

最後の文字(インデックスは文字列の長さ)を取り出して末尾を判定し、サフィックス検出に使います。

1
2
3
if <(letter (length of (命令)) of (命令)) = (!)> then
say (语气强烈)
end

文字種別

1 文字が数字か英字かを判定するには、数字表を作って「含む」で問い合わせます。

1
2
3
4
// 数字表 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
if <[数字表 v] contains (letter (i) of (文本))> then
say (这是数字)
end

パターン検索

ループでテキストを 1 文字ずつ走査し、条件に合う部分を抜き出します(例:連続する数字を抽出)。

1
2
3
4
5
6
7
set [i v] to (1)
repeat (length of (文本))
if <[数字表 v] contains (letter (i) of (文本))> then
say (join (找到数字) (letter (i) of (文本)))
end
change [i v] by (1)
end

分解パース

区切り文字でテキストをリストに分割し、要素ごとに処理すれば、簡易的なパースを実現できる。

1
2
3
4
5
6
7
8
9
10
11
set [i v] to (1)
repeat (length of (文本))
if <(letter (i) of (文本)) = (,)> then
add (当前段) to [段落 v]
set [当前段 v] to ()
else
set [当前段 v] to (join (当前段) (letter (i) of (文本)))
end
change [i v] by (1)
end
add (当前段) to [段落 v]

ワイルドカードの模擬

「含む」と複数の OR 条件を組み合わせてワイルドカードを模倣し、いずれかのキーワードにマッチするかを判定します。

1
2
3
if <<(文本) contains (开始)> or <(文本) contains (结束)>> then
say (匹配到关键词)
end

19.保存・公開・デバッグ

プロジェクトの保存・書き出し・共有とデバッグのテクニックで、作品をなめらかに遊びやすくします。

プロジェクトを保存

サインイン中はプロジェクトが自動でクラウドに保存されます。ファイルメニューから手動保存・パソコンへのバックアップも可能です。

1
2
3
4
// ログインするとクラウドに自動保存
// ファイル > コンピューターに保存して、.sb3 をバックアップ
when green flag clicked
say (放心,已经自动保存了)

.sb3 ファイル形式

プロジェクトの拡張子は .sb3 で、project.json とコスチューム・音などの素材を含む zip アーカイブです。オフラインで開けます。

1
2
3
// .sb3 は zip 圧縮パッケージ
// 中に project.json と素材ファイルが含まれる
// .sb3 をダブルクリックするとオフラインで開ける

公開と共有

右上の「共有」で作品を公開し、タイトル・説明・タグを設定すると多くの人に見てもらいやすくなります。

1
2
3
// 面白いプロジェクトタイトルを付ける
// 遊び方を明確に書いて、適切なタグを付ける
// 「共有」を押して公開し、リンクを友達に送る

リミックスして再構築

他人のプロジェクトをリミックスして学習の出発点にし、スクリプト改造やステージ追加をした自分のバージョンを公開します。

1
2
3
// プロジェクトを開く → 「リミックス」をクリック
// スクリプトとコスチュームを編集して共有
// 原作者のクレジットを残し、コミュニティルールを守る

デバッグツール

変数の監視・「言う」ブロック・長めの待ちを使って問題箇所を特定し、セクションごとにスクリプトを検証します。

1
2
3
// 疑わしい変数を監視してリアルタイムに値を確認
// 一時的に say を追加して途中結果を出力
// wait を入れて各ステップをゆっくり観察

バックアップとバージョン

.sb3 をローカルにバックアップ保存し、バージョンごとにファイル名を変えれば、壊れても前の版に戻れます。

1
2
// 重要な作品は定期的に .sb3 をダウンロードしてバックアップ
// 「名前を付けて保存」で複数バージョンを保存

公開前チェック

公開前に各種エントリ(緑の旗・キー・スプライトクリック・メッセージ)をテストし、無限ループ・範囲外・引っかかりがないことを確認します。

1
2
3
// テスト:緑旗、スペース、スプライトをクリック、ブロードキャスト受信
// チェック:ループが抜けられる、リストが範囲外でない
// チェック:クローン体が上限を超えない、画面が滑らか

継続的に学ぶ

公式チュートリアル、Scratch Wiki、コミュニティ作品から学び続け、自分の作品を改善し続けましょう。

1
2
3
// 公式チュートリアル:scratch.mit.edu の「创意与学习」
// Scratch Wiki:en.scratch-wiki.info
// コミュニティの優れた作品をたくさん遊んで学ぶ

公式リンク

公式ドキュメントとリソースへの直接リンク。

このチートシートについて

Scratch はマサチューセッツ工科大学メディアラボが開発した無料のビジュアルプログラミング言語で、5〜16 歳の学習者を対象に設計されています。コードを書く代わりに「ブロック」をはめ込み、動き・見た目・音・イベント・制御・調べる・演算・変数・ブロック定義の 9 カテゴリからスクリプトエリアにドラッグするだけで、スプライトのアニメやインタラクティブなゲーム、創造的な物語を作れます。 このページは Scratch 3 の自己完結的な早見表で、初心者がゲーム・アニメ・物語づくりで使う約 80% の事例をカバーします。19 のセクションはそれぞれ 1 つのテーマに焦点を当てています:最初のプログラム(hello)、変数とデータ保存(vars / types / pointers)、制御フロー(control)、カスタムブロック(funcs)、文字列とリスト(strings / collections)、プロジェクトとリソース管理(mem)、スプライトオブジェクトモデル(oop)、デバッグと落とし穴(errors / faq)、入出力と同時実行スクリプト(io / threads)、クラウド変数と拡張(net)、時間とタイミング(time)、スクリプトのライフサイクル(proc)、テキストパターンマッチ(regex)、保存・公開・デバッグ(build)。各セクションは 8 トピックに分割され、5〜20 行ずつの例を添えています。 他のプログラミング言語と異なり Scratch にはテキスト構文がないため、ここではブロックを読みやすいテキストで表現し、オフラインでの参照と記憶の両立を図っています。すべてブラウザ内でレンダリングされ、アップロードや追跡は一切ありません。GuruToolkit 無料デベロッパーツール群の一部で、ここにあるスニペットは自由に利用でき、いかなる保証も伴いません。

バージョン 2.1.0