from gym_minigrid.minigrid import COLOR_NAMES, MissionSpace from gym_minigrid.roomgrid import RoomGrid class KeyCorridorEnv(RoomGrid): """ A ball is behind a locked door, the key is placed in a random room. """ def __init__(self, num_rows=3, obj_type="ball", room_size=6, **kwargs): self.obj_type = obj_type mission_space = MissionSpace( mission_func=lambda color: f"pick up the {color} {obj_type}", ordered_placeholders=[COLOR_NAMES], ) super().__init__( mission_space=mission_space, room_size=room_size, num_rows=num_rows, max_steps=30 * room_size**2, **kwargs, ) def _gen_grid(self, width, height): super()._gen_grid(width, height) # Connect the middle column rooms into a hallway for j in range(1, self.num_rows): self.remove_wall(1, j, 3) # Add a locked door on the bottom right # Add an object behind the locked door room_idx = self._rand_int(0, self.num_rows) door, _ = self.add_door(2, room_idx, 2, locked=True) obj, _ = self.add_object(2, room_idx, kind=self.obj_type) # Add a key in a random room on the left side self.add_object(0, self._rand_int(0, self.num_rows), "key", door.color) # Place the agent in the middle self.place_agent(1, self.num_rows // 2) # Make sure all rooms are accessible self.connect_all() self.obj = obj self.mission = f"pick up the {obj.color} {obj.type}" def step(self, action): obs, reward, terminated, truncated, info = super().step(action) if action == self.actions.pickup: if self.carrying and self.carrying == self.obj: reward = self._reward() terminated = True return obs, reward, terminated, truncated, info