in gym-minigrid/gym_minigrid/roomgrid.py [0:0]
def connect_all(self, door_colors=COLOR_NAMES, max_itrs=5000):
"""
Make sure that all rooms are reachable by the agent from its
starting position
"""
start_room = self.room_from_pos(*self.agent_pos)
added_doors = []
def find_reach():
reach = set()
stack = [start_room]
while len(stack) > 0:
room = stack.pop()
if room in reach:
continue
reach.add(room)
for i in range(0, 4):
if room.doors[i]:
stack.append(room.neighbors[i])
return reach
num_itrs = 0
while True:
# This is to handle rare situations where random sampling produces
# a level that cannot be connected, producing in an infinite loop
if num_itrs > max_itrs:
raise RecursionError('connect_all failed')
num_itrs += 1
# If all rooms are reachable, stop
reach = find_reach()
if len(reach) == self.num_rows * self.num_cols:
break
# Pick a random room and door position
i = self._rand_int(0, self.num_cols)
j = self._rand_int(0, self.num_rows)
k = self._rand_int(0, 4)
room = self.get_room(i, j)
# If there is already a door there, skip
if not room.door_pos[k] or room.doors[k]:
continue
if room.locked or room.neighbors[k].locked:
continue
color = self._rand_elem(door_colors)
door, _ = self.add_door(i, j, k, color, False)
added_doors.append(door)
return added_doors