オセロ

内容的にはプログラミングと程遠いけど。

オセロってのは。


○●
●○

○●○←これを置くと。
●○

○○○
●○


こうなります。
後は盤が埋まるまでこんなことを交互に繰り返すわけです。


決まりとしては、

  • 戦場は8x8。
  • 最初に真ん中にコマが4つ置かれる。
  • 先手と後手をきめ、それぞれのコマ(白or黒)を持つ。
  • 必ず挟み取れる位置にコマを置かなければならないが、どうしても取れないときはパスとする。
  • 勝敗は盤上にあるコマの数が多いほう。

プログラミングで実装することを考えます。


盤の1マス毎に情報を与える必要があるので、
8x8=64の配列が必要になります。
左上の座標を(0,0)として、対象マスをxと置き換える(x, y)座標は、
(x%8, int(x/8))
で求められます。
また座標から逆算することで、配列の添え字を求めることができます。
でもおとなしく二次元配列を使いましょう。


盤の状態は、無し, 白, 黒の3つとなります。
数値で扱うほうがラクなので、0, 1, 2で示すとします。


後は置く場所を指定し、指定された位置にはおくことが出来るのかどうかなどの処理をします。
コマを置くアルゴリズムは調べれば出るはずなんですが、
もうしばらく考えてみたいので我慢。
8方向を機械的に処理するだけでいいので手間にはならないでしょう。
学校の授業中などにでもチラシ裏にでも書きながら考えます。
出来ればコード的には長くても、処理的に軽く実装できる方法がほしいです。



次にAIについて考えてみます。


手っ取り早いのは一番多くコマが挟み取れる場所を選び出して、
その中からランダムで決定します。
しかし、こういうAIは非常に弱いです。
なぜなら状態変化を考慮しないからです。


状態変化を考慮するAIの例をあげてみます。
といっても、結局は力押しによる予測です。
現時点で法則性がわからないのでそうならざるを得ないというかry


まず、適当にコマが取れるいくつかのパターンを求めます。
その盤の情報を持ち越して、次に相手がどこにおくかをいくつかのパターンを探します。
その結果、盤上のコマがもっとも自分が多くなるパターンを見つけ出します。
つまり、1手目で5個取るパターンがあっても、2手目で8個取られるなら-3となります。
しかし、この状態を読むことで、
1手目で3個しか取れなくても、2手目で2個しか取られなかったら+1となります。
しかし、2手先を考えると計算量は1手目の計算量の2乗以上になります。


更にAIを強くすることを考えると、
オセロには強いポジションがあります。四隅と端の列です。
四隅は絶対取られない、端は両端から挟むのは難しいからです。
コレを考慮して置く手に重みをつけてやりましょう。
強いポジションを取れる結果なら結果に+5してやるなど。
これを実装するとなると、少なくとも3手先を読む必要があります。


逆に相手に取らせにくいように考えて見ます。

「■」と「★」が強いポジションです。
コレに8方向に隣接するマスに相手が置くときには、
そのときの結果から-5なりしてやって重みをつけます。
-5しても結果的にそれが最小限の被害になったときだけ置くようにします。
まさに苦渋の選択をコンピューターにさせるわけです。人間ってば鬼畜ですね。



で、何がやりたいのかというと、
AjaxCGIだけで動く対戦型オセロを作ってみたいなぁとか思っただけです。
JavaScript(Ajax)が動くブラウザだけあれば遊べるよ!みたいな。
テーブルでマス作って、tdタグにonclick属性つけて、ajaxを用いて描画したりとか。


AIの話題を出したのは、AIとでも対戦できるようにするためです。
「AIにまかせる」ボタンを押すことでAIに勝手にやってもらうってな感じをイメージしてます。


どうみても時代遅れ感がありますけどねー。