【スクラッチ】本格ビンゴゲームを作ってみよう

スキルアップの練習
Scratch星人
Scratch星人

パーティーやイベントで盛り上がるビンゴゲーム。

「スクラッチで作れたら楽しそう!」と思ったことはありませんか?

この記事では、本格的なビンゴゲームをスクラッチで作る方法を紹介します。

1〜75のランダム配置、中央のフリーマス、縦・横・斜めのビンゴ判定まで、すべて実装していきます。少し長い記事ですが、一緒に最後まで挑戦してみましょう( ・∇・)

ビンゴゲームのしくみを整理しよう

まず、ビンゴゲームのルールをプログラムの視点で整理しておきましょう。

カードの構成

  • 5×5の25マスで構成される
  • 中央(3行3列目)はフリーマス(最初から空いている)
  • 残り24マスに1〜75の数字が重複なくランダムに配置される

ゲームの流れ

  1. 1〜75の中からランダムに数字を1つ呼び出す
  2. カード上に同じ数字があれば、そのマスを空ける
  3. 縦・横・斜めのいずれかが5マス揃ったらビンゴ!

この流れをスクラッチで順番に実装していきます。

スプライトとコスチュームの準備

今回用意するスプライトは、ビンゴのマスを用意するだけでも大丈夫なのですが、コードが結構複雑で分かりづらいので、あえて6つ用意します。

  • 全てのカード(何も描かない):1〜75の数字をランダムに格納する処理を作成
  • ビンゴカード(何も描かない):25マス(真ん中はFREE)のカード作成処理
  • 数字呼び出し(ボタン):数字をランダムに1つ抽選する処理を作成
  • ビンゴ判定(何も描かない):縦横斜めのビンゴを判定する処理を作成
  • マス目(コスチューム2つ):マスが空いた・まだを管理する
  • Frank(なんでもOK):ビンゴが揃ったら「おめでとう」を言ってくれるキャラ

マス目のコスチュームは70×70にしておくとちょうどいい配置になります。

変数とリストを準備しよう

今回使う変数とリストを最初にまとめて用意しておきましょう。

リスト

リスト名役割
カード25マスの数字を順番に管理(1番目が左上、25番目が右下)
穴あき各マスが空いているか(1=空き、0=まだ)を管理
呼び出し済みすでに呼び出した数字を記録する

変数

マス番号以外は「すべてのスプライト用」で作成します。

変数名役割
カウンターループ処理で使う汎用カウンター
ビンゴ判定ビンゴが成立したか(1=ビンゴ)
マス番号マス目のスプライトに「このスプライトのみ」で作成する
マス表示マスの表示(T)と非表示(F)
一時保存初期設定のシャッフル時に使用
穴あき合計縦横斜めのビンゴ判定時に使用
呼び出し番号今回呼び出した数字
縦ビンゴカウント用縦のマスの数字の増える数に使用
入れ替え先初期設定のシャッフル時に使用

ビンゴカードを作ろう

数字をランダムに配置する

1〜75の数字を重複なく25マスに配置するには、次の方法を使います。

  1. まず「カード」リストに1〜75を順番に入れる
  2. リストをシャッフルする(ランダムに並び替える)
  3. 先頭の25個だけを使う

シャッフルのしくみ

「フィッシャー–イェーツのシャッフル」というアルゴリズムを使います。難しい名前ですが、やっていることはシンプルです。

「全てのカード」スプライトのコード

Screenshot

難しく見えるかもしれませんが、リストに1〜75のカードを一旦格納し、その後にシャッフルしています。

シャッフルの考え方は「後ろから順番に、ランダムな位置の数字と入れ替える」です。これを繰り返すだけで、完全にランダムな並びになります。

「ビンゴカード」スプライトのコード

Screenshot

シャッフルされたリストの1〜25番目の数字をビンゴカードの数字とします。

空いているマス=1、まだのマス=0で管理します。

真ん中(13番目)は元から空いているFREE(1)に設定します。

数字を呼び出す処理を作ろう

ボタンを押すたびに1〜75の中からランダムに数字を呼び出します。すでに呼び出した数字は除外する必要があります。

「数字呼び出し」スプライトのコード

Screenshot

数字を呼び出したあとに「ビンゴ確認」メッセージを送ることで、判定処理を別のブロックに分けて管理できます。

ビンゴ判定を実装しよう(「ビンゴ判定」スプライト)

ビンゴ判定はこのゲームの一番の山場です。

縦・横・斜めそれぞれのラインを確認して、5マスすべてが空き(1)になっているかを調べます。

「穴あき」リストのインデックスを整理しておきましょう。

 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

横列の判定

5行分、それぞれ5マスをチェックします。

Screenshot

縦列の判定

縦は1列ごとにインデックスが(1, 6, 11, 16, 21のように)5つ飛びになります。

Screenshot

斜めの判定

斜めは2本だけなので、シンプルに書けます。

Screenshot

ビンゴカードを視覚化しよう

今回はクローンを使用します。

もちろん25個のスプライトを作っても大丈夫ですよ!

「マス目」スプライトのコード

Screenshot

少し見づらいいですが、自分の番号をセリフとして言うようにすることで、視覚化を実現しています。

Screenshot

ビンゴ成立の処理(「Frank」のスプライトのコード)

Screenshot

まとめ

本格的なビンゴゲームの作り方を解説しました。

今回のポイントをまとめます。

  • 数字のランダム配置はシャッフルアルゴリズムで重複なく実現する
  • マスの状態管理は**「穴あき」リスト**(0か1)で一元管理する
  • ビンゴ判定は5マスの値を足し算して5かどうかで判定する
  • 縦・横・斜めのインデックスの規則性を把握しておくと整理しやすい

ビンゴゲームはリストと条件分岐の総合演習として最適な題材です。完成したらぜひパーティーで使ってみてください( ・∇・)

コメント

タイトルとURLをコピーしました