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