開発
基礎
トランプのカードをシャッフルするために必要なこと
- カードが重複しないことと、カードの順番を乱数で生成すること
例えば、5枚のカードがあるとして、単純に乱数を使うとカードが重複してしまいます。
そのため順番にすべてのカードを他のカードと差し替えていく必要があります。
差し替えるという考え方で、カードの重複を避けられます。 - まずは乱数発生のスクリプトから
乱数発生の関数はMath.random() 関数を使用します。また、数値の範囲を決める場合も決まった構文があります。
たとえば1~10までの間で乱数を発生しさせたい場合は、下記の関数へgetRandomNumber(1, 10.)と引数を送ります。function getRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
- 乱数を生成する時、処理中のカードと同じ順番を避ける
たとえば5枚組のカードの3番目を他のカードと差し替えるため乱数を生成したとします。
その場合5分の1の確率で同じ順番がでます。それだと意味がないので、同じ順番が出た場合は、違う数値が生成されるまで乱数を生成する仕組みが必要です。下記がそのスクリプトになります。違う数値が生成されるまで乱数の生成を繰り返します。do { r = getRandomNumber(1, cardsCount); // 1からカード総数(1, cardsCount)の範囲でランダムな数を生成 } while (r == d);//dは処理中のカードの順番
- 補足
『javascript,シャッフル』で調べるとよくあるのは、配列を順番に他のカードと差し替えるところは同じですが、カードを重複させないために、差し替えるカードの数がどんどん減少していくロジックが多いです。
これだと最初の方のカードは差し替える対象が50枚とかなのに、最後の方のカードになると残り一枚とだけ差し替えることになりこれじゃあシャッフルじゃあありませんね。
なので常にすべてのカードを対象にし、ランダムに差し替えるようにしました。
また、全部のカードをシャッフル対象とせず、使用する枚数のみシャッフルするという考え方もあるようですが、やはりここはリアルに全てのカードをシャッフルしたいですね。処理時間をかけないという意味があるようですが…。
でも、現実でもシャッフルにじっくり時間をかけてシャッフルしますよね。この待ち時間に期待感が高まるわけですから。
このワクワクこそがロマンなんですから。