囲まれているカードは矩形か?

前回はプレイヤーによって出されたカードに隣り合うもののうち、まだテーブルに出されていないカード群を取得する方法を考えました。カード群を取得することができたので、今回はこれが矩形になっているか調べます。

どうやれば矩形になっていると判断することができるのでしょうか? 以下のように考えました。

カード群をマークごとにわけてそれぞれの最大値と最小値を調べます。最大値と最小値が取得できなかった場合を除いて、マークごとの最大値と最小値が一致しなかった場合は囲まれているけど、矩形にはなっていないと判断します。

またこれだけではカード群が矩形であると断定することはできません。たとえばこのようなものは不可です。出されていないカードの最大値と最小値が一致しているだけでは矩形にならない場合があるのです。下の図ではハートの5があるため矩形になっていません。

そこで矩形ができるのではないかと思われるときは、実際につくられる矩形の面積を計算しています。これがカード群の枚数と一致すれば「カードは四角く囲まれている」=「カードの死」と断定することができます。

そのために作成したのがIsDeadThisBlockメソッドです。これは前回のGetNorthTenvironmentCard メソッド、GetSouthTenvironmentCard メソッド、GetEastTenvironmentCard メソッド、GetWestTenvironmentCard メソッドで取得したカード群が矩形になっているかどうかを調べます。

カードが死んでいるか判定するIsDeadThisBlockメソッド

殺されたカードのリストを取得するGetDeadCardメソッド

カードの生き死にが判定できたら、あとはこれを表示するだけです。

まずは殺されたカードのリストを取得するメソッドを作成しました。カードを一度に殺せる数には制限(ローカルルールでいろいろある)があります。今回は12枚にしました。

殺されたカード情報を示すShowIfDeadメソッド

殺されたカードのリストが取得できたら、必要に応じてこれを表示させます。第一引数は出されたカード、第二引数は出したプレイヤーの識別番号です。カードが殺されたときだけメッセージボックスを表示させます。

ShowIfDeadメソッドを自分と相手がカードを出したあと実行すれば結果が表示されます。