今回はプレイヤーがカードを出すまで 素数大富豪をJavaScriptでつくる(1)でプレイヤーが出したカードが適切なものかどうかを判定する処理を考えます。

動作確認はこちらから ⇒ Web版素数大富豪、別名 素数の出会い系サイト

全体の流れ

プレイヤーが確定ボタンをクリックしたときはカードが適切なものかどうか判定がおこなわれます。

最初に出されたカードに対して

なにも出されていない
出すべきカードの枚数が違っている
出すべき数よりも大きな数(ラマヌジャン革命が起きているときは小さな数)になっていない

といったミスに対するチェックがおこなわれます。

そのあと

ジョーカーの1枚だし
グロタンディーク素数
ラマヌジャン革命

であるかどうかの判定がおこなわれます。前2者の場合は自動的にプレイヤーが親となりますが、ラマヌジャン革命のときはコンピュータに手番が移動します。

そのあとカードが素数として出されたときは本当に素数なのか、合成数出しのときは素因数として使われているカードは素数なのか、素因数の計算結果は合成数出しされたカードと一致するかが判定されます。ここで間違っているとペナルティーの対象となります。

事前チェックの処理

出されたカードを事前にチェックする関数です。プレイヤーによって出されたカードの枚数の確認と、カードの番号で整数を生成し、これとnumberMinを比較して適切なカードであるかを調べています。正しくないカードの場合、ShowNotificationMessage関数(後述)をつかって注意のメッセージを表示し、カードはプレイヤーにすべて返しています。

GetNumber関数はカードの番号で整数を生成します。ジョーカーを出すときcard.Numberが文字列になって渡されてしまうのでNumber型に変換しています。

ShowNotificationMessage関数はメッセージを表示する処理をおこないます。

グロタンディーク素数とジョーカーを出したときの処理

グロタンディーク素数とジョーカーを出したときは場が流され、自動的にプレイヤーが親になります。そしてその旨を示すメッセージが表示されます。

場を流す処理

場を流す処理を示します。プレイヤーとコンピュータが出したカードと非表示ではあるけど場に存在するカードが格納されている配列を空にしてcardCountとnumberMinを -1 にして次は好きな枚数で好きな数が出せるようにします。

ラマヌジャン革命かどうか?

プレイヤーによって出されたカードでラマヌジャン革命になるかどうかを判定する処理を示します。革命が成立しても自動的に場は流れず、手番がコンピュータに移ります。

場のカードを非表示に

場のカードを流さずにプレイヤーとコンピュータが出したカードを非表示にする処理を示します。素因数場に出されたカードはすぐに流してしまいます。

素数として出されたカードの判定

プレイヤーによってカードが素数として出されたとき、本当に素数かどうかを調べる処理を示します。ここで正しくないカードであると判定された場合はIllegal関数(後述)が呼び出され、その旨を示すメッセージが表示されます。

正しいカードであると判定された場合はPlayerPutCardsMoveInPlay関数を呼び出して、場に出されたカードは見えないところに移動させ、素因数場に場されたカードはすぐに流します。また正しいカードであることを示すメッセージを表示させます。

素数かどうかを判定する関数

素数かどうかを判定する関数を示します。

2以外の偶数は素数ではないし調査対象の数を偶数で割っても意味がありません(偶数なら2で割り切れるから)。そこで3以上の奇数で割り切れるかを調べています。どこまで調べるかは調査対象の平方根を切り上げた整数までです。もし割り切れるのであればそれよりも前に割り切れる数が見つかるはずです。見つからなかったということはこれ以上調べても見つかる可能性はないので素数であると判定しています。

不正なカードを出したときの処理

素数でない場合は不正なカードである旨を示すメッセージを表示させます。そして手番をコンピュータに移します。

正しいカードを出したときの処理

プレイヤーが出したカードが正しい場合はメッセージを表示して知らせます。OKボタンをクリックすると手番がコンピュータに移り、CompPutCards関数(後述)でコンピュータがカードを出します。

合成数出しをしたときの判定

プレイヤーが合成数出しをしたときの処理を示します。本判定のまえに素因数の指定が間違っている場合はやり直すようにメッセージが表示されます。正しい場合は確認のメッセージが表示されます。OKボタンをクリックすると判定がおこなわれます。

EvaluatePlayerText関数はplayerPutCardsText2の文字列を評価して選択された素因数による計算をおこなうためのものです。素因数である以上、素数でなければならないのですが、そうでない場合は不正なカードが出されたとしてその数の符号を反転した数を返します。

また入力ミスで素因数がひとつだけしか選択されていない場合、計算式として成り立っていない場合は0を返します。戻り値が0なら入力ミスですませますが、負数であれば素数でないものを素因数として指定した反則と見なしてペナルティーを与えます。

0が返されるときは入力ミスということで許されますが、負数が返されたときは反則として処理されます。

合成数出しの確認のメッセージを表示する関数を示します。OKボタンをクリックするとCheckPlayerCompositeNumber関数が呼び出されて判定がおこなわれます。キャンセルボタンをクリックするとカードを指定しなおすことができます。

素因数の計算式を評価する関数

素因数の計算式を評価して、プレイヤーが出した合成数と一致するかが調べる処理を示します。素因数として指定した数が素数でない場合や計算の結果、合成数と一致しない場合は不正なカードであると判定されます。

判定結果を表示するメッセージがShowGoodMessage関数またはIllegal関数によって表示され、どちらの場合もコンピュータに手番が移動します。