keycorridor.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from gym_minigrid.roomgrid import RoomGrid
  2. class KeyCorridorEnv(RoomGrid):
  3. """
  4. A ball is behind a locked door, the key is placed in a
  5. random room.
  6. """
  7. def __init__(self, num_rows=3, obj_type="ball", room_size=6, **kwargs):
  8. self.obj_type = obj_type
  9. super().__init__(
  10. room_size=room_size,
  11. num_rows=num_rows,
  12. max_steps=30 * room_size**2,
  13. **kwargs,
  14. )
  15. def _gen_grid(self, width, height):
  16. super()._gen_grid(width, height)
  17. # Connect the middle column rooms into a hallway
  18. for j in range(1, self.num_rows):
  19. self.remove_wall(1, j, 3)
  20. # Add a locked door on the bottom right
  21. # Add an object behind the locked door
  22. room_idx = self._rand_int(0, self.num_rows)
  23. door, _ = self.add_door(2, room_idx, 2, locked=True)
  24. obj, _ = self.add_object(2, room_idx, kind=self.obj_type)
  25. # Add a key in a random room on the left side
  26. self.add_object(0, self._rand_int(0, self.num_rows), "key", door.color)
  27. # Place the agent in the middle
  28. self.place_agent(1, self.num_rows // 2)
  29. # Make sure all rooms are accessible
  30. self.connect_all()
  31. self.obj = obj
  32. self.mission = f"pick up the {obj.color} {obj.type}"
  33. def step(self, action):
  34. obs, reward, done, info = super().step(action)
  35. if action == self.actions.pickup:
  36. if self.carrying and self.carrying == self.obj:
  37. reward = self._reward()
  38. done = True
  39. return obs, reward, done, info