예제 #1
0
def print_shortest_path(graph, upperL, lowerL, blockL, dist, pred):
    path = {}
    ord_path = {}
    crawl = []
    paths = min(len(upperL), len(lowerL))  # numnber of paths
    pathl = 0  # largest path length

    # Intialising paths
    for p in range(paths):
        crawl.append(lowerL[p][1:])
        path[lowerL[p]] = [crawl[p]]
        ord_path[lowerL[p]] = [crawl[p]]
    # Adding Predecessors to paths and ordering.
    for p in range(paths):
        while (pred[p][crawl[p]] != -1):
            path[lowerL[p]].append(pred[p][crawl[p]])
            crawl[p] = pred[p][crawl[p]]
            pathl = max(pathl, len(path[lowerL[p]]))
        for i in range(pathl - 1, -1, -1):
            if path[lowerL[p]][i]:
                ord_path[lowerL[p]].append(path[lowerL[p]][i])
    # Printing out pathways
    for i in range(1, pathl):
        for p in range(paths):
            if i + 1 < len(ord_path[lowerL[p]]):
                prev = ord_path[lowerL[p]][i]
                curr = ord_path[lowerL[p]][i + 1]
                if curr in hex_neighbors(prev[0], prev[1], 4):
                    print_slide(i, prev[0], prev[1], curr[0], curr[1])
                else:
                    print_swing(i, prev[0], prev[1], curr[0], curr[1])
예제 #2
0
def print_shortest_path(graph, upperL, lowerL, blockL, dist, pred):
    path = {}
    crawl = []
    paths = min(len(upperL), len(lowerL))

    # Intialising paths
    for p in range(paths):
        #print(lowerL[p][1:])
        crawl.append(lowerL[p][1:])
        path[lowerL[p]] = [crawl[p]]

    for p in range(paths):
        t = 0
        while (pred[p][crawl[p]] != -1):
            path[lowerL[p]].append(pred[p][crawl[p]])
            crawl[p] = pred[p][crawl[p]]
        t += 1

        c = 1
        for i in range(len(path[lowerL[p]]) - 1, -1, -1):
            if path[lowerL[p]][i - 1] != path[lowerL[p]][-1]:
                prev = path[lowerL[p]][i]
                curr = path[lowerL[p]][i - 1]
                if curr in hex_neighbors(prev[0], prev[1], 4):
                    print_slide(c, prev[0], prev[1], curr[0], curr[1])
                else:
                    print_swing(c, prev[0], prev[1], curr[0], curr[1])
            c += 1
예제 #3
0
def main():
    # 1. validate and load input
    try:
        with open(sys.argv[1]) as file:
            state = State.from_json(file)
        state.print("Initial state")
    except (IndexError, FileNotFoundError):
        print("usage: python3 -m search path/to/input.json", file=sys.stderr)
        sys.exit(1)

    # 2. compute solution
    soln = astar_search(
        start=state,
        goal_test=goal_test,
        heuristic=heuristic,
    )

    # 3. print solution
    if soln is not None:
        for t, actions in enumerate(soln, 1):
            for a, x, y in actions:
                if a == "SLIDE":
                    print_slide(t, *x, *y)
                else:
                    print_swing(t, *x, *y)
        print("# Done!")
    else:
        print("# No solution found")
예제 #4
0
def main():
    """
    The main entry point of the program which control the main flow of the 
    simulation of the single player RoPaSci 360 game.
    """

    # Read the data from the given json file and load them into a dictionary
    try:
        with open(sys.argv[1]) as file:
            data = json.load(file)
    except IndexError:
        print("usage: python3 -m search path/to/input.json", file=sys.stderr)
        sys.exit(1)

    # TO-DO:
    # Find and print a solution to the board configuration described
    # by `data`.
    # Why not start by trying to print this configuration out using the
    # `print_board` helper function? (See the `util.py` source code for
    # usage information).

    # Refine the data from the json into separate dictionaries each for a
    # type of token or block in the game
    ally_dict, enemy_dict, block_dict = read_file(data)

    # Run the best first search and find the solution for the problem
    path = best_first_search(ally_dict, enemy_dict, block_dict)

    # Retrace the states and find the actions taken by each token
    prev_state_dict = {}
    time = 0
    for state in path:
        ally_dict, enemy_dict = state

        # Populate the dictonary with states of each tokens in current state
        curr_state_dict = {}
        for key, values in ally_dict.items():
            for token in values:
                curr_state_dict[token] = key

        # Find the actions taken and print it to stdout
        if len(prev_state_dict) != 0:
            for token in curr_state_dict:
                prev_r, prev_q = prev_state_dict[token]
                curr_r, curr_q = curr_state_dict[token]
                distance = hex_distance((prev_r, prev_q), (curr_r, curr_q))
                # It's a slide action
                if distance == 1:
                    print_slide(time, prev_r, prev_q, curr_r, curr_q)
                # It's a swing action
                elif distance == 2:
                    print_swing(time, prev_r, prev_q, curr_r, curr_q)
                else:
                    print("# Unknown Move")

        prev_state_dict = copy.deepcopy(curr_state_dict)
        time += 1
예제 #5
0
 def do(self, board, turn):
     # Does the action to the board
     if self.action_type == 'SLIDE':
         print_slide(turn, self.token.r, self.token.q, self.r, self.q)
         board.move(self.token, self.r, self.q)
     elif self.action_type == 'SWING':
         print_swing(turn, self.token.r, self.token.q,  self.r, self.q)
         board.move(self.token,  self.r, self.q)
     elif self.action_type == "THROW":
         board.throw(self.token)
예제 #6
0
def func_update_state(turn, upper_tuple, state, open_close_dict, sorted_goal_dict):
    # 注意!!!!!!!!!!!!!!!!!!!!!!!random只有写入update close,才逻辑不出错!!!!!下次把这个移动到update close list的地方!!!
    # if upper_tuple already reached the goal
    possible_random_move = []
    if upper_tuple not in sorted_goal_dict.keys():
        # check surroundings to make a best decision
        # print(possible_random_move) --> [[1, -3], [2, -4], [3, -4], [2, -2], [1, -2], [4, -4], [4, -3], [3, -2]]
        possible_random_move = func_open_list(
            state, list(open_close_dict[upper_tuple][1][-1]), ['r', 1, 1], 1)

        if len(possible_random_move) > 1:
            for upper in open_close_dict.keys():
                if upper != upper_tuple:
                    if open_close_dict[upper][1][-1] in possible_random_move:
                        possible_random_move.remove(
                            open_close_dict[upper][1][-1])

        state[tuple(possible_random_move[0])] = upper_tuple[0]
        if slide_or_swing(open_close_dict[upper_tuple][1][-1], possible_random_move[0]) == 'SWING':
            print_swing(turn, open_close_dict[upper_tuple][1][-1][0], open_close_dict[upper_tuple]
                        [1][-1][1], possible_random_move[0][0], possible_random_move[0][1])
        else:
            print_slide(turn, open_close_dict[upper_tuple][1][-1][0], open_close_dict[upper_tuple][1][-1][1],
                        possible_random_move[0][0], possible_random_move[0][1])
        open_close_dict[upper_tuple][1].append(possible_random_move[0])
        # delete the previous position upper token is in the state
        del state[tuple(open_close_dict[upper_tuple][1][-2])]

        if len(possible_random_move) == 1:
            for upper in open_close_dict.keys():
                if upper != upper_tuple and open_close_dict[upper][1][-1] == possible_random_move[0]:

                    # new_possible_move = [[x,y, cost],[]...]
                    new_possible_move = func_open_list(
                        state, open_close_dict[upper][1][-2], ['r', 1, 1], 0)
                    open_close_dict[upper][0] = new_possible_move
                    min_cost_move = func_min_move(open_close_dict, upper)
                    if min_cost_move[0:2] == open_close_dict[upper_tuple][1][-1]:
                        min_cost_move = func_min_move(open_close_dict, upper)
                    open_close_dict[upper][1][-1] = min_cost_move[0:2]
        return state

    else:
        symbol = upper_tuple[0]
        state[tuple(open_close_dict[upper_tuple][1][-1])] = symbol
        if slide_or_swing(open_close_dict[upper_tuple][1][-2], open_close_dict[upper_tuple][1][-1]) == 'SWING':
            print_swing(turn, open_close_dict[upper_tuple][1][-2][0], open_close_dict[upper_tuple][1][-2][1],
                        open_close_dict[upper_tuple][1][-1][0], open_close_dict[upper_tuple][1][-1][1])
        else:
            print_slide(turn, open_close_dict[upper_tuple][1][-2][0], open_close_dict[upper_tuple][1][-2][1],
                        open_close_dict[upper_tuple][1][-1][0], open_close_dict[upper_tuple][1][-1][1])
        del state[tuple(open_close_dict[upper_tuple][1][-2])]
        return state
예제 #7
0
def main():
    try:
        with open(sys.argv[1]) as file:
            data = json.load(file)
    except IndexError:
        print("usage: python3 -m search path/to/input.json", file=sys.stderr)
        sys.exit(1)

    # TEST IF BOARD MOVE WORKS
    firstNode = Node(reformat_board(data), 0, [])
    graph = Graph(firstNode)

    solution = search(graph)
    path = []
    while solution:
        path.insert(0, solution)
        solution = solution.predecessor

    for node in path:
        for p, q in node.moveset:
            if node.distance(p, q) == 1:
                print_slide(node.depth, p[0], p[1], q[0], q[1])
            elif node.distance(p, q) == 2:
                print_swing(node.depth, p[0], p[1], q[0], q[1])