LoginSignup
6
7

More than 5 years have passed since last update.

JavaScriptでビンゴをつくる

Last updated at Posted at 2018-01-30

社内でビンゴ大会があり、ビンゴの仕組みをJavaScriptで作成したので、その共有です。

必要な機能

ビンゴのシステムを作るにあたり、必要な機能を考えます。

  • 数字がランダムに表示される
  • 同じ数字は二度でない
  • 出た数字が確認できる

こんなところでしょうか。
上記、3つの機能を備えたプログラムを作っていきます。

書いてみる

上記の3つの機能を網羅したプログラムを書いてみました。

jQuery
let gameState = true; // ゲームの状態
let preArray = []; // 抽選箱
let postArray = []; // 過去ログ

const itemLength = 10; // ビンゴの最大数
for (let i = 0; i < itemLength; i++) {
  preArray.push(i); // 抽選箱の中に整数を格納
}

for (let i = 0; i < preArray.length; i++) {
  let rand = Math.floor(Math.random()*(i+1)); // 乱数を作成
  [preArray[i], preArray[rand]] = [preArray[rand], preArray[i]]; // 整数をランダムに並べ替え
}

$('button').on('click', function(){
  if (0 < preArray.length) {
    let current = preArray.shift(); // 抽選箱の先頭の要素を取得し、削除
    postArray.push(current); // 過去ログに格納
    console.log(current);
    console.log(postArray);
  } else {
    if (gameState) {
      gameState = false;
      console.log('終了');
    } else { // gameState が false ならなにもしない
      return false;
    }
  }
});

解説

上から解説していきます。

jQuery
let gameState = true; // ゲームの状態
let preArray = []; // 抽選箱
let postArray = []; // 過去ログ

gameStateはBINGOが終わったときにfalseにして、if文の分岐条件にします。
まだ空っぽですが、抽選箱に見立てたpreArrayに数字を入れておき、取り出してpostArrayに入れます。
実際のビンゴと同じシステムです。

jQuery
const itemLength = 10; // ビンゴの最大数
for (let i = 0; i < itemLength; i++) {
  preArray.push(i); // 抽選箱の中に整数を格納
}

for (let i = 0; i < preArray.length; i++) {
  let rand = Math.floor(Math.random()*(i+1)); // 乱数を作成
  [preArray[i], preArray[rand]] = [preArray[rand], preArray[i]]; // 整数をランダムに並べ替え
}

出したい数字の最大数を決め、その数だけfor文を回し、抽選箱ことpreArrayに整数を格納します。
preArrayをもう一度for文で回し、中の数字をランダムに並べ替えます。
並べ替えは、以下を参考にさせていただきました。

参照:JavaScript 簡単に配列をシャッフルする

フィッシャー–イェーツのシャッフルです。

jQuery
$('button').on('click', function(){
  if (0 < preArray.length) {
    let current = preArray.shift(); // 抽選箱の先頭の要素を取得し、削除
    postArray.push(current); // 過去ログに格納
    console.log(current);
    console.log(postArray);
  } else {
    if (gameState) {
      gameState = false;
      console.log('終了');
    } else { // gameState が false ならなにもしない
      return false;
    }
  }
});

button要素をクリックしたら、抽選箱preArrayの先頭の要素をcurrentに代入し、抽選箱preArrayから削除します。
そして、currentを過去ログ用配列のpostArrayに格納します。
抽選箱preArrayの中身がなくなったら、if文で終了を通知し、その後なにも起こらないようにします。

確認

コンソールを開き、「ぼたん」をクリックしてご確認ください。

See the Pen BINGO by Otsuka Yuhi (@boltkeep) on CodePen.


6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7