コンテンツにスキップ

ブロックとスクリプト

Scratchプログラミングの核心はブロックスクリプトです。このガイドでは、ブロックの種類、スクリプトの構築方法、そして効果的なプログラミング技術について詳しく学習します。

ブロックは、Scratchプログラミングの基本単位です。レゴブロックのように組み合わせることで、複雑なプログラムを作成できます。

🎨 視覚的:カラフルで直感的なデザイン
🔗 接続可能:他のブロックと簡単に接続
🏷️ 機能別:色と形で機能を区別
📝 パラメータ:設定可能な値や条件
🔄 再利用:何度でも使用可能

ハットブロックは、スクリプトの開始点となるブロックです。帽子のような形をしています。

🚩 緑の旗がクリックされたとき
⌨️ [スペース] キーが押されたとき
🖱️ このスプライトがクリックされたとき
📨 [メッセージ1] を受け取ったとき
🎬 背景が [背景1] になったとき
🔊 音量 > [10] のとき
⏰ タイマー > [10] のとき
// ゲーム開始
緑の旗がクリックされたとき
スコア を 0 にする
"ゲーム開始!" と 2 秒言う
// キャラクター操作
右向き矢印 キーが押されたとき
x座標を 10 ずつ変える

2. スタックブロック(Stack Blocks)

Section titled “2. スタックブロック(Stack Blocks)”

スタックブロックは、アクションや命令を表すブロックです。積み重ねて使用します。

カテゴリ別スタックブロック:
Section titled “カテゴリ別スタックブロック:”

🔵 動きブロック:

• [10] 歩動かす
• 右に [15] 度回す
• [1] 秒で x座標を [0] に、y座標を [0] に変える
• もし端に着いたら、跳ね返る
• 回転方法を [左右のみ] にする

🟣 見た目ブロック:

• [Hello!] と [2] 秒言う
• 表示する / 隠す
• コスチュームを [costume1] にする
• 大きさを [10] ずつ変える
• [色] の効果を [25] ずつ変える

🟡 音ブロック:

• [ニャー] の音を鳴らす
• [1] の音を最後まで鳴らす
• すべての音を止める
• 音量を [10] ずつ変える
• 音程を [10] ずつ変える

🟠 イベントブロック:

• [メッセージ1] を送る
• [メッセージ1] を送って待つ

🟤 制御ブロック:

• [1] 秒待つ
• [10] 回繰り返す
• すべてを止める [すべて]

🔴 調べるブロック:

• [マウスのポインター] に触れるまで待つ
• [こんにちは!] と聞いて待つ

🔵 変数ブロック:

• [変数] を [0] にする
• [変数] を [1] ずつ変える
• [リスト] に [thing] を追加する
• [リスト] の [1] 番目を削除する

Cブロックは、他のブロックを包含する形状のブロックです。制御構造を表現します。

🔄 ずっと
🔢 [10] 回繰り返す
❓ もし <条件> なら
❓ もし <条件> なら / でなければ
⏳ <条件> まで繰り返す
// 無限ループ
ずっと
10 歩動かす
もし端に着いたら、跳ね返る
終わり
// 条件分岐
もし <マウスのポインター に触れた> なら
"こんにちは!" と言う
でなければ
"また今度!" と言う
終わり

4. レポーターブロック(Reporter Blocks)

Section titled “4. レポーターブロック(Reporter Blocks)”

レポーターブロックは、値を返すブロックです。楕円形をしています。

📍 x座標 / y座標
📐 向き
📏 大きさ
🔊 音量
⏰ タイマー
🖱️ マウスのx座標 / マウスのy座標
🎲 [1] から [10] までの乱数
💬 答え
👤 ユーザー名
📅 現在の [年]
// 位置情報の表示
"X: " と x座標 と " Y: " と y座標 をつなげたものを言う
// ランダムな動き
[1] から [360] までの乱数 度に向ける
[50] から [100] までの乱数 歩動かす

5. ブールブロック(Boolean Blocks)

Section titled “5. ブールブロック(Boolean Blocks)”

ブールブロックは、真偽値(true/false)を返すブロックです。六角形をしています。

= <[50] = [50]>
< <[50] < [100]>
> <[100] > [50]>
∧ <<条件1> かつ <条件2>>
∨ <<条件1> または <条件2>>
¬ <<条件> ではない>
👆 <[マウスのポインター] に触れた>
🎨 <[色] に触れた>
⌨️ <[スペース] キーが押された>
🖱️ <マウスが押された>
// 複合条件
もし <<x座標 > 200> または <x座標 < -200>> なら
x座標を 0 にする
終わり
// 色の判定
もし <[赤] に触れた> なら
"危険!" と言う
x座標を 0 にする
y座標を 0 にする
終わり
🔵 動き(Motion):スプライトの移動と回転
🟣 見た目(Looks):外観とエフェクト
🟡 音(Sound):音響効果と音楽
🟠 イベント(Events):プログラムの開始トリガー
🟤 制御(Control):ループと条件分岐
🔴 調べる(Sensing):情報の取得と判定
🟢 演算(Operators):計算と論理演算
🔵 変数(Variables):データの保存と管理
🟦 リスト(Lists):データの集合管理
🟪 ブロック定義(My Blocks):カスタムブロック
🎯 直感的:色を見ただけで機能がわかる
🔍 検索効率:必要なブロックを素早く発見
🎨 視覚的整理:スクリプトの構造が明確
📚 学習支援:カテゴリごとの段階的学習

スクリプトは、ブロックを組み合わせて作成されるプログラムです。スプライトの動作や処理を定義します。

🎩 開始:ハットブロックで始まる
⬇️ 流れ:上から下へ順番に実行
🔗 接続:ブロック同士が物理的に接続
🎯 目的:特定の機能や動作を実現
🔄 再利用:コピーして他のスプライトでも使用可能

線形スクリプトは、上から下へ順番に実行される最もシンプルな構造です。

緑の旗がクリックされたとき
"ゲーム開始!" と 2 秒言う
10 歩動かす
右に 90 度回す
"完了!" と 1 秒言う

分岐スクリプトは、条件によって異なる処理を実行します。

緑の旗がクリックされたとき
もし <マウスが押された> なら
"クリックされました!" と言う
10 歩動かす
でなければ
"待機中..." と言う
1 秒待つ
終わり

ループスクリプトは、同じ処理を繰り返し実行します。

緑の旗がクリックされたとき
4 回繰り返す
100 歩動かす
右に 90 度回す
終わり
"正方形完成!" と言う

複合スクリプトは、複数の制御構造を組み合わせます。

緑の旗がクリックされたとき
スコア を 0 にする
ずっと
もし <[星] に触れた> なら
スコア を 1 ずつ変える
ポップ の音を鳴らす
もし <スコア = 10> なら
"レベルクリア!" と 3 秒言う
すべてを止める [このスクリプト]
終わり
終わり
終わり

🎯 よく使われるスクリプトパターン

Section titled “🎯 よく使われるスクリプトパターン”

ゲームやアニメーションの開始時に必要な設定を行います。

緑の旗がクリックされたとき
// 位置の初期化
x座標を 0 にする
y座標を 0 にする
向きを 90 度にする
// 変数の初期化
スコア を 0 にする
ライフ を 3 にする
レベル を 1 にする
// 外観の初期化
表示する
大きさを 100 % にする
コスチュームを [costume1] にする
// 開始メッセージ
"ゲーム開始!" と 2 秒言う

プレイヤーの入力に応じてキャラクターを操作します。

// 連続的な操作
ずっと
もし <右向き矢印 キーが押された> なら
x座標を 5 ずつ変える
終わり
もし <左向き矢印 キーが押された> なら
x座標を -5 ずつ変える
終わり
もし <上向き矢印 キーが押された> なら
y座標を 5 ずつ変える
終わり
もし <下向き矢印 キーが押された> なら
y座標を -5 ずつ変える
終わり
終わり
// 個別のキー操作
スペース キーが押されたとき
もし <y座標 = -150> なら // 地面にいる時のみ
15 回繰り返す
y座標を 8 ずつ変える
0.05 秒待つ
終わり
15 回繰り返す
y座標を -8 ずつ変える
0.05 秒待つ
終わり
終わり

オブジェクト同士の接触を検出し、適切な処理を行います。

ずっと
// 敵との衝突
もし <[敵] に触れた> なら
ライフ を -1 ずつ変える
"ダメージ!" と 1 秒言う
// 無敵時間
5 回繰り返す
隠す
0.1 秒待つ
表示する
0.1 秒待つ
終わり
もし <ライフ < 1> なら
"ゲームオーバー" と 3 秒言う
すべてを止める [すべて]
終わり
終わり
// アイテムとの衝突
もし <[コイン] に触れた> なら
スコア を 10 ずつ変える
キラキラ の音を鳴らす
[コイン取得] を送る
終わり
終わり

スムーズな動きや視覚効果を作成します。

// 滑らかな移動
[目標地点] を受け取ったとき
目標X を マウスのx座標 にする
目標Y を マウスのy座標 にする
<(目標X - x座標) の絶対値 > 5> または <(目標Y - y座標) の絶対値 > 5> まで繰り返す
x座標を x座標 + ((目標X - x座標) / 10) にする
y座標を y座標 + ((目標Y - y座標) / 10) にする
終わり
// 回転アニメーション
[回転開始] を受け取ったとき
36 回繰り返す
右に 10 度回す
0.05 秒待つ
終わり
// 点滅エフェクト
[点滅] を受け取ったとき
10 回繰り返す
隠す
0.1 秒待つ
表示する
0.1 秒待つ
終わり

変数やリストを使ってゲームデータを管理します。

// ハイスコア管理
緑の旗がクリックされたとき
もし <ハイスコア のアイテム数 = 0> なら
0 を ハイスコア に追加する
終わり
現在のハイスコア を ハイスコア の 1 番目 にする
// スコア更新時
[スコア更新] を受け取ったとき
もし <スコア > 現在のハイスコア> なら
現在のハイスコア を スコア にする
ハイスコア の 1 番目を スコア で置き換える
"新記録!" と 3 秒言う
ファンファーレ の音を鳴らす
終わり
// セーブ機能(簡易版)
[ゲーム終了] を受け取ったとき
"最終スコア: " と スコア をつなげたものを言う
"ハイスコア: " と 現在のハイスコア をつなげたものを言う

🎯 スクリプト作成のベストプラクティス

Section titled “🎯 スクリプト作成のベストプラクティス”
✅ 良い例:
- 変数名:プレイヤーHP、敵の速度、ゲーム時間
- メッセージ名:ゲーム開始、レベルアップ、ボス出現
❌ 悪い例:
- 変数名:変数、変数1、a、x
- メッセージ名:メッセージ1、メッセージ2
// 機能の説明
緑の旗がクリックされたとき
// ゲーム初期化
スコア を 0 にする
ライフ を 3 にする
// プレイヤー位置設定
x座標を 0 にする
y座標を -150 にする
// ゲーム開始通知
"ゲーム開始!" と 2 秒言う
// 機能ごとにスクリプトを分割
// スクリプト1:初期化
緑の旗がクリックされたとき
[初期化] を送る
// スクリプト2:初期化処理
[初期化] を受け取ったとき
スコア を 0 にする
ライフ を 3 にする
x座標を 0 にする
y座標を 0 にする
[ゲーム開始] を送る
// スクリプト3:ゲーム開始
[ゲーム開始] を受け取ったとき
"ゲーム開始!" と 2 秒言う
[プレイヤー操作開始] を送る
[敵生成開始] を送る
// 境界チェック
ずっと
もし <x座標 > 240> なら
x座標を 240 にする
終わり
もし <x座標 < -240> なら
x座標を -240 にする
終わり
もし <y座標 > 180> なら
y座標を 180 にする
終わり
もし <y座標 < -180> なら
y座標を -180 にする
終わり
終わり
// 値の範囲チェック
もし <ライフ < 0> なら
ライフ を 0 にする
終わり
もし <ライフ > 最大ライフ> なら
ライフ を 最大ライフ にする
終わり

メッセージを使って、異なるスプライトやスクリプト間で情報を伝達します。

// 送信側(プレイヤー)
もし <[敵] に触れた> なら
[プレイヤーダメージ] を送る
終わり
// 受信側(UI管理)
[プレイヤーダメージ] を受け取ったとき
ライフ を -1 ずつ変える
[ライフ更新] を送る
// 受信側(ライフ表示)
[ライフ更新] を受け取ったとき
コスチュームを "ライフ" と ライフ をつなげたものにする

グローバル変数を使って、すべてのスプライトで共有する情報を管理します。

// ゲーム状態管理
緑の旗がクリックされたとき
ゲーム状態 を "メニュー" にする
// 各スプライトでの状態チェック
ずっと
もし <ゲーム状態 = "プレイ中"> なら
// ゲーム中の処理
終わり
もし <ゲーム状態 = "ポーズ"> なら
// ポーズ中の処理
終わり
もし <ゲーム状態 = "ゲームオーバー"> なら
// ゲームオーバー処理
終わり
終わり

状態機械は、オブジェクトの状態を管理し、状態に応じて異なる動作を実行する仕組みです。

// 敵キャラクターの状態管理
緑の旗がクリックされたとき
敵の状態 を "巡回" にする
ずっと
もし <敵の状態 = "巡回"> なら
// 巡回動作
10 歩動かす
もし <端に着いた> なら
180 度回す
終わり
// プレイヤー発見チェック
もし <[プレイヤー] までの距離 < 100> なら
敵の状態 を "追跡" にする
終わり
終わり
もし <敵の状態 = "追跡"> なら
// 追跡動作
[プレイヤー] に向ける
15 歩動かす
// 攻撃範囲チェック
もし <[プレイヤー] までの距離 < 30> なら
敵の状態 を "攻撃" にする
終わり
// 見失いチェック
もし <[プレイヤー] までの距離 > 200> なら
敵の状態 を "巡回" にする
終わり
終わり
もし <敵の状態 = "攻撃"> なら
// 攻撃動作
"攻撃!" と 1 秒言う
[プレイヤーダメージ] を送る
1 秒待つ
敵の状態 を "追跡" にする
終わり
終わり
// ❌ 非効率な例
ずっと
もし <マウスが押された> なら
// 重い処理
1000 回繰り返す
計算処理
終わり
終わり
終わり
// ✅ 効率的な例
マウスがクリックされたとき
// 重い処理
1000 回繰り返す
計算処理
終わり
// ❌ CPU負荷が高い
ずっと
位置チェック
衝突判定
// 待機なし
終わり
// ✅ 適度な負荷
ずっと
位置チェック
衝突判定
0.01 秒待つ // 適度な待機
終わり
// ❌ 複雑な条件
もし <<<x座標 > 100> かつ <x座標 < 200>> かつ <<y座標 > 50> かつ <y座標 < 150>>> なら
処理
終わり
// ✅ 段階的チェック
もし <x座標 > 100> なら
もし <x座標 < 200> なら
もし <y座標 > 50> なら
もし <y座標 < 150> なら
処理
終わり
終わり
終わり
終わり

クローンを使って、動的にオブジェクトを生成・管理します。

// 弾丸生成システム
スペース キーが押されたとき
自分自身のクローンを作る
クローンされたとき
向きを 0 度にする
y座標を プレイヤーのy座標 + 50 にする
x座標を プレイヤーのx座標 にする
ずっと
10 歩動かす
もし <y座標 > 180> なら
このクローンを削除する
終わり
もし <[敵] に触れた> なら
[敵撃破] を送る
このクローンを削除する
終わり
終わり
// 敵生成システム
緑の旗がクリックされたとき
ずっと
[1] から [3] までの乱数 秒待つ
自分自身のクローンを作る
終わり
クローンされたとき
x座標を [-200] から [200] までの乱数 にする
y座標を 180 にする
敵HP を 3 にする
ずっと
y座標を -3 ずつ変える
もし <y座標 < -180> なら
このクローンを削除する
終わり
もし <敵HP < 1> なら
[爆発エフェクト] を送る
このクローンを削除する
終わり
終わり

デバッグとトラブルシューティング

Section titled “デバッグとトラブルシューティング”

原因と解決方法:

🔍 チェック項目:
• ハットブロックが正しく設定されているか
• ブロック同士が正しく接続されているか
• 条件ブロックの論理が正しいか
• 変数が正しく初期化されているか
🛠️ デバッグ方法:
• 「○と言う」ブロックで動作確認
• 変数の値を画面に表示
• 段階的にブロックを追加してテスト

原因と解決方法:

🚨 症状:
• プログラムが応答しなくなる
• 他の操作ができない
• パフォーマンスが低下
🛠️ 解決方法:
• 赤い停止ボタンをクリック
• ループ内に適切な待機時間を追加
• ループの終了条件を確認
• 「すべてを止める」ブロックの追加

原因と解決方法:

🔍 確認項目:
• 変数の初期化タイミング
• 変数の更新箇所
• グローバル/ローカル変数の区別
• 複数のスクリプトでの同時更新
🛠️ デバッグ方法:
• 変数を画面に表示
• 更新時に音を鳴らす
• ログ用の変数で履歴を記録
// 位置確認
"X: " と x座標 と " Y: " と y座標 をつなげたものを言う
// 変数確認
"スコア: " と スコア と " ライフ: " と ライフ をつなげたものを言う
// 条件確認
もし <条件> なら
"条件が真です" と言う
でなければ
"条件が偽です" と言う
終わり
// 関数の開始/終了確認
[関数開始] を受け取ったとき
"関数開始" と言う
// 処理内容
"関数終了" と言う
// ループ回数確認
カウンター を 0 にする
10 回繰り返す
カウンター を 1 ずつ変える
"ループ" と カウンター をつなげたものを言う
終わり
// 処理時間測定
タイマーをリセット
// 測定したい処理
"処理時間: " と タイマー をつなげたものを言う
// フレームレート確認
フレームカウンター を 0 にする
ずっと
フレームカウンター を 1 ずつ変える
もし <タイマー > 1> なら
"FPS: " と フレームカウンター をつなげたものを言う
フレームカウンター を 0 にする
タイマーをリセット
終わり
終わり
🎮 ゲームプレイ関連:
• プレイヤー
• 敵キャラクター
• アイテム
• 弾丸
🎨 UI関連:
• スコア表示
• ライフ表示
• メニュー
• ボタン
🎪 背景・演出関連:
• ステージ背景
• エフェクト
• パーティクル
🚀 初期化スクリプト:
• ゲーム開始時の設定
• 変数の初期化
• スプライトの配置
🎮 メインゲームループ:
• プレイヤー操作
• 敵の動作
• 衝突判定
🎯 イベント処理:
• アイテム取得
• レベルアップ
• ゲームオーバー
🎨 演出・エフェクト:
• アニメーション
• 音響効果
• 視覚効果
// 機能の説明
緑の旗がクリックされたとき
// === ゲーム初期化 ===
スコア を 0 にする // スコアリセット
ライフ を 3 にする // 初期ライフ設定
// === プレイヤー配置 ===
x座標を 0 にする // 中央配置
y座標を -150 にする // 下部配置
向きを 90 度にする // 上向き
// === ゲーム開始 ===
"ゲーム開始!" と 2 秒言う
[ゲームループ開始] を送る

2. 変数・メッセージの命名規則

Section titled “2. 変数・メッセージの命名規則”
✅ 良い命名例:
変数:プレイヤーHP、敵の速度、ゲーム時間、最高スコア
メッセージ:ゲーム開始、レベルクリア、ボス出現、アイテム取得
❌ 悪い命名例:
変数:変数1、a、temp、x
メッセージ:メッセージ1、msg、event

1. プロジェクトのバックアップ

Section titled “1. プロジェクトのバックアップ”
📅 定期的なバックアップ:
• 重要な機能追加後
• 大きな変更前
• 作業終了時
📁 バックアップの命名:
• プロジェクト名_v1.0_基本機能
• プロジェクト名_v1.1_敵追加
• プロジェクト名_v2.0_レベルシステム
📝 変更ログの例:
v1.0 (2024/01/01)
- 基本的なプレイヤー操作を実装
- 敵キャラクターの基本動作を追加
- スコアシステムを実装
v1.1 (2024/01/05)
- 敵の種類を3種類に増加
- アイテムシステムを追加
- 音響効果を改善
v2.0 (2024/01/10)
- レベルシステムを実装
- ボスキャラクターを追加
- セーブ機能を実装

ブロックとスクリプトは、Scratchプログラミングの基盤となる重要な概念です。効果的なスクリプト作成のためには:

  1. ブロックの理解:各ブロックの機能と使用方法を正確に把握
  2. 構造化思考:複雑な処理を小さな部分に分解
  3. パターンの活用:よく使われるスクリプトパターンの習得
  4. デバッグスキル:問題を特定し解決する能力
  5. 保守性:読みやすく修正しやすいコードの作成
📚 基礎固め:基本的なブロックの組み合わせを繰り返し練習
🎮 実践応用:様々なプロジェクトで実際にスクリプトを作成
🤝 コミュニティ:他の学習者の作品を参考に学習
🔄 改善継続:作成したスクリプトを定期的に見直し改善

ブロックとスクリプトをマスターすることで、あなたの創造性を自由に表現できるようになります。継続的な練習と実験を通じて、より高度で効率的なプログラムを作成していきましょう! 🌟