def test_legal_moves(self): board = utils_test.load_board(''' .O.O.XOX. O..OOOOOX ......O.O OO.....OX XO.....X. .O....... OX.....OO XX...OOOX .....O.X. ''') position = Position(utils_test.BOARD_SIZE, board=board, to_play=BLACK) illegal_moves = coords_from_kgs_set('A9 E9 J9') legal_moves = coords_from_kgs_set('A4 G1 J1 H7') | {None} for move in illegal_moves: with self.subTest(type='illegal', move=move): self.assertFalse(position.is_move_legal(move)) for move in legal_moves: with self.subTest(type='legal', move=move): self.assertTrue(position.is_move_legal(move)) # check that the bulk legal test agrees with move-by-move illegal test. bulk_legality = position.all_legal_moves() for i, bulk_legal in enumerate(bulk_legality): with self.subTest(type='bulk', move=coords.from_flat(utils_test.BOARD_SIZE, i)): self.assertEqual( bulk_legal, position.is_move_legal( coords.from_flat(utils_test.BOARD_SIZE, i))) # flip the colors and check that everything is still (il)legal position = Position(utils_test.BOARD_SIZE, board=-board, to_play=WHITE) for move in illegal_moves: with self.subTest(type='illegal', move=move): self.assertFalse(position.is_move_legal(move)) for move in legal_moves: with self.subTest(type='legal', move=move): self.assertTrue(position.is_move_legal(move)) bulk_legality = position.all_legal_moves() for i, bulk_legal in enumerate(bulk_legality): with self.subTest(type='bulk', move=coords.from_flat(utils_test.BOARD_SIZE, i)): self.assertEqual( bulk_legal, position.is_move_legal( coords.from_flat(utils_test.BOARD_SIZE, i)))
class Referee(): def __init__(self): self.go = Position(n=9, komi=3.25) def action(self, coord): """ 输入:落子坐标 输出:是否合法,提子列表,胜负(0:未决出胜负,1:胜,-1:负) """ # 判断是否pass if coord == [-1, -1]: self.go = self.go.pass_move() # 检查胜负情况 winner = 0 if self.go.is_game_over(): winner = self.go.result() print(self.go.result_string()) return [True, [], winner] # 检查是否合法 if not self.go.is_move_legal(tuple(coord)): return (False, [], 0) # 棋盘信息备份 preBoard = self.go.board.copy() preBoard[coord[0], coord[1]] = 1 # 落子 self.go = self.go.play_move(tuple(coord)) # 检查是否提子,若提子则存储提子信息到列表 absDiff = np.abs(preBoard) - np.abs(self.go.board) takes = np.transpose(np.nonzero(absDiff)) return (True, takes, 0)
def test_legal_moves(self): board = test_utils.load_board(''' .O.O.XOX. O..OOOOOX ......O.O OO.....OX XO.....X. .O....... OX.....OO XX...OOOX .....O.X. ''') position = Position(board=board, to_play=BLACK) illegal_moves = parse_kgs_coords_set('A9 E9 J9') legal_moves = parse_kgs_coords_set('A4 G1 J1 H7') | {None} for move in illegal_moves: with self.subTest(type='illegal', move=move): self.assertFalse(position.is_move_legal(move)) for move in legal_moves: with self.subTest(type='legal', move=move): self.assertTrue(position.is_move_legal(move)) # check that the bulk legal test agrees with move-by-move illegal test. bulk_legality = position.all_legal_moves() for i, bulk_legal in enumerate(bulk_legality): with self.subTest(type='bulk', move=unflatten_coords(i)): self.assertEqual( bulk_legal, position.is_move_legal(unflatten_coords(i))) # flip the colors and check that everything is still (il)legal position = Position(board=-board, to_play=WHITE) for move in illegal_moves: with self.subTest(type='illegal', move=move): self.assertFalse(position.is_move_legal(move)) for move in legal_moves: with self.subTest(type='legal', move=move): self.assertTrue(position.is_move_legal(move)) bulk_legality = position.all_legal_moves() for i, bulk_legal in enumerate(bulk_legality): with self.subTest(type='bulk', move=unflatten_coords(i)): self.assertEqual( bulk_legal, position.is_move_legal(unflatten_coords(i)))
def simOppLatest(self): """ 从对手的上一步落子开始模拟,在此之前的直接随机抽样,不记录中间过程 """ pb = self.board_opp_known.copy() pb.astype(float) pb = pb + self.basePb # 判断对手棋子总数上限,num_oppStones不能大于上限 board_innerQi = self.findInnerQi() num_oppStoneUpperLimit = 81 - len(np.transpose(np.nonzero(self.board_selfNow))) - len(np.transpose(np.nonzero(board_innerQi))) if self.num_oppStones > num_oppStoneUpperLimit: self.num_oppStones = num_oppStoneUpperLimit # 对手不可能在我方落子处或我方eye处有落子 pb.flat[[i for (i, x) in enumerate(self.board_selfNow.flat) if x == self.color]] = 0 pb.flat[[i for (i, x) in enumerate(board_innerQi.flat) if x == 1]] = 0 if not pb.sum(): return pb = pb / pb.sum() for t in range(200): tmpPb = pb.copy() tmpGo = Position(n=9, board=self.board_selfNow, to_play=-self.color) # 对手落子 for i in range(self.num_oppStones - 1): for ntry in range(5): flatIdx = np.random.choice(self.board_flat_idx, 1, p=tmpPb.flat) action_opp = (int(flatIdx / 9), int(flatIdx % 9)) if not tmpGo.is_move_legal(action_opp): continue preBoard = tmpGo.board.copy() preBoard[action_opp[0], action_opp[1]] = 1 tmpGo_sub = tmpGo.play_move(action_opp) absDiff = np.abs(preBoard) - np.abs(tmpGo_sub.board) if len(np.transpose(np.nonzero(absDiff))): continue tmpGo = tmpGo_sub tmpGo.to_play = -self.color tmpPb.flat[flatIdx] = 0 tmpPb = tmpPb / tmpPb.sum() break # 对手的最后一次落子 for q in range(10): flatIdx = np.random.choice(self.board_flat_idx, 1, p=tmpPb.flat) action_opp = (int(flatIdx / 9), int(flatIdx % 9)) if not tmpGo.is_move_legal(action_opp): continue preBoard = tmpGo.board.copy() preBoard[action_opp[0], action_opp[1]] = 1 tmpGo = tmpGo.play_move(action_opp) absDiff = np.abs(preBoard) - np.abs(tmpGo.board) if len(np.transpose(np.nonzero(absDiff))): continue else: self.board_sims.append(tmpGo) break """