いものやま。

雑多な知識の寄せ集め

変種オセロの思考ルーチンを作ってみた。(その1)

変種オセロ「良い子悪い子普通の子」については、以下を参照。

今回は、この変種オセロの思考ルーチンを作っていく。

ランラムAI

もっとも簡単なAIは、これ。
実行可能な手からランダムに返すだけのもの。

#!/usr/bin/env ruby

require_relative "board"
require_relative "game"

module YWF
  class RandomCom
    def select(board)
      select = board.legal_actions.sample
      puts "#{select[0].to_s} #{select[1]}."
      select.flatten
    end
  end
end

if __FILE__ == $PROGRAM_NAME
  include YWF

  game = Game.new(RandomCom.new, RandomCom.new)
  game.start
end

ちょっと覚えておきたいメソッドとしては、Array#sample。
このメソッドは配列からランダムに1つの要素を選んで返してくれるので、こういうときにすごく便利。

実行例

これを実行してみると、例えば次のような感じになる。
(ランダムに手を選んでいるので、毎回結果は変わる)

[001] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   |   | - | O | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   |   | X | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [3, 4].
[002] turn: X, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   | O |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   |   | O | O | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   |   | - | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [4, 3].
[003] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   | O |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | - | - | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   |   | X | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [5, 3].
[004] turn: X, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   | O |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | - | - | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | - | O | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [3, 5].
[005] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   | O | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | - | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | - | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
change [4, 4].
[006] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   |   | O | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | O | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | O | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [3, 3].
[007] turn: O, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   | X | - | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | O | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | O | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | - |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [7, 6].
[008] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   | X | - | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | O | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | O | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   |   | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [7, 5].
[009] turn: O, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   | X | - | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | O | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | O | X | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   | X | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [8, 6].
[010] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 2 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 3 |   |   | X | - | X |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 4 |   |   | X | O | X | X |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 5 |   |   | O | O | X | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 6 |   |   |   | O | X | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 7 |   |   |   |   | - | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 8 |   |   |   |   |   | O |   |   |   |
   +---+---+---+---+---+---+---+---+---+
 9 |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+
play [6, 7].

〜長いので省略〜

[131] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | - | - | - | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | X | X | O | X | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | - | X | X | O | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | - | X | X | - | X | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | X | - | - | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [6, 3].
[132] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | - | - | - | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | X | X | O | X | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | - | - | X | O | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | - | - | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | - | O | - | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [6, 5].
[133] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | - | - | - | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | X | X | O | X | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | - | X | X | O | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | - | X | X | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | - | O | - | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [3, 3].
[134] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | - | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | - | - | O | X | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | X | - | O | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | X | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | O | O | - | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [6, 8].
[135] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | - | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | - | - | O | X | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | X | - | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | X | - | X | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | O | O | - | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [5, 8].
[136] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | - | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | - | - | O | X | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | X | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | X | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | O | O | - | - | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [7, 5].
[137] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | - | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | - | - | O | X | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | X | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | X | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | X | - | - | X | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | - | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [5, 5].
[138] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | - | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | - | O | O | - | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | - | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | - | O | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | X | - | - | - | X | - | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [4, 6].
[139] turn: O, token: -
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | X | X | - | - | X | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | X | O | - | - | - | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | X | - | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | X | - | - | - | X | - | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | - | O | O | O | O | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
change [8, 2].
[140] turn: X, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | - | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | X | - | - | - | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | - | O | - | O | - | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | - | O | - | - | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | O | - | - | X | - | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | O | O | O | O | O | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | O | O | O |   | O | O | X | O |
   +---+---+---+---+---+---+---+---+---+
play [9, 5].
[141] turn: O, token: X
     1   2   3   4   5   6   7   8   9
   +---+---+---+---+---+---+---+---+---+
 1 | X | X | X | X | O | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 2 | X | X | X | X | X | - | O | - | O |
   +---+---+---+---+---+---+---+---+---+
 3 | O | O | O | O | X | O | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 4 | X | - | X | - | X | - | O | O | O |
   +---+---+---+---+---+---+---+---+---+
 5 | X | - | O | - | - | - | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 6 | X | X | O | - | X | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
 7 | X | - | - | - | X | X | X | X | - |
   +---+---+---+---+---+---+---+---+---+
 8 | - | O | O | - | - | - | - | O | O |
   +---+---+---+---+---+---+---+---+---+
 9 | X | - | - | - | X | - | - | X | O |
   +---+---+---+---+---+---+---+---+---+
----------
black: 28, white: 26
O win.

割といい勝負。
普通のオセロなら(9, 5)に置いて終わりだけど、灰色を自分の色に変えるアクションで捻りあいが続くので、意外と面白い感じ。

ただ、ランダムなので、当然勝負は時の運。
これではさすがにAIと呼べるか微妙なので、次はもうちょいマシなものを作ってみたい。

今日はここまで!