import re from config import MAP_NAME, GRID_WIDTH, GRID_HEIGHT, GC_X, GC_Y COORDINATES_LIST = [] MOVES_LIST = [] with open( MAP_NAME, 'r' ) as map: MAP_CONTENT = map.readlines()[2:] MAP_CONTENT = [list(row.strip().replace(" ","")) for row in MAP_CONTENT] moves_mapping = { "pick_garbage": 1, "right": 2, "left": 3, "up": 4, "down": 5 } def parse_list(whole_result,current_x,current_y): global COORDINATES_LIST, MOVES_LIST COORDINATES_LIST = whole_result.copy() moves = [] parser = {'[0,1]':"down",'[0,-1]':"up",'[1,0]':"right",'[-1,0]':"left"} for x in range(len(whole_result)): if whole_result[x]=="pick_garbage": moves.append(whole_result[x]) else: x_subtraction = whole_result[x][0] - current_x y_subtraction = whole_result[x][1] - current_y current_x = whole_result[x][0] current_y = whole_result[x][1] moves.append(parser[f"[{x_subtraction},{y_subtraction}]"]) MOVES_LIST = moves.copy() generate_input(1.0) return moves def generate_input(importance): i = 0 #we'll use it to map coords to moves input_file_content = [] for position in COORDINATES_LIST: coords = check_position(position, i) #set valid gc position #vowpal config goes here label = moves_mapping[MOVES_LIST[i]] tag = re.findall("(map_[0-9]+|map[0-9]+_auto)", MAP_NAME)[0] gc_position = "|GC_Position "+str(coords[0])+","+str(coords[1]) input_line = str(label) + " " + str(importance) + " " + tag + gc_position+" |GC_Area " area = get_gc_area(coords,1) for a in area: input_line += a + " " i += 1 input_file_content.append(input_line) #save to file filename = "./VowPalInputData/input_" + str(tag) + ".txt" input_file = open(filename,"w+") for line in input_file_content: print(line) input_file.write(line+"\n") input_file.close() def get_gc_area(position, radius): area = [] for x in range(max(0, position[0] - radius), min(position[0] + radius + 1, GRID_WIDTH)): #prevents giong abroad for y in range(max(0, position[1] - radius), min(position[1] + radius + 1, GRID_HEIGHT)): if([x,y] == position): #we dont need gc data here continue area.append(MAP_CONTENT[y][x]+"("+str(x)+","+str(y)+")") return area def check_position(position, i): if(type(position) is list): #if position valid, return it return position elif(position == "pick_garbage"): #if invalid, look for recent coords. if not found, return initial coords for j in range(i-1,-1,-1): if(type(COORDINATES_LIST[j]) is list): return COORDINATES_LIST[j] return [GC_X, GC_Y] else: #in case sh t happened print("An error has ocurred while processing GC position.")