text: from onpolicy.envs.gridworld.gym_minigrid.minigrid import *
  from onpolicy.envs.gridworld.gym_minigrid.register import register
  
  class DoorKeyEnv(MiniGridEnv):
      """
      Environment with a door and key, sparse reward
      """
  
      def __init__(self, size=8):
          super().__init__(
              grid_size=size,
              max_steps=10*size*size
          )
  
      def _gen_grid(self, width, height):
          # Create an empty grid
          self.grid = Grid(width, height)
  
          # Generate the surrounding walls
          self.grid.wall_rect(0, 0, width, height)
  
          # Place a goal in the bottom-right corner
          self.put_obj(Goal(), width - 2, height - 2)
  
          # Create a vertical splitting wall
          splitIdx = self._rand_int(2, width-2)
          self.grid.vert_wall(splitIdx, 0)
  
          # Place the agent at a random position and orientation
          # on the left side of the splitting wall
          self.place_agent(size=(splitIdx, height))
  
          # Place a door in the wall
          doorIdx = self._rand_int(1, width-2)
          self.put_obj(Door('yellow', is_locked=True), splitIdx, doorIdx)
  
          # Place a yellow key on the left side
          self.place_obj(
              obj=Key('yellow'),
              top=(0, 0),
              size=(splitIdx, height)
          )
  
          self.mission = "use the key to open the door and then get to the goal"
  
  class DoorKeyEnv5x5(DoorKeyEnv):
      def __init__(self):
          super().__init__(size=5)
  
  class DoorKeyEnv6x6(DoorKeyEnv):
      def __init__(self):
          super().__init__(size=6)
  
  class DoorKeyEnv16x16(DoorKeyEnv):
      def __init__(self):
          super().__init__(size=16)
  
  register(
      id='MiniGrid-DoorKey-5x5-v0',
      entry_point='onpolicy.envs.gridworld.gym_minigrid.envs:DoorKeyEnv5x5'
  )
  
  register(
      id='MiniGrid-DoorKey-6x6-v0',
      entry_point='onpolicy.envs.gridworld.gym_minigrid.envs:DoorKeyEnv6x6'
  )
  
  register(
      id='MiniGrid-DoorKey-8x8-v0',
      entry_point='onpolicy.envs.gridworld.gym_minigrid.envs:DoorKeyEnv'
  )
  
  register(
      id='MiniGrid-DoorKey-16x16-v0',
      entry_point='onpolicy.envs.gridworld.gym_minigrid.envs:DoorKeyEnv16x16'
  )
  