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))
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
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
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
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)
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
def test_getNextPlayer_0(): curl = game.CurlingGame() player = utils.getNextPlayer(curl.getInitBoard(), c.P1) assert player == 1