class SimpleHeuristicsPlayer[N <: Node[N]] extends Player[N] { override def play(node: N, last: Move): Move = { val moves = node.possibleMoves(marker) var nextMove = List[Move]() var maxS = Int.MinValue for (m <- moves) { (m: @unchecked) match { case PutMarker(x, y, _) => val s = score(x, y) if (s > maxS) { nextMove = List(m) maxS = s } else if (s == maxS) { nextMove = m :: nextMove } case Pass => nextMove = List(Pass) } } nextMove(Random.nextInt(nextMove.length)) } val scores = List( 8, 2, 7, 4, 2, 1, 3, 4, 7, 3, 6, 5, 4, 4, 5, 0) def score(x: Int, y: Int): Int = if (x < 4) { if (y < 4) { scores(x + y * 4) } else { scores(x + (7 - y) * 4) } } else { if (y < 4) { scores((7 - x) + y * 4) } else { scores((7 - x) + (7 - y) * 4) } } }
実際に、RandomPlayerとの対戦結果は次のとおり。
D: 802, L: 170, -: 28
D: 185, L: 790, -: 25
先手、後手でも8割近く勝てる。まだ、2割も負けるともいうが。
# 次の手をどこに打つかということをスコアにしているため、このPlayerはreversi専用となっている。
0 件のコメント:
コメントを投稿