def update_pos(self, cmd: str): if cmd == 'Start': self._find_R() return new_nesw = (coord.card2num(self.dir) + coord.dir2num(cmd)) % 4 logging.debug('move: {0} {1} ({2}+{3})'.format( self.dir, new_nesw, coord.card2num(self.dir), coord.dir2num(cmd))) self.dir = coord.num2card(new_nesw) self.pos = [sum(x) for x in zip(self.pos, coord.steps(new_nesw))] logging.debug('{0}'.format(self.pos))
def update_map(self, surr: str): for _ in range(coord.card2num(self.dir)): surr = coord.ccw3x3(surr) row, col = self.pos[0], self.pos[1] for i in [row-1, row, row+1]: for j in [col-1, col, col+1]: self.map[i][j] = surr[(i-row+1)*3+(j-col+1)]
def get3x3map(self) -> str: row, col = self.pos[0], self.pos[1] dir = coord.card2num(self.dir) surr = [ self.map[i][j] for i in [row - 1, row, row + 1] for j in [col - 1, col, col + 1] ] for _ in range(dir): surr = coord.cw3x3(surr) return ''.join(surr)
def conv_coord(traj_abs): comp_dir = 'N' traj_rel = [] for i in range(len(traj_abs) - 1): cur = traj_abs[i] next = traj_abs[i + 1] if next[0] == cur[0] - 1: next_comp_dir = 'N' elif next[0] == cur[0] + 1: next_comp_dir = 'S' elif next[1] == cur[1] - 1: next_comp_dir = 'W' elif next[1] == cur[1] + 1: next_comp_dir = 'E' traj_rel.append( coord.num2dir( coord.card2num(next_comp_dir) - coord.card2num(comp_dir))) comp_dir = next_comp_dir return traj_rel
def get_next_move(self) -> str: dir, cur = 'Lost', '?' i, j = self.pos[0], self.pos[1] logging.debug('pos: {0}, {1}'.format(i, j)) logging.debug('{0}{1}{2} {3}{4}{5}'.format(self.map[i-1][j-1], self.map[i-1][j], self.map[i-1][j+1], self.visited[i-1][j-1], self.visited[i-1][j], self.visited[i-1][j+1])) logging.debug('{0}{1}{2} {3}{4}{5}'.format(self.map[i-0][j-1], self.map[i-0][j], self.map[i-0][j+1], self.visited[i-0][j-1], self.visited[i-0][j], self.visited[i-0][j+1])) logging.debug('{0}{1}{2} {3}{4}{5}'.format(self.map[i+1][j-1], self.map[i+1][j], self.map[i+1][j+1], self.visited[i+1][j-1], self.visited[i+1][j], self.visited[i+1][j+1])) if self.map[i-1][j] in 'ROSE' and self.stack[-1] != (i-1, j) and not self.visited[i-1][j]: dir = coord.num2dir(-coord.card2num(self.dir)) self.dir = 'N' self.pos[0] -= 1 self.stack.append((i, j)) self.visited[i-1][j] = True cur = self.map[i-1][j] elif self.map[i][j+1] in 'ROSE' and self.stack[-1] != (i, j+1) and not self.visited[i][j+1]: dir = coord.num2dir(1 - coord.card2num(self.dir)) self.dir = 'E' self.pos[1] += 1 self.stack.append((i, j)) self.visited[i][j+1] = True cur = self.map[i][j+1] elif self.map[i+1][j] in 'ROSE' and self.stack[-1] != (i+1, j) and not self.visited[i+1][j]: dir = coord.num2dir(2 - coord.NESW.index(self.dir)) self.dir = 'S' self.pos[0] += 1 self.stack.append((i, j)) self.visited[i+1][j] = True cur = self.map[i+1][j] elif self.map[i][j-1] in 'ROSE' and self.stack[-1] != (i, j-1) and not self.visited[i][j-1]: dir = coord.num2dir(3 - coord.NESW.index(self.dir)) self.dir = 'W' self.pos[1] -= 1 self.stack.append((i, j)) self.visited[i][j-1] = True cur = self.map[i][j-1] else: next_pos = self.stack.pop() if next_pos[1] > self.pos[1]: next_dir = 'E' elif next_pos[1] < self.pos[1]: next_dir = 'W' elif next_pos[0] < self.pos[0]: next_dir = 'N' elif next_pos[0] > self.pos[0]: next_dir = 'S' else: next_dir = '?' logging.debug('next: {0} {1}'.format(next_pos, next_dir)) logging.debug('stack: {0}'.format(self.stack)) dir = coord.num2dir(coord.card2num(next_dir) - coord.card2num(self.dir)) self.pos = [next_pos[0], next_pos[1]] self.dir = next_dir cur = self.map[i][j] logging.debug('[{0}] next: {1} -> {2} {3}'.format(cur, dir, self.dir, self.pos)) if cur == 'E': self.goal_found = True elif cur == 'S': self.start_found = True return dir