123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- from gym import spaces
- from gym_minigrid.minigrid import *
- from gym_minigrid.register import register
- class Room:
- def __init__(self,
- top,
- size,
- doorPos
- ):
- self.top = top
- self.size = size
- self.doorPos = doorPos
- self.color = None
- self.locked = False
- def rand_pos(self, env):
- topX, topY = self.top
- sizeX, sizeY = self.size
- return env._rand_pos(
- topX + 1, topX + sizeX - 1,
- topY + 1, topY + sizeY - 1
- )
- class LockedRoom(MiniGridEnv):
- """
- Environment in which the agent is instructed to go to a given object
- named using an English text string
- """
- def __init__(
- self,
- size=19
- ):
- super().__init__(grid_size=size, max_steps=10*size)
- def _gen_grid(self, width, height):
- # Create the grid
- self.grid = Grid(width, height)
- # Generate the surrounding walls
- for i in range(0, width):
- self.grid.set(i, 0, Wall())
- self.grid.set(i, height-1, Wall())
- for j in range(0, height):
- self.grid.set(0, j, Wall())
- self.grid.set(width-1, j, Wall())
- # Hallway walls
- lWallIdx = width // 2 - 2
- rWallIdx = width // 2 + 2
- for j in range(0, height):
- self.grid.set(lWallIdx, j, Wall())
- self.grid.set(rWallIdx, j, Wall())
- self.rooms = []
- # Room splitting walls
- for n in range(0, 3):
- j = n * (height // 3)
- for i in range(0, lWallIdx):
- self.grid.set(i, j, Wall())
- for i in range(rWallIdx, width):
- self.grid.set(i, j, Wall())
- roomW = lWallIdx + 1
- roomH = height // 3 + 1
- self.rooms.append(Room(
- (0, j),
- (roomW, roomH),
- (lWallIdx, j + 3)
- ))
- self.rooms.append(Room(
- (rWallIdx, j),
- (roomW, roomH),
- (rWallIdx, j + 3)
- ))
- # Choose one random room to be locked
- lockedRoom = self._rand_elem(self.rooms)
- lockedRoom.locked = True
- goalPos = lockedRoom.rand_pos(self)
- self.grid.set(*goalPos, Goal())
- # Assign the door colors
- colors = set(COLOR_NAMES)
- for room in self.rooms:
- color = self._rand_elem(sorted(colors))
- colors.remove(color)
- room.color = color
- if room.locked:
- self.grid.set(*room.doorPos, Door(color, is_locked=True))
- else:
- self.grid.set(*room.doorPos, Door(color))
- # Select a random room to contain the key
- while True:
- keyRoom = self._rand_elem(self.rooms)
- if keyRoom != lockedRoom:
- break
- keyPos = keyRoom.rand_pos(self)
- self.grid.set(*keyPos, Key(lockedRoom.color))
- # Randomize the player start position and orientation
- self.agent_pos = self.place_agent(
- top=(lWallIdx, 0),
- size=(rWallIdx-lWallIdx, height)
- )
- # Generate the mission string
- self.mission = (
- 'get the %s key from the %s room, '
- 'unlock the %s door and '
- 'go to the goal'
- ) % (lockedRoom.color, keyRoom.color, lockedRoom.color)
- def step(self, action):
- obs, reward, done, info = MiniGridEnv.step(self, action)
- return obs, reward, done, info
- register(
- id='MiniGrid-LockedRoom-v0',
- entry_point='gym_minigrid.envs:LockedRoom'
- )
|