コード例 #1
0
ファイル: go_test.py プロジェクト: chmod600/tl_classify
    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)))
コード例 #2
0
ファイル: Referee.py プロジェクト: toobright/Ghost
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)
コード例 #3
0
ファイル: test_go.py プロジェクト: tcxdgit/minigo
    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)))
コード例 #4
0
ファイル: z_trashBin.py プロジェクト: toobright/Ghost
    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

        """