以前、女神転生の「コードブレイカー」をRubyで再現したことがあるが、
それをブラウザで動かしてみたくなったのでJavaScriptでコーディングしてみようと考えた。
そこで、真っ先に躓いたのが、答えとなる数字の生成。
3桁の重複しない数字を生成するのに、
Rubyでは
# 抽出元の配列を生成
arr1 = (0..9).to_a
# 配列からランダムに3つを選択
ans1 = code.sample(3)
たったこれだけでいい。
便利なメソッドを開発者が用意してくれているお陰である。
しかし、JavaScriptには
「一定範囲の数値を配列化できるメソッド」も
「配列から指定した個数の要素をランダムに選ぶメソッド」も
存在しないのである。
だからどうした、無ければ作るまでだ、と、
検索と試行錯誤を繰り返した末、どうにかそれらしいものは作れた。
使う機会があるかわからないが、参考になれば幸いである。
抽出元の配列を作る
範囲オブジェクト((0..9)の部分)が使えないので、
地道に数字を手打ちして作った。
const arr1 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
作りながら、ふと
「これ、ビンゴゲームなんか作りたい時、どうするんだろうか」
と不安になったが、今は考えないことにする。
配列から指定した個数の要素をランダムに選ぶ
ランダムに選ぶメソッドがないので、
「乱数に抽出元の配列の長さをかけた数値を作る」
「Math.floor()関数で小数点以下を切り捨てて整数にする」
「出来た整数と同じインデックス(番地)の要素を選び、空の配列に加える」
「元の配列から選択された要素を削除する」
という流れで処理することにした。
この一連の処理を、配列の長さが3になるまで繰り返す。
let ans1 = [];
while(ans1.length < 3) {
// 配列からランダムに選ぶ
const rand = Math.floor(Math.random() * arr1.length);
// 選んだ要素を答え用の配列に入れる
ans1.push(arr1[rand]);
// 元の配列からは消す(重複防止)
arr1.splice(rand, 1);
}
return ans1;
乱数の所で配列の長さを掛けているのは、0~9の数字の数を掛けると、
2回目以降の選択では配列の長さが1ずつ減るので、
乱数が2回目に9、3回目に8か9になってしまうと、
存在しないインデックスを参照してしまうため。
最後のreturnは出来上がった配列を次の処理に渡すためのもの。