【スクラッチ】715ブロックで作る「ぷよぷよ風パズルゲーム」最終回(全3回)

2023年9月22日金曜日

Scratch スクラッチ ぷよぷよ プログラミング

t f B! P L

 【スクラッチ】715ブロックで作る「ぷよぷよ風パズルゲーム」最終回(全3回)







YouTube解説動画

↓この動画の解説をします。(より詳しく)






前回の第2回(←リンク)に引き続きスクラッチプログラミングによる「ぷよぷよ風パズルゲーム」の作り方を説明します。

今回の第3回では操作した玉の位置が確定した後の自動処理(玉消し、自然落下、連鎖)とボーナス演出、得点計算部分を作りゲームを完成させます。

第3回でコードに使用するブロックは419~715ブロックになります。

今回で最終回になります。



はじめに


スクラッチプロジェクトへのリンク





動画解説のYouTubeリンク






第1回でやること


・プロジェクトの新規作成
・ゲームスタート画面、ゲームオーバー画面の作成と遷移
・「盤面」「画面」「玉」スプライトの絵を描く
・次に出る玉(2回分)の表示
・盤面に玉を出して支点を点滅させる



第2回でやること


・「左」「右」「下」「時計回り」スプライトの絵を描く
・操作中の玉を下に下げる(落下加速)
・操作中の玉の左右移動
・操作中の玉を回転させる
・配置位置の確定(自然落下はしない)



第3回でやること(今回)


・玉を自然落下させる
・同じ4玉以上がつながった玉を消す
・連鎖、全消しの演出
・得点計算
・ゲーム終了演出
・背景を変更
・BGMを設定



ここからの解説は、YouTubeの動画に沿って進めていきます。
動画よりも詳しい説明が書かれているので、解説動画で分からないところがあればこちらも参考にしてみてください。


このゲームの全体のフローです。




今回は↓の部分を作ります。




最終回なので簡単な状態遷移図も載せておきます。







Step3-1:「玉」を自然落下させる(まだ消えない)


動画:0:19




2つの玉がそれぞれ下にぶつかるまで下がります。
この時点では同じ色が4玉つながっていても玉は消えません



「盤面」スプライトのコードを編集します。





「盤面」スプライトに新しく作る変数


自然落下終了(このスプライトのみ)



「旗が押されたとき」ブロックの「操作中ループ」の下に次のブロックを追加します。



「(自然落下終了)を(いいえ)にする」
(自然落下終了)はいまで繰り返す」
    ※自動中のループの中身は後ほど追加します




「盤面」スプライトに追加する新しいブロック定義


「自動中:落下_下に詰める」  
※画面を再描画せずに実行する:チェックなし



新しいメッセージ


「自然落下」
「落ちたマスをリストから消す」
「落ちた後のマスをリストに追加」

これら3つのメッセージの処理は、あとで「玉」スプライトに作ります。



「自動中:落下_下に詰める」 ブロックにコードを追加します



「(自然落下)を送って待つ」
「(落ちたマスをリストから消す)を送って待つ」
「(落ちた後のマスをリストに追加)を送って待つ」


メッセージの順番を間違えないようにしましょう。
簡単に説明すると、

自然落下:

自分の位置より下にある空のマス数分見た目(座標)を移動します。
リスト内の位置は落下前(ぶつかったところ)のままです。
※消える処理が入ると、同時に他の玉も移動します


落ちたマスをリストから消す:

見た目(座標)が移動した玉のリスト内の位置(落下前)を消します。
※同時に落下した玉も同じ処理をします


落ちた後のマをリストに追加:

落下した玉の落下後の位置をリストに追加します。
※同時に落下した玉も同じ処理をします






先ほど作った「自動中ループ」の中にコードを追加します。







「玉」スプライトのコードを編集します。




コードの一番下に移動します。


「(自然落下)を受け取ったとき」ブロックの処理


※この処理は配置されている全ての「玉」スプライトで処理されます

現在の位置から下のマスを全て調べます。
玉が置かれていないマスを数えて、そのマスの高さ分下に座標をずらします。
この時、リスト内の位置は変えません。


例:下の4マスが空いている場合(落ちるマスの数=4)




「玉」スプライトに新しく追加する変数


落ちるマスの数(このスプライトのみ)
落検索Y(このスプライトのみ)



■「(自然落下)を受け取ったとき」ブロックのコード





「もし<(落ちるマスの数)>0>なら」ブロックより上で、玉の落ちるマスを数えています。
その後、玉を0.05秒で目的の位置まで移動させています。
※1マスの高さは24です

見た目(座標)だけ移動しているので、リスト内の位置は落下前のままです。


なぜリスト内の位置を変えないのかというと、同じ色がつながって消えた後は同時に複数の玉が落下することになります。
「(自然落下)を受け取ったとき」の処理は全ての「玉」スプライトで処理されますが順番は決まっていません。

現在の位置より下のマスを調べるときに「玉X_Yリスト」を使うので、このリスト内の情報が変わると後で処理される玉が正しく動かなくなる可能性があるからです。

そのため、「全部の玉の見た目移動」→「全部の玉のリスト位置消す」→「全部の玉の落下後の位置をリストに追加」の順番でメッセージを処理することになります。




「(落ちたマスをリストから消す)を受け取ったとき」ブロックの処理


全ての「玉」スプライトの見た目(座標)の移動が終わってから、落下前の配置位置をリストから削除します。




「玉X_Yリスト」「玉色X_Yリスト」の両方のリストから削除します。



「玉」スプライトに新しく追加するブロック定義


「配置リストから削除」  
※画面を再描画せずに実行する:チェックする





■「(落ちたマスをリストから消す)を受け取ったとき」ブロックのコード






「(落ちた後のマスをリストに追加)を受け取ったとき」ブロックの処理


配置位置(変数:配置位置Y)を「落ちたマスの数」だけ下に変更してリストに追加します。
※下に移動するだけなので配置位置Xは変わりません



「玉X_Yリスト」「玉色X_Yリスト」の両方のリストへ追加します。



■「(落ちた後のマスをリストに追加)を受け取ったとき」ブロックのコード





これで「玉」が自然落下する処理は完成です。

実行して確認してみてください。
リストの表示をONにしておくと動きが分かりやすいかもしれません。
(速すぎてみえないかも、、、)





Step3-2:「玉」が4つ以上つながったら消す処理をつくる


動画:14:16



このステップがぷよぷよ風パズルの一番のキモになります。
再帰処理(再帰呼び出し)」という少し難しいアルゴリズムを使うので最初は「へぇ~」と流して無心でコピペしてください。

このブログでも概要を説明しますが、詳しく理解したい場合は「再帰処理 説明」などでググると参考になるサイトがたくさん出てきます。




「盤面」スプライトのコードを編集します。




コード編集画面で一番下に移動してください。


■つながりを調べる最初の「玉」を決める
つながりを調べるためには起点となる最初の玉を決める必要があります。
シンプルに「左下から順番に全てのマスを調べて玉が置かれていれば起点とする」という方法にしました。

※少し効率が悪いですがコードが複雑にならないように「全部調べる」という力業で処理しました







「盤面」スプライトに新しく作る変数


横列(このスプライトのみ)
縦列(このスプライトのみ)
連結色(このスプライトのみ)
色X_Y(このスプライトのみ)



「盤面」スプライトに追加する新しいリスト


消える玉リスト(すべてのスプライト用)※「玉」でも使います
連結リスト(このスプライトのみ)



「盤面」スプライトに追加する新しいブロック定義


「自動中:消去_消える玉をチェック」  
※画面を再描画せずに実行する:チェックする

「自動中:消去_連結チェック」  
※画面を再描画せずに実行する:チェックする

「自動中:消去_再帰で連結探索(X)(Y)」  
※画面を再描画せずに実行する:チェックする



順番にコードの説明をしていきます。



■「自動中:消去_消える玉をチェック」  ブロックのコード



このブロックの処理が全て終わった後には「消える玉リスト」の中には削除する玉の「色X_Y」情報が入ります。


「連結色」(赤黄緑青紫)を取り出すところの説明です。





マスに玉が置かれていない場合は「連結色」は空になります。






■「自動中:消去_連結チェック」 ブロックのコード




このブロック内の動きについて細かく説明していきます。

このブロックが呼び出される時点で、起点となる玉の位置(横列、縦列)と色が決まっています。
「連結リスト」の中身を全て削除してから「自動中:消去_再帰で連結探索」ブロックを呼び出して戻ってくると、「連結リスト」の中にはつながった玉の「色X_Y」が追加されています。


「自動中:消去_再帰で連結探索」ブロックは再起処理を行います。
(ブロック内で自分自身を呼び出しています)

再帰処理中に対象の色は変わらないので引数として渡していません。
引数の横列、縦列は調べるマスの位置へ変えながら呼び出されます。


探索の結果、「連結リスト」に入る情報の例が下の図です。



「玉」が消える条件は「同じ色の玉が4つ以上つながった場合」になるので、「連結リスト」の中身の数(長さ)が3よりも大きい(4以上)の場合に「消える玉リスト」へ「連結リスト」の中身を全て追加します。

※既に「消える玉リスト」に入っている玉は「連結リスト」に入らないようにしています(再帰処理のブロックで説明します)




■「自動中:消去_再帰で連結探索(X)(Y)」ブロックのコード



つながる対象の玉情報(=色X_Y)を作ります。
その情報が「玉色X_Yリスト」に存在する(X、Yのマスに置かれている)場合は「連結リスト」に情報を追加します。
(起点が空のマスは色X_Y変数が「X_Y」になるので絶対に一致せずここで排除されます)

この時、既に「連結リスト」や「消える玉リスト」に追加済みであればスキップします。

「連結リスト」に追加された場合は、調べるマスの位置をずらして「自動中:消去_再帰で連結探索」ブロックを呼び出し(再帰処理)、これを繰り返します。

今回は「↑→↓←」の順で探索するようにしました。




上の画像の配置で「起点」から探索する例の場合は、

「起点」は必ず同じ色なのでリストに追加する。
「起点」の上(X,Y+1)の位置へ再帰。
は同じ色なのでリストに追加する。
①の上へ再帰。
①の上も同じ色なのでリストに追加する。
①の2つ上へ再帰。
①の2つ上は同じ色ではないのでスキップされ①の上に戻る。

①の上から右の位置(X+1,Y)へ再帰。
①の上から右は同じ色でないでスキップされ①の上に戻る。
①の上から下の位置(X,Y+1)へ再帰。
①の上から下は同じ色だが既にリストに追加済みなのでスキップされ①の上に戻る。
①の上から左の位置(X-1,Y)へ再帰。
①の上から左は同じ色でないでスキップされ①の上に戻る。
①の上では上右下左を調べ終わったのでへ戻る。

①の右へ再帰。
①の右は同じ色でないのでスキップされへ戻る。
①のへ再帰。
①のは同じ色だが既にリストに追加済みなのでスキップされへ戻る
①のへ再帰。
①の左は同じ色でないのでスキップされへ戻る。
では上右下左を調べ終わったので「起点」へ戻る。

「起点」の右(②)へ再帰。
は同じ色なのでリストに追加する。
②の上へ再帰。
②の上は同じ色でないのでスキップされへ戻る。
②の右へ再帰。
②の右は同じ色でないのでスキップされへ戻る。
②のへ再帰。
②の下は同じ色でないのでスキップされへ戻る。
②の左へ再帰。
②の左は同じ色だが既にリストに追加済みなのでスキップされに戻る。
では上右下左を調べ終わったので「起点」へ戻る。

「起点」の下(へ再帰。
は同じ色でないのでスキップされ「起点」に戻る。
「起点」の左(へ再帰。
は同じ色でないのでスキップされ「起点」に戻る。
「起点」で上右下左を調べ終わったので探索終了


以上の結果、下の図の順番で「連結リスト」に情報が追加されます。



この探索処理を全てのマスを順番に「起点」にして繰り返します。

これで「つながった同じ色の玉を調べる処理」は完成しました。

次に「自動中のループ」へ玉を消す処理を追加していきます。



新しいメッセージ


「玉を消す」



■「自動中のループ」に追加するコード




先ほど作った「自動中:消去_消える玉をチェック」ブロックを追加して「消える玉リスト」に消す玉の情報が入るようにします。
「玉を消す」メッセージは「玉」スプライトで処理されます。(後で説明)

「消える玉リスト」に情報が無い(玉が消えない)場合は「自然落下終了=はい」にして「自動中のループ」を終了します。

「消える玉リスト」に情報があり「玉」が消えた場合は、もう一度「自然落下」→「玉を消す」処理を繰り返します。
これにより連鎖が発生することになります。

「~でなければ」の中には後で連鎖や得点関連の処理が追加されるので今は空にしておきます。

これで玉を消すための「盤面」スプライトのコードは終了です。




次に、「玉」スプライトのコードを編集します。




「玉を消す」メッセージの処理を追加します。
「消える玉リスト」にそれぞれクローンされた「玉」自身の情報があれば消える演出をした後、自身を削除します(このクローンを削除)



コード編集の一番下へ移動してください。


■「(玉を消す)を受け取ったとき」ブロックのコード




自身の情報(玉色X_Y)が「消える玉リスト」に存在していれば、リストから自身の「玉」情報を削除して明るさを最大(真っ白)で0.3秒経過した後に「このクローンを削除する」ブロックで自身を削除します。


これで、「同じ色が4つ以上つながった玉を消す」処理が完成しました。
結果的に連鎖も完成しています。





Step3-3:「連鎖数」を数えて「連鎖演出」を作る


動画:32:45



※SEも入ります




「盤面」スプライトのコードを編集します。




「旗が押されたとき」ブロックの「自動中のループ」へ移動してください。


新しく作る変数


g_連鎖数(すべてのスプライト用)
g_連鎖X(すべてのスプライト用)
g_連鎖Y(すべてのスプライト用)



新しいメッセージ


「連鎖を演出」




■「旗が押されたとき」ブロックの「自動中のループ」に追加するコード

連鎖数をカウントします。
「〇れんさ」の文字をだす座標の変数を初期化しておきます。
(座標は「玉」スプライトで設定されます)



「g_連鎖Y」の初期値を-1000にしているのは、消えた玉のなかで一番上にある座標を判定するためです。
(g_連鎖Yより消えた「玉」のy座標が大きければ入れ替える)

「連鎖を演出」メッセージの処理は新しく作る演出用のスプライトで処理されます。




次に、「玉」スプライトのコードを編集します。



「玉を消す」メッセージの処理で自身が削除されるときに、連鎖演出用の座標(「〇れんさ」文字がでる位置)を設定します。(より上の座標で更新)



■「(玉を消す)を受け取ったとき」ブロックに追加するコード



「このクローンを削除する」の前に表示座標を判定して更新しています。



連鎖演出用の新しいスプライトを作ります。


新しいスプライト:「連鎖」


スプライトの名前:「連鎖」

「コード」「コスチューム」「音」をそれぞれ追加します。



■「連鎖」スプライトに「〇れんさ」文字のコスチュームを作る

コスチューム名は「れんさ1」~「れんさ19」にしましたが何でも構いません。
数字の部分は半角にすると複製するときに自動で連番してくれます。
(コスチュームの指定は番号でおこないます)

絵は連鎖数に合わせて好きなものを描いてください。
(今回は文字だけで中央合わせしました)
(動画での説明はこちら






■「連鎖」スプライトに「音」を追加する

1連鎖~6連鎖までは個別の音を設定しています。
いい音がなかったので7連鎖以降は同じ音「Goal Cheer」を鳴らしてごまかしています。
プログラムを少し変えれば19連鎖を別々の音にすることもできます。(後で説明します)

音は好きなように作って大丈夫です。
音の名前は何でも構いません。(番号で呼び出すため)




今回は次の音を選びました。

1連鎖:「Hey」
2連鎖:「Ya」
3連鎖:「Scream」
4連鎖:「Laugh1」
5連鎖:「Laugh2」
6連鎖:「Laugh3」
7連鎖以降:「Goal Cheer」





■「連鎖」スプライトに連鎖演出のコードを追加する

(動画の説明はこちら


「(スタート画面)を受け取ったとき」ブロックで開始時の表示をOFFにします。





「(連鎖を演出)を受け取ったとき」ブロックのコードを作ります。



表示座標(g_連鎖X、g_連鎖Y)は「玉」スプライトの「玉を消す」メッセージで設定されています。
連鎖数は「盤面」スプライトでカウント済みの値です。

表示した後、上に移動しながら「幽霊」の効果をつかってゆっくり消えるようにしました。

「~の音を鳴らす」ブロックの条件文を変えれば7連鎖以降の音も個別に鳴らすことができます。
(19連鎖分の音を追加した場合は「もし~なら、でなければ」ブロックを消して「(g_連鎖数)の音を鳴らす」ブロックだけにしてください)


これで連鎖演出は完成です。






Step3-4:「全消し」演出を作る


動画:42:00


※SEも入ります



「盤面」スプライトのコードを編集します。




新しいメッセージ


「全消し演出」




■「盤面」スプライトのコードに全消し演出用のコードを追加する

「旗が押されたとき」ブロックの「自動中のループ」にある「(連鎖を演出)を送る」ブロックの下に、次のコードを追加します。




盤面に置かれている玉が全て無くなった(玉色X_Yリストが空)場合に「全消し演出」のメッセージを送ります。





連鎖演出用の新しいスプライトを作ります。


新しいスプライト:「全消し」




スプライトの名前:「全消し」

「コード」「コスチューム」「音」をそれぞれ追加します。



■「全消し」スプライトにコスチュームを作る



この一つだけです。
コスチューム名は何でも構いません。
絵も好きに描いてください。



■「全消し」スプライトに「音」を追加する



この一つだけです。
好きな音を作っても構いません。

今回は「Connect」を使いました。





■「全消し」スプライトに連鎖演出のコードを追加する

(動画の説明はこちら



「(スタート画面)を受け取ったとき」ブロックで開始時の表示をOFFにします。





「(全消し演出)を受け取ったとき」ブロックのコードを作ります。





表示位置は「盤面」スプライトの中心(よりちょっと上)にするため、「盤面」の座標を調べて使います。

あとは「連鎖の演出」とほぼ同じです。

これで「全消し演出」は完成です。







Step3-5:得点計算を作る(変数の初期化)


動画:47:41


各種の得点計算処理を作るために、得点用の変数を作って初期化します。



「盤面」スプライトのコードを編集します。




新しく作る変数


得点(すべてのスプライト用)
※「得点」変数は画面に表示するためグローバル変数でも「g_」を付けません

ボーナス点数(このスプライトのみ)


「得点」変数はゲーム中に獲得した累計点数になります(画面に表示)
「ボーナス点数」は玉を消すターン毎に獲得した追加ポイントになります。
この「ボーナス点数」を元に加算される得点が算出されます。
※全消しの点数は直接付与です



得点の算出方法

■ 玉が消えたときだけ得点計算を行う。

ボーナス点数 = 連鎖ボーナス + 連結ボーナス + 色数ボーナス

得点 = 消えた玉数 × ボーナス点数 × 10

※ただし、ボーナス点数が0の場合は、得点に+40する

※全消しボーナスは、得点に+3600する





■「盤面」スプライトに得点用の変数を初期化するコードを追加する

「得点」変数を初期化します。
「初期化:スタート時」ブロックに「(得点)を(0)にする」ブロックを追加。

ゲーム開始時に初期化されます。





「ボーナス点数」変数を初期化します。
「自動中:消去_消える玉をチェック」ブロックに「(ボーナス点数)を(0)にする」ブロックを追加します。

「ボーナス点数」変数は、玉を消すターン毎に初期化されます。





次に実際に得点を加算していきます。





Step3-6:【得点計算】連鎖ボーナスを作る


動画:49:22


「連鎖ボーナス」の得点処理を追加します。
「連鎖ボーナス」は連鎖数に応じて「ボーナス点数」が算出されます。

下の図が算出表です。



連鎖数に対して加算される法則があります。

3連鎖までは、「(連鎖数ー1)× 8」
4連鎖以降は、「(連鎖数ー3)×32」

この法則でコードを作っていきます。



「盤面」スプライトのコードを編集します。



コード編集の一番下に移動してください。


「盤面」スプライトに追加する新しいブロック定義


「得点:ボーナス_連鎖(連鎖数)」  
※画面を再描画せずに実行する:チェックする

「得点:計算」  
※画面を再描画せずに実行する:チェックする

順番に説明します。



■「盤面」スプライトに「得点:ボーナス_連鎖」ブロックを追加する

「連鎖数」で獲得できる「ボーナス点数」を算出します。



連鎖数に対するボーナス点数表のとおりになるように作ります。

3連鎖までは、「(連鎖数ー1)× 8」
4連鎖以降は、「(連鎖数ー3)×32」



「盤面」スプライトに「得点:得点」ブロックを追加する

「連鎖数ボーナス」のところだけ作ります。
※他の点数処理もあとで追加していきます




得点 = 消えた玉数 × ボーナス点数 × 10
※ただし、ボーナス点数が0の場合は、得点に+40する




■「盤面」スプライトの「自動中ループ」に得点計算のコードを追加する

「(g_連鎖数)を(1)ずつ変える」ブロックの下に「得点:計算」ブロックを追加します。



玉が消えたときだけ(最低でも1連鎖)得点計算を行います。


実際に連鎖をして動きを見てみましょう。


<2連鎖(4玉→4玉で消した)の場合>

1連鎖目:+40点
「ボーナス点数=0」「消えた玉数=4」です。
そのままだと0点なので、得点に+40をしています。

2連鎖目:+320点
「ボーナス点数=8」「消えた玉数=4」です。
「4×8×10=320」になります。

合計で360点になります。
※連鎖ボーナスだけの計算になります


連鎖ボーナスが完成しました。





Step3-7:【得点計算】連結ボーナスを作る


動画:56:12

「連結ボーナス」は同じ色の玉がつながった数によって獲得できる得点です。

つながった玉の数によるボーナス点数表は下の図です。



次の法則で算出されます。

4玉以下=0
11玉以上=10
5玉~10玉=玉数-3




例えば下図のように5玉が消えた場合、



連結数=5 なので「ボーナス点数=2」を獲得します。

また、同時に違う色を消した場合、
(例:5連結の青玉と5連結の赤玉)

青玉の連結ボーナス=2
赤玉の連結ボーナス=2

なので、「ボーナス点数=2+2=4」を獲得します。

※同じ色を2か所で消しても(赤5連結、赤6連結など)別々に連結ボーナスを算出して加算されます




「盤面」スプライトのコードを編集します。



コード編集の一番下に移動してください。


「盤面」スプライトに追加する新しいブロック定義


「得点:ボーナス_連結(連結数)」  
※画面を再描画せずに実行する:チェックする



■「盤面」スプライトに「得点:ボーナス_連結」ブロックを追加する

連結数に対するボーナス点数を算出する処理を作ります。





これで連結ボーナスの点数が加算されます。
この連結ボーナスは「連結をチェックする毎」に判定する必要があります。
そのため、「自動中:消去_連結チェック」ブロックにこのブロックを追加します。



■「盤面」スプライトの「自動中:消去_連結チェック」ブロックへコードを追加する



連結数は「連結リストの長さ」(つながった玉数)になります。

これで「連結ボーナス」もボーナス点数へ加算されるようになりました。

実際に動かして確認しましょう。


例えば下図のように「1連鎖で5玉を消した」場合、



連結ボーナス = 2(5連結)
連鎖ボーナス = 0(1連鎖)

なので、ボーナス点数 = 2
消えた玉数 = 5


得点の算出方法

■ 玉が消えたときだけ得点計算を行う。

ボーナス点数 = 連鎖ボーナス + 連結ボーナス + 色数ボーナス

得点 = 消えた玉数 × ボーナス点数 × 10

※ただし、ボーナス点数が0の場合は、得点に+40する

※全消しボーナスは、得点に+3600する


得点 = 5 × 2 × 10 = 100

100点が加算されます。


この後、さらに2連鎖目が発生します。
(「2れんさ」文字は少し遅れてでてます)



連結ボーナス = 2(5連結)
連鎖ボーナス = 8(2連鎖)

なので、ボーナス点数 = 10
消えた玉数 = 5

得点 = 5 × 10 × 10 = 500

500点が加算されます。
※動画では説明部分で点数間違えてました、、、

結果、2連鎖で600点を獲得しました。






Step3-8:【得点計算】色数ボーナスを作る


動画:59:46


「色数ボーナス」は同時に消した玉の色の数で獲得できる得点です。

色数とボーナス得点の算出表は数のとおりです。




次の法則で算出されます。

1色の場合は0
2色以上の場合は次の公式に当てはめる

「ボーナス得点 = 3 × 2のn-1乗」
※n=色数

累乗の計算はスクラッチだと工夫する必要があります。(後ほど説明)
※公式を使わずに条件分岐でつくっても構いません




「盤面」スプライトのコードを編集します。





新しく作るリスト


同時消し色リスト(このスプライトのみ)




「盤面」スプライトに追加する新しいブロック定義


「得点:ボーナス_色数(色数)」  
※画面を再描画せずに実行する:チェックする




■「自動中:消去_消える玉をチェック」ブロックで「同時消し色リスト」を初期する

「同時消し色リスト」は「玉が消えるターン毎」に数えます。




次に、「同時消し色リスト」に追加する処理を作ります。



■「自動中:消去_連結チェック」ブロックにコードを追加する

「玉」が4玉以上つながって消えるところで、その時の色(赤黄緑青紫)をリストに追加します。
このとき、既に同じ色が追加されている場合はスキップします。



「同時消し色リスト」の長さ = 同時に消えた玉の色数 になりました。




■「盤面」スプライトに「得点:ボーナス_色数」ブロックを追加する

同時に消えた色数に対するボーナス点数を算出する処理を作ります。



色数が2以上のときにボーナス点数を加算します。

利用する公式「3 × 2のn-1乗」をスクラッチ用に変換すると次のようになります。

ボーナス点数=「3*((((色数-2)*(2 の log)) の 10^) を四捨五入)」



もしくは、玉の色は5種類しかないので下記のように条件分岐で作っても構いません。



どちらか好きな方を使ってください。
(公式はブロック数を減らすための苦肉の策でした)


最後に、得点へ反映させます。




■「得点:計算」ブロックに色数ボーナスを加算する処理を追加する



「同時消し色リスト」の長さ = 同時に消えた玉の色数 です。


これで色数ボーナスができました。

実行して確認してみましょう。


例として下図のように緑と紫を同時に消します。



連結数ボーナス = 4玉と4玉 = 0
連鎖数ボーナス = 1連鎖 = 0
色数ボーナス = 緑と紫の2色 = 3

結果:
ボーナス点数 = 3
消えた玉数 = 8

得点計算:
得点 = 8 × 3 × 10 = 240

240点が得点に加算されました。







Step3-9:【得点計算】全消しボーナスを作る


動画:1:05:36


「全消しボーナス」は盤面上からすべての玉を消すと発生します。
得点は3600点です。




「全消し演出」のときに全消し判定はできているので、得点を加算するコードを追加するだけです。



「盤面」スプライトのコードを編集します。



「旗が押されたとき」ブロックの「(全消し演出)を送る」ブロックのところへ移動してください。



■「盤面」スプライトの「旗が押されたとき」ブロックの全消し判定部分にコードを追加する



これで全消しボーナスは完成です。


確認するのは大変なので出現する玉数を一時的に減らします。


「玉」スプライトにある「クローンされたとき」ブロックを編集します。




1色の玉しかでないので簡単に全消しできると思います。



連結ボーナス = 4玉 = 0
連鎖ボーナス = 1連鎖 = 0
色数ボーナス = 1色 = 0

結果:
ボーナス点数 = 0
消えた玉数 = 4

得点計算:
ボーナス点数が0なので+40
全消しボーナス = 3600

合計 = 40 + 3600 = 3640点

得点に3640点が加算されました。


「クローンされたとき」ブロックの値を元に戻しておきましょう。






Step3-10:「ゲーム終了演出」を作る


動画:1:07:08


盤面の「×」印のところに玉が置かれるとゲームオーバーです。
ゲームオーバーになると配置された全部の玉が下に沈んで「ばたんきゅー」の文字が表示されます。
その後、ゲーム開始画面へ戻ります。





まずは「盤面」スプライトにゲーム終了演出を呼び出すコードを追加します。



「盤面」スプライトのコードを編集します。





新しいメッセージ


「全部の玉が落下」



■「盤面」スプライトの「旗が押されたとき」ブロックにコードを追加する

「旗が押されたとき」ブロックの一番下にある「(ゲームオーバー画面)を送って待つ」ブロックの上に追加します。




ゲームオーバーが確定した後、1秒待って終了演出が始まります。




次に、「玉」スプライトのコードを編集します。



一番下に移動します。



■「玉」スプライトに「(全部の玉が落下)を受け取ったとき」ブロックを追加します

配置されている全部の「玉」がそれぞれ下に落下して消えていきます。





現在のマスYの位置からY=-1のマス位置まで下げます。
1マスを4回で移動します(6ずつ下げる)

Y=-1のマス位置から「幽霊の効果」を使って消え始めます。





①に配置されていた「玉」は③の位置まで落下して消えます。
②の位置から「幽霊の効果」で消え始めます。



「背景」の絵を変更します



「Blue Sky」を選択しました。



背景は切りかえないので選択したままにしておきます。



これでゲーム終了演出は完成です。






Step3-11:BGMを作る


動画:1:11:51


BGMは好きなものを選んでください。
ゲーム中はBGMをずっとループします。


新しいスプライト:「BGM」


スプライトの名前:「BGM」

「コード」「音」をそれぞれ追加します。
※コスチュームは何も描きません




■「BGM」スプライトに「音」を追加する




「Dance Around」を追加しました。
好きな音を選んで構いません。




■「BGM」スプライトにゲーム中の音を鳴らすコードを追加する




追加した音を指定してください。
ゲーム開始からずっとループし続けます。


実行してプレイしてみましょう!


これで完成です!


最後まで読んでくれてありがとうございました!





このブログを検索

ブログをよくする

自己紹介

自分の写真
はじめまして。はるはるです。 中2の息子と小5の娘を抱える2児の父です。今はゲーム会社で働いています。 子供のプログラミング学習に協力できるように教え方を勉強中です。 このブログでは簡単なゲームを作りながら自分が学んだことを少しずつ共有していきます。 情報処理の試験をたまに受けます。 第二種情報処理技術者 ソフトウェア開発技術者 基本情報処理技術者 応用情報処理技術者 twitter: https://twitter.com/amaruchan007

連絡フォーム

名前

メール *

メッセージ *

QooQ