doorkey.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from gym_minigrid.minigrid import *
  2. from gym_minigrid.register import register
  3. class DoorKeyEnv(MiniGridEnv):
  4. """
  5. Environment with a door and key, sparse reward
  6. """
  7. def __init__(self, size=8):
  8. super().__init__(gridSize=size, maxSteps=4 * size)
  9. def _genGrid(self, width, height):
  10. grid = super()._genGrid(width, height)
  11. assert width == height
  12. gridSz = width
  13. # Create a vertical splitting wall
  14. splitIdx = self._randInt(2, gridSz-2)
  15. for i in range(0, gridSz):
  16. grid.set(splitIdx, i, Wall())
  17. # Place the agent at a random position and orientation
  18. self.startPos = self._randPos(
  19. 1, splitIdx,
  20. 1, gridSz-1
  21. )
  22. self.startDir = self._randInt(0, 4)
  23. # Place a door in the wall
  24. doorIdx = self._randInt(1, gridSz-2)
  25. grid.set(splitIdx, doorIdx, LockedDoor('yellow'))
  26. # Place a yellow key on the left side
  27. while True:
  28. pos = self._randPos(
  29. 1, splitIdx,
  30. 1, gridSz-1
  31. )
  32. if pos == self.startPos:
  33. continue
  34. if grid.get(*pos) != None:
  35. continue
  36. grid.set(*pos, Key('yellow'))
  37. break
  38. return grid
  39. class DoorKeyEnv5x5(DoorKeyEnv):
  40. def __init__(self):
  41. super().__init__(size=5)
  42. class DoorKeyEnv6x6(DoorKeyEnv):
  43. def __init__(self):
  44. super().__init__(size=6)
  45. class DoorKeyEnv16x16(DoorKeyEnv):
  46. def __init__(self):
  47. super().__init__(size=16)
  48. register(
  49. id='MiniGrid-DoorKey-5x5-v0',
  50. entry_point='gym_minigrid.envs:DoorKeyEnv5x5'
  51. )
  52. register(
  53. id='MiniGrid-DoorKey-6x6-v0',
  54. entry_point='gym_minigrid.envs:DoorKeyEnv6x6'
  55. )
  56. register(
  57. id='MiniGrid-DoorKey-8x8-v0',
  58. entry_point='gym_minigrid.envs:DoorKeyEnv'
  59. )
  60. register(
  61. id='MiniGrid-DoorKey-16x16-v0',
  62. entry_point='gym_minigrid.envs:DoorKeyEnv16x16'
  63. )