殺しの七並べでは横だけでなく縦や斜めでつながっていてもカードを出すことができます。前回はそのルールにあわせてカードが出せるか判定する方法を考えました。

今回はカードが出されたことでカードが死ぬかどうかを判定する方法を考えます。

カードが置かれることで死ぬカードとは

カードが置かれることで死ぬカードは、そのカードの上下左右にあるカードとそれとつながっているカードで、まだテーブルのうえに出されていないカードです。

そこで置かれたカードの上下左右のカードについて、そのカードと縦または横でつながっている出されていないカードを取得します。そのカード群が長方形になっていれば殺されたカードということになります。

出されたカードの上隣りにあるカードを北、右なら東、左なら西、下なら南と定義します。

隣り合うカード群を取得する

まずは北側のカードと隣り合うカード群を取得するメソッド GetNorthTenvironmentCardを示します。

マークが同じなら前後の番号のカードを取得すればいいのですが、上下にあるカードは番号が同じでマークが異なるカードです。そのため引数のカードのマークを取得して、上下にくるカードをマークを調べています。

そしてカードの上下左右にあるカードを取得するメソッド GeTenvironmentCardを再帰呼び出ししています。これで置かれたカードの北側にあるカード群を取得することができます。

GetCardメソッドの修正

GeTenvironmentCardメソッドは引数で指定されたカードの上下左右にあるもので、テーブルのうえに存在しないカードを取得します。内部でGetCardメソッドを使用していますが、これまでのGetCardメソッドには欠陥がありました。

これまで使用してきたGetCardメソッドを示します。

これでは第二引数に0以下や14以上の値を指定したとき、例外が発生してしまいます。そこで以下のように修正しました。

第二引数に0以下や14以上の値を指定したときはnullを返します。ということはGetCardメソッドを使うときは戻り値チェックが必要になることになります。

つながったカード群を取得するGeTenvironmentCardメソッド

そのカードの上下左右にあってテーブルのうえに存在しないカードを取得するGeTenvironmentCardメソッドを示します。

再帰呼び出しをしているのですが、すでに取得したカードを引数にした再帰呼び出しはしないようにしています。

同様に東、西、南についても同じように取得します。

今後の課題

これで隣り合うカード群を取得することができました。あとはこれが矩形になっていれば「カードの死」が確定します。では囲まれたカードが矩形になっているかどうかはどうやって判定すればよいでしょうか?

カードは四角く囲まれているか? C#で殺しの七並べをつくる (その3)