端を制すものは世界を制す
プログラムを書いていると、人間の認知力がすごいものだと再確認させられます。
人間だと簡単に理解できる局面を、機械に理解させることの難しさ。まるで、目が見えない人に物がある位置を教えるような慎重さが必要になります。
今回はオセロの端の部分について記述したいと思ったのですが、作っているうちにあまりにパターンが多いことに気がついて途方にくれました。例えば次の場合、
×××○●×××
↑
矢印の場所に置けば良いとプログラムするのは簡単です。ところが、
××●○●×××
↑
この場合は矢印の場所に置くと全部取られてしまいます。通常なら例外処理を組み込んでやればいいのですが、あまりに例外が多すぎて対処できなくなりそうな予感がします。
かといって全てのパターンを網羅しようとするとものすごいことになってしまいます。空白のセル、白の石、黒の石を3進数で表すと0から22222222まで、10進数に直すと6560通りもあるのです。この全てに最善手を用意することは到底無理。
そこでなるべく例外処理を生まないため、パターンを思いっきり省略することに決めました。単純に右から左にセルを見ていって、左側に敵の石がある時だけ分岐し、敵の石を挟めるならば評価値を上げるようにしました。
これだけだと認識が甘すぎるので、一度右から左へ見たら今度は左から右へセルを見ていき、2つの評価点を合計することでパターン認識の正確さを上げました。
Lv6 一手読み強化版 Ver.1.11
無意味な自爆が無くなって良くなったけど、謎のエラーが頻発。どうやらセルの範囲を超えて参照しているようだ。
相手の石と石の間に隙間があるのに打ち込まないのを発見。その時だけ例外処理することに。
Lv7 一手読み強化版 Ver.1.12
まだ序盤に石を取りすぎる傾向にあるので評価値を修正。
セルの範囲を(0,0)から(7,7)までの8×8にしたのだけど、そのせいでエラーが多いようだ。どうせなら(9,9)まで作って、盤の外という概念を持たせたほうが良かったのではないかと思います。
対人戦でも、相手が凡ミスをすると勝てるようになってきました。よしよし。
それにしてもYahoo!オセロはマナーが悪いな〜。ルームだけ作って放置しているのはいるし、暴言吐くやつはいるし。強いコンピューターと戦わせたほうが正確にレーティングを測れて良いのではないだろうか・・・。
ここで読みのほうはひと段落して、そろそろ使い勝手の向上を目指したい。とりあえずUndoが無いのはすごく不便なので、棋譜を保存する方法を考えたいと思っています。