content8クィーン・ゲーム(思考ボードゲーム)をC#で作成C#アルゴリズムobserver対戦ゲーム思考ルーチン8クィーン・ゲームとは8×8のチェス盤に2人で交互にクィーンを置いていき、自分の手番のときに置き場所が無いほうが負けというゲームです。置かれているクィーン(自分が置いたものも含め)の利き筋に新しいクィーンを置くことはできません。いわゆる8クィーンパズルのゲーム版というところです。クィーンは、縦横斜めの何処へでも移動できます。将棋の飛車と角を合わせた動きになります。出典である「ナノピコ教室1」では、先手必勝かどうかを調べるという問題でしたが、ここでは、実際に人との対戦が出来るようにしてみました。ちなみにあなたが後手の場合は、絶対に勝てません。先手でもちゃんと考えないとなかなか勝てません。Coreのコンソールアプリケーションとして作成していますので、MacでもWindowsでもそのまま動くはずです。やって解くか実際のこの手のゲームプログラムでは、序盤戦は定石を用いたルーチンになっていると思われますが、8クイーンゲームでは、探索手の数が少ないので、愚直に全探索をしています。枝刈りなどは行っていません。最初の一手目はすこし時間がかかりますが、それ以降は、すぐに探索が終了します。プログラムを単純化するために、黒石(×)をコンピュータ、白石(○)を人間に固定していますが、実際の探索をするSearchメソッドは、石の色に関係なく探索が出来るようにしてあります。(再帰処理)つまり「ここにおいたら、次に相手はどう打つかな」を考える結果が自分の石の勝ちならば、ここで終了(戻る)自分の石が勝てなかったら、1に戻り別の場所を試してみるどこに置いても勝てなかったら、相手の勝ちとして戻る。いう動きになっていて、2手先、3手先を読むのではなく、勝敗がきまるまで、ずーっと先読みを続けています。思考型の対戦ゲームとしての基本構造を示せるという点で、8クィーンゲームはなかなか良い題材だと思います。ソースコードにはコメントを付加していますので、詳しくはソースコードを見てください。以下に、実行例を示します。これは、ゲームの途中の状態。人間のプレイヤーは、2桁の数字(行と列)を入力しクィーンをの置く場所を指定します。利き筋になってもうクィーンが置けない場所を示しています。.は、クィーンを置ける場所を示しています。次のは、ゲームが終わった状態。T)主要なクラスControllerクラスこのゲームを制御する実質的なメインクラスです。1回の対戦だけを扱います。基本、表示はこのクラスが受け持っています、Gameクラス1回の対戦を扱うクラスです。2つのプレイヤーを交互に呼び出し、ゲームを進めます。クラス人間のプレイヤーを表すクラスです。クラスコンピュータープレイヤーを表すクラスです。この中に思考ルーチンが組み込まれています。Boardクラス盤面を表すクラスです。このBoardクラスは他のプログラムでも利用しているBoardBase<T>から派生させていますので、すこしオーバースペックかもしれません。IOvervable<T>を実装しています。GameクラスがIObservable<Board>を実装し、盤面の変化を購読者に通知しています。購読者クラスは、Controllerクラスで、IObserver<Board>を実装しています。}}Controller.csC#のコードは、GitHubでも公開しています。Solveで得られた最善手を返す。最初に見つかった置ける場所に石を置く。すべての空いている位置に対して試してみる。Computerが勝ちならば、処理をやめて戻る。再帰処理をし、探索する。相手がどんな手を打っても勝てる位置を探す。この位置に置くと相手が勝ってしまうので、次の位置を調べる。ちなみにこのゲームには引き分けはない。どこにも打つ場所が無い。どこに置いても勝てない。Tは、盤面に置けるオブジェクトの型。参照型でnew()ができれば何でも良い。upLoginユーザーは見つかりませんでした。