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)
예제 #2
0
 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