いわゆる3目並べのプログラムです。
3×3の格子盤を用意し、二人が交互に「○」と「×」を書き込んでいき、先に3つ並べたほうが勝ちになるゲームでです。 日本では○×ゲーム、海外ではTic tac tooとして知られている誰でも一度はやったことのあるゲームだと思います。
このゲームは、両者が最善手を打った場合は、必ず引き分けになります。
人間とコンポユータが対戦を行う形式としました。コンピュータは常に最善手を打つようにプログラムしています、絶対に負けません(僕のプログラムが正しければですが...)
主要なクラスは、以下の通りです。
ゲームを制御するクラスです。先手後手を決め、ゲームを開始します。ゲームが終了したら再度ゲームをするかを確認します。実質的なメインプログラムです。
このクラスは、IObserver<Board>
を実装しています。いわゆる購読者クラスで、ゲームの状況が変わるとその盤面の状況を受け取ることができます。盤面が変化するとその内容を表示します。
1回のゲームを表すクラスです。PerfectPlayerとHumanPlayerを交互に呼び出しゲームを進めます。
このクラスはIObservable<Board>
を実装しています。いわゆる発行者クラスです。1手指すたびにその状況を購読者に通知します。そのため、見た目とは完全に独立したクラスになっています。
盤の状態を表すクラスです。
○×を表すクラスです。
プレイヤーを表すインターフェース。
コンピュータ側のプレイヤーを表すクラスです。相手が最善手を指すものと仮定して、最後まで先読みをします。自分が勝つ手があればそれを指し、なければ引き分けの手を、引き分けもなければ、負けの手を指します。でも、このゲームに限っては負ける手を指すことはないはずです。最低でも引き分けの手を指します。
人間のプレイヤーを表すクラスです。キーボードから手を入力します。