def scan_line(self, line: LineToMiddle, _first_iteration: bool = True): # TODO: remove when work if _first_iteration: raise NotImplementedError() # end remove if line.is_finished(): raise ValueError("cannot scan finished line") line_start_coordinates = line.start_coordinates.copy() if _first_iteration: if self.robot_coordinates != line_start_coordinates: raise ValueError("scanner assume that robot is at line start") if not self.robot.has_block(): raise ValueError("scanner assume that robot has block") to_block_direction = line.get_to_block_direction() from_block_direction = line.get_from_block_direction() before_block_coordinates = line.get_next_block_position( ).create_neighbour_coordinate(from_block_direction) if _first_iteration: if self._move_to_block_towards_inside(to_block_direction, from_block_direction, line, before_block_coordinates): return else: if self.robot_coordinates.get_straight_distance_to_other( to_block_direction, before_block_coordinates) > 0: if self._move_to_block_towards_inside( to_block_direction, from_block_direction, line, before_block_coordinates): return else: self._move_to_block_from_inside(from_block_direction, before_block_coordinates) while True: # we need to rotate in case we were not if self.robot.rotation != to_block_direction: self.shared_actions_executor.try_rotate_robot( to_block_direction) # if we are just before position to put block and correctly rotated hit_information = self.shared_actions_executor.try_put_block( to_block_direction) if hit_information.hit_type == HitType.PLACED_BLOCK: line.place_block() break elif hit_information.hit_type == HitType.BLOCK: # when another robot already put this block line.place_block() if line.is_finished(): break before_block_coordinates = line.get_next_block_position(). \ create_neighbour_coordinate(from_block_direction) self._move_to_block_from_inside(from_block_direction, before_block_coordinates) continue else: raise ValueError( "different tile type cannot be on position where block will be added" ) self._go_back_to_start_line(from_block_direction, line)
def _put_block_on_map(self, line: LineToMiddle) -> Coordinates: placed_block_position = line.place_block() try: self.private_grid.add_tile_to_grid(Tile(TileType.BLOCK), placed_block_position) except Exception as e: print(f"WARNING: {e}") return placed_block_position
def _put_block_on_map(self, line: LineToMiddle) -> Coordinates: placed_block_position = line.place_block() self.private_grid.add_tile_to_grid(Tile(TileType.BLOCK), placed_block_position) return placed_block_position