変種オセロ「良い子悪い子普通の子」については、以下を参照。
今回は、この変種オセロの思考ルーチンを作っていく。
ランラム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と呼べるか微妙なので、次はもうちょいマシなものを作ってみたい。
今日はここまで!