Powershell(オセロ008_ロジック_2:一区画優先)

■石を置くロジックについて考えてみる(その2)。
オセロのロジックについて考えてみるの2回目。今回考えてみたロジックは、盤を四区画に分けて、同じ区画に優先的に石を置いていくもの。石を置く場所を盤全体に散らすよりも一区画を中心に置いていけば、相手の裏返すことができる石が減り、有利にゲームができるのではと思い、このロジックを試してみた。

コードは下の通り($logic_num -eq 2)。
盤を四分割すると考えた際に、まず左上の部分(行1から4,列1から4まで)の空欄(_)の位置を取得して、取得した一区画の一覧の順番をランダムに並びかえる。それを別の一覧に加える。同じ作業を右上、右下、左下の区画にも行い、それぞれ一覧の後ろに追加していく。これで得られた一覧の頭から実際に置くことができるか試し、置くことができた一番初めの位置を採用する。左上の区画で置くことができなければ、次に右上の区画の中で置くことができないか試すといった感じになる。ゲームは、一区画優先vsランダムで行う。

            elseif ($logic_num -eq 2){
               $zoneArray = @()

               for ($n=1; $n -le 4; $n++) {
                  for ($m=1; $m -le 4; $m++) {
                     if ($boardData[$n][$m] -eq '_') {
                        $zoneArray+= [string]$n + [string]$m
                     }else{
                     }
                  }
               }
      
               if($zoneArray.count -eq 0) {
      
               } elseif($zoneArray.count -eq 1)  {
                  $inputArray = $zoneArray
               } else {
                  $inputArray = get-random -input $zoneArray -count ([int]::MaxValue)
               }
               $zoneArray = @()

               for ($n=1; $n -le 4; $n++) {
                  for ($m=5; $m -le 8; $m++) {
                     if ($boardData[$n][$m] -eq '_') {
                        $zoneArray+= [string]$n + [string]$m
                     }else{
                     }
                  }
               }

               if($zoneArray.count -eq 0) {
      
               } elseif($zoneArray.count -eq 1)  {
                  $inputArray = $zoneArray
               } else {
                  $inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
               }
               $zoneArray = @()

               for ($n=5; $n -le 8; $n++) {
                  for ($m=5; $m -le 8; $m++) {
                     if ($boardData[$n][$m] -eq '_') {
                        $zoneArray+= [string]$n + [string]$m
                     }else{
                     }
                  }
               }

               if($zoneArray.count -eq 0) {
      
               } elseif($zoneArray.count -eq 1)  {
                  $inputArray = $zoneArray
               } else {
                  $inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
               }
               $zoneArray = @()

               for ($n=5; $n -le 8; $n++) {
                  for ($m=1; $m -le 4; $m++) {
                     if ($boardData[$n][$m] -eq '_') {
                        $zoneArray+= [string]$n + [string]$m
                     }else{
                     }
                  }
               }
               if($zoneArray.count -eq 0) {
      
               } elseif($zoneArray.count -eq 1)  {
                  $inputArray = $zoneArray
               } else {
                  $inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
               }
  
            }

黒(一区画優先)vs白(ランダム)で5000回ゲームを行った結果は次のようになった。
黒 2682 vs 白 2191 vs 引き分け 127 (勝率54%)

勝率を見ると、一区画に中心的に石を置いていった方がやや高いか。

最終的な黒の石の数を見ると、黒33のゲームが最も多くなっている(下のグラフ、160ゲーム以上)。黒の石だけ見ると、特徴なさそうに見えるけど、白の石の数と合わせてみると、最後まで行かずに終了したゲームが多いことがわかる(もう一つ下の図、縦が黒の石の数、横が白の石の数、表中の数字はゲームの回数)。ゲームが最後までいくと黒と石の数の合計が64になる、つまり対角線上になるが、それより少ない数のものが多い。黒の数が0となって負けたゲームも14回あった。


四隅に置いた数については、下のようになった(行が黒、列が白、0から4は四隅をとった数)。ゲームが途中で終了しているので、四隅が空欄のままとなっているゲームも数多くある(行と列の合計が4でないところ)。

プログラムの実行速度はランダム同士で行ったときと変わらなかった(5000ゲームで10分程度)。

一区画を中心に置く戦略もありかと思ったけど、状況が悪くなってもロジックを変えるようにはできていないので、勝率にはあまり影響していないよう。なんとなくにはイメージしやすいけど、途中で黒も白も石が置けない状況になり、ゲームが終了するのは特徴的だった。