示例#1
0
    def check_move(self, pos):
        if not self.pos_feasible_on_board(pos):
            return False
        
        prev_player_position = self.get_player_position_by_current(current = True)
        if not any(utils.tup_add(prev_player_position, move) == pos for move in self.directions):
            # print('moved from', prev_player_position, 'to', pos)
            return False

        return True
示例#2
0
 def player_cant_move(self, player_id):
     player_pos = self.get_player_position(player_id)
     all_next_positions = [
         utils.tup_add(player_pos, direction)
         for direction in self.directions
     ]
     possible_next_positions = [
         pos for pos in all_next_positions
         if self.pos_feasible_on_board(pos)
     ]
     return len(possible_next_positions) == 0
 def finish_turn(self, best_move, depth):
     new_pos = utils.tup_add(self.pos, best_move[1])
     if new_pos in self.fruits_on_board_dict:
         self.current_player_score += self.fruits_on_board_dict[new_pos]
         del self.fruits_on_board_dict[new_pos]
         ## Add reference to lose
     self.current_turn += 1
     self.board[self.pos[0]][self.pos[1]] = -1
     self.graph.remove_node(self.pos)
     print(
         ' depth: {} my last pos : {} best move is to move to : {} with grade of : {} nodes in graph: {}'
         .format(depth, self.pos, new_pos, best_move[0],
                 len(fetch_connected_nodes(self.graph, new_pos))))
     self.pos = new_pos
     self.board[self.pos[0]][self.pos[1]] = 1
    def make_move(self, time_limit, players_score):
        """Make move with this Player.
        input:
            - time_limit: float, time limit for a single turn.
        output:
            - direction: tuple, specifying the Player's movement, chosen from self.directions
        """
        finish_time = time.time() + self.turn_time

        # if self.pos == (0, 6) or self.pos == (6, 3):
        #     finish_time += 500

        if self.pos == (0, 4):
            finish_time = time.time() + 500
        depth = 1
        best_move = (-np.inf, (-1, 0))
        initial_state = utils.State(self.board, self.graph, (0, 0), self.pos,
                                    self.opponent_pos, self.current_turn,
                                    self.fruits_on_board_dict, finish_time,
                                    None, self.current_player_score,
                                    self.opponent_player_score)
        while True:
            try:
                if depth > 40:
                    finish_time += 500
                best_move = self.minimax_algo.search(initial_state, depth,
                                                     True)
                if best_move[1] == (0, 0):
                    initial_state.board[self.pos[0]][self.pos[1]] = -1
                    poses = [(utils.tup_add(direction, self.pos), direction)
                             for direction in self.directions]
                    valid_poses = list(
                        filter(
                            lambda tup: self.is_move_legal(
                                initial_state, tup[0][0], tup[0][1]), poses))
                    if len(valid_poses) == 0:
                        raise ValueError("No valid moves")
                    return valid_poses[0][1]
                elif (best_move[0] in [-1, 1]):
                    self.finish_turn(best_move, depth)
                    return best_move[1]

            except TimeoutError:
                # TODO: Add reference here for score.
                self.finish_turn(best_move, depth)
                return best_move[1]
            depth += 1