- 締切済み
○×ゲーム
○×ゲーム ○×ゲームを作ってますがコンピュータとの対戦の時、先攻後攻をジャンケンで決めれるようにしたいのと、コンピュータがマスを置くAIをしっかりとしたものにしたいのですがプログラム上でどうすればよろしいでしょうか。どなたか教えてください。 ソースコード↓ http://codepad.org/haIjhQhY
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- beefisdead
- ベストアンサー率63% (92/145)
回答No.1
着実に進んでますね。いいことです。 さて先攻後攻をジャンケンで決めるのは簡単なのですが、今のコードだとちょっと適用しにくいですね。goto使えばすぐにでもできますけど。 プレイヤー対戦とコンピュータ対戦との重複も気になりますし、main関数内の対戦部分をちょっとリファクタリングすると良いと思います。 AIに関しては、ヒューリスティックというか、あと一手で勝ちになる状況に対応することはできますよね。では、三手で勝ちになる状態に対応する方法は考えられますか?想像できたなら、それが探索です。 3*3だったら全探索が問題なく可能ですね。対称性や必須の一手を利用して枝狩りを適宜行えば、人間の手でも探索可能な程度でしょう。 それをしないなら強化学習とか用いることになりますね。このゲームは、ある盤の状態である手を行ったという情報の積み重ねでできています。最後の手で負けた場合はそこまでに至る手の評価を下げ、勝った場合は評価を上げていきます。これを繰り返すことである手の評価を学習させることができるわけです。 または、最近流行りのモンテカルロ法を用いる方法もあります。モンテカルロじたいについては適宜調べていただくとして、この場合は、ランダムに石を置いて終局までを何度もシミュレートし、その結果をまとめ、より勝ちやすいところに石を置く方法です。作るのが簡単なわりに効果があります。