def state(data):
    log.info('message received with %s', data)
    jsonschema.validate(data, json.load(open('./curling/schema.json')))

    board = game.boardFromSchema(data)
    try:
        next_player = c_utils.getNextPlayer(board, c.P1)
    except c_utils.NobodysTurn:
        log.warning("Game over.")
        return
    log.info('Board: %s', game.stringRepresentation(board))
    log.info('Next player: %s', next_player)
    if next_player != AZ_TEAM_OMO:
        return
    log.info('Got board. calculating action')
    sio.emit('set_username', AZ_NAME + " thinking ...")
    action, state = get_best_action_web(board,
                                        use_mcts=True,
                                        player=AZ_TEAM_OMO)
    action['color'] = AZ_COLOR
    action['handle'] *= 0.07

    log.info('responding with action: %s' % (action, ))

    sio.emit('set_username', AZ_NAME)
    sio.emit('shot', action)
    time.sleep(5)
    state = game.getCanonicalForm(state, 0 - AZ_TEAM_OMO)
    sio.emit('set_state', game.boardToSchema(state))
예제 #2
0
    def getValidMoves(self, board, player):
        log.debug(f'Board for player({player}):')
        log.debug(board_utils.getBoardRepr(board))
        board, player = self.getCanonicalForm(board, player), 1
        log.debug(f'Canonicalized for player({player}):')
        log.debug(board_utils.getBoardRepr(board))

        if board_utils.thrownStones(board) >= 16:
            log.error('Board: strRepr' + self.stringRepresentation(board))
            raise GameException('getValidMoves requested after game end.')

        player_turn = utils.getNextPlayer(board, player)

        # Since we got canonical board player_turn should always be 1
        assert player_turn == player, f'Moves requested for player ({player}) do not match next player ({player_turn})'

        all_actions = [1] * self.getActionSize()

        for action in range(self.getActionSize()):
            h, w, b = utils.decodeAction(action)
            if h * b > 0:  # clever hack to check that handle and broom not both positive or both negative.
                all_actions[action] = 0

        if sum(all_actions) == 0:
            log.error('Entered a bad state: no valid moves.')
            raise GameException('No valid moves. This shouldnt happen')
        return all_actions
예제 #3
0
def test_getNextPlayer_4_canonical():
    curl = game.CurlingGame()
    board = curl.getInitBoard()
    board[-1][0] = c.EMPTY
    board[-1][8] = c.EMPTY

    board[-1][1] = c.EMPTY
    board[-1][9] = c.EMPTY

    canon = curl.getCanonicalForm(board, c.P2)
    player = utils.getNextPlayer(canon, c.P2)
    assert player == -1
예제 #4
0
    def addShooterAsInvalid(self):
        # Convert removed_stones variable to something else.
        board = self.getBoard()
        team = utils.getNextPlayer(board, c.P1)
        # player = self.getNextPlayer()  # TODO
        if team == c.P1:
            data_position = getNextStoneId(board)
        else:
            data_position = getNextStoneId(board) + 8

        self.space.thrown_stones[data_position] = c.THROWN
        self.space.inplay_stones[data_position] = c.OUT_OF_PLAY
예제 #5
0
def _nextTurn(board):
    try:
        next_player = utils.getNextPlayer(board, c.P1)
    except utils.NobodysTurn:
        log.warning("Game over.")
        return

    color = c.P1_COLOR if next_player == c.P1 else c.P2_COLOR
    logging.getLogger('curling.utils').setLevel('WARNING')
    best_action = get_best_action(board, player=next_player, use_mcts=True)
    logging.getLogger('curling.utils').setLevel('INFO')
    # best_action = 163
    handle, weight, broom = utils.decodeAction(best_action)
    log.info(f"{color} Throwing ({best_action}) {weight} @ {broom}")


    game.sim.setupAction(next_player, best_action)
예제 #6
0
    def getNextState(self, board, player, action, use_cache=True):
        log.debug(
            f'getNextState({self.stringRepresentation(board)}, {player}, {action}={utils.decodeAction(action)})'
        )

        if use_cache:
            cache_idx = len(list(board_utils.get_stones_in_play(board)))
            log.debug(f"Using cache[{cache_idx}]")
            flip = player == c.P2
            canon = self.getCanonicalForm(board, player)
            cache = self.caches[cache_idx]
            next_board, next_player = cache(canon,
                                            c.P1,
                                            action,
                                            use_cache=False)
            if flip:
                next_board = self.getCanonicalForm(next_board, c.P2)
                next_player = c.P1
            return next_board, next_player

        self.sim.setupBoard(board)

        totalThrownStones_before = self.sim.space.thrownStonesCount()
        assert totalThrownStones_before < 16
        self.sim.setupAction(player, action)
        self.sim.run()
        assert totalThrownStones_before + 1 == self.sim.space.thrownStonesCount(
        ), f"Thrown stone count didn't increase correctly. before: {totalThrownStones_before}. now: {self.sim.space.thrownStonesCount()}"

        next_board = self.sim.getBoard()
        next_player = -player

        if self.sim.space.thrownStonesCount() < 16:
            np_check = utils.getNextPlayer(next_board, next_player)
            if next_player != np_check:
                raise GameException('Next player check failed.')

        return next_board, next_player
예제 #7
0
def test_getNextPlayer_0():
    curl = game.CurlingGame()
    player = utils.getNextPlayer(curl.getInitBoard(), c.P1)
    assert player == 1