×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

梅花碁の勝ち判定

梅花碁は、碁盤と碁石であそぶ連珠の一種です。
 黒、白交互に打ち進めて、十字の勝ちパターンを作ったほうが勝ちというゲームです。
十字の大きさは問いませんが、辺の方向は水平、垂直、45度の角度に限ります。
たとえば、以下のようなパターンができれば、白の勝ちとなります。

 梅花碁

問題は、
------
梅花碁のある局面で白黒どちらが勝ったかどうか(上記の十字形ができたかどうか)を調べるプログラムを書いてください。
------
というものです。

ボード上をクリックすると石を置くことができます。クリックするごとに、白石 → 黒石 → 消去 と変化します。



勝ちパターンがあるかどうかを調べる方法は地道に一点、一点確認する方法を採用しました。
ある点を与えると、その点を中心とした十字パターン、昌パターンがあるかどうかを調べるメソッド IsWinPatternを作成し、このメソッドをすべての地点に対して調べて行き、一つでもIsWinPatternが trueを返せば、勝ちパターンがあるというコードを書きました。
このプログラムのポイントは、中心点と十字のサイズを与えると、その勝ちパターンの位置コレクションを返すメソッド CreateWinPattern1, CrateWinPattern2を作成した点でしょうか。これにより、IsWinPatternがすっきりとしたと思います。
ただ、効率面ではまだまだといった感じです。これを改善しないと、実際のゲームプログラムの先読み処理の中で利用するのは難しいかもしれません。

IsWinPattern、IsWinメソッドをどのクラスに入れようか迷いましたが、碁盤を表すUmehanaBoardクラスのメソッドとしました。
IsWinPatternの中では、LINQのAllメソッドを使っています。ループ処理を書かずにこのような判定処理がかけるのは、LINQの魅力のひとつですね。

ブログに掲載したコンソールアプリをSilverlightに移植しましたが、せっかくなので、どこで勝ちパターンが作られたかを示す機能を追加してみました。


以下に、ソースコードを示します。なお、このプログラムは、そのほかのプログラムでも利用する Board, BoardCanvasクラスを利用しています。Board, BoardCanvasクラスのソースコードはこちらに掲載しています。

■UmehanaGo.cs
  

■MainPage.xaml.cs
  
 
■MainPage.xaml


※『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題を一部変更し、GushwellがC#で解いたものです。