本気のオセロのAIを作る。


急にオセロが作りたくなったので作ってみました。どうせなら強いCPUを作りたいよね、と。
ぼちぼちの強さのが作れたので公開します。

オセロの基本ルール

本当に基本的なことは割愛します。オセロを勝つにはどうすればいいのか。

① 最も一番言われていることは角を取ること。角は裏返すことができないので安全な場所です。
最も相手がヘマをしたり終盤じゃない限り角は取れないわけですが。

② その次に辺を確実に抑えること。辺も真ん中と比べれば裏返されにくいところです。
ただ裏返されるリスクがゼロというわけではないので、ここが腕の見せ所でしょう。

最終的には石が多ければいいのです。ただ序盤が有利でも一気に裏返されるのがオセロというもの。そこのところも考えないといけないですね。

sgybuiyghn

AIを作っていく

まずボードゲームのAIを作るには優先順位というものを設けるのが先です。
オセロのAIの場合どうなるでしょうか。

  1. 角を抑える
  2. 辺を取られないようにする(自分は取る)
  3. 最終的に石をたくさん取れるようにする。

となりますね。そしてそれぞれにポイントを振り分けていきます。

例えば角を抑えるのは勝利への鍵!なので1000ポイントとしましょう。
辺を抑える(相手には取られないようにする)ため、相手にすぐに取り返されないなら辺の石は100ポイントとしましょう。
そして真ん中にあるすぐに取り返されるような石は1ポイントです。

まあその辺りの設定は各自で決めていきます。そしてそこが腕の見せ所になりますね。

本気のAI

前項で紹介したことならだれでもできる話です。そんなので強いCPUは作れません。良くて弱くないCPUとどまりです。

さて、本気で作るとなると何が大事になるのでしょうか。それはコンピューターの得意とする相手の手を読むというもの。
人間は先の手を読むにしても3手が限度、それ以上はプロの領域でしょう。

しかしコンピューターなら5手ぐらいまでなら10秒もあればできます。それ以上となると考える時間が吹っ飛んで長くなってしまいます…まあその辺りはマルチスレッドが重要になってくるでしょう。

ところで相手の手を読むとはどうすればいいのでしょうか。

相手の手の読み方

相手の手を読むことで自分が有利なのか不利なのか、というのを判断するのは楽なことではありません。
問題は何を持って有利になったと判断するかです。

そのパターンは2つ。かわりないように思いますが結構差が出てくる

  1. 相手がどのくらい有利になったかを調べる
  2. 自分がどのくらい不利になったかを調べる

これは私の先入観なのですが、オセロとは嫌がらせのゲームだと思うんですよね。自分が有利なように!ってのは当然な流れ。それよりも自分が負けないように必死になることが大事でしょう。

例えば自分がここに打ったら角を取られてしまう!これはピンチです。そうならないようにしなければ
それではどうすればいいのか。それは相手に角を取らせない手を選ぶことですね。
ちなみに角を取られるきっかけになるような手も打たないことが大事です。

osero-kasdo-around

 

パターンでボーナス・減点

オセロにはするべきではないパターン、狙うべきパターンというものが決まっています。
前項で紹介した角もそれですね。私はそこに減点を仕組んでいます。

例えば辺を連続でとったらボーナス、ってのも大事なんじゃないかなーと。
osero-hen

 

それとか斜めにとったほうが有利かも?とか。その辺りは完全に個人の先入観ですかね。

ダウンロード

百聞は一見に如かず。とりあえずプレイしてみてください。
C#で作っているので.NET Framework 4.0 CP以上が必須です。

DropBox
https://www.dropbox.com/sh/xhp0lfuveygxzb7/AAA8cx0o0BswpNk5oUvzyPEba?dl=0

 

Uncategorized

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">