miniworld-maze 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of miniworld-maze might be problematic. Click here for more details.

Files changed (280) hide show
  1. miniworld_maze/__init__.py +37 -0
  2. miniworld_maze/core/__init__.py +8 -0
  3. miniworld_maze/core/constants.py +130 -0
  4. miniworld_maze/core/miniworld_gymnasium/README.md +1 -0
  5. miniworld_maze/core/miniworld_gymnasium/__init__.py +4 -0
  6. miniworld_maze/core/miniworld_gymnasium/base_env.py +52 -0
  7. miniworld_maze/core/miniworld_gymnasium/entities/__init__.py +7 -0
  8. miniworld_maze/core/miniworld_gymnasium/entities/agent.py +117 -0
  9. miniworld_maze/core/miniworld_gymnasium/entities/base_entity.py +135 -0
  10. miniworld_maze/core/miniworld_gymnasium/entities/objects.py +116 -0
  11. miniworld_maze/core/miniworld_gymnasium/entity_manager.py +358 -0
  12. miniworld_maze/core/miniworld_gymnasium/envs/__init__.py +3 -0
  13. miniworld_maze/core/miniworld_gymnasium/math.py +83 -0
  14. miniworld_maze/core/miniworld_gymnasium/objmesh.py +294 -0
  15. miniworld_maze/core/miniworld_gymnasium/occlusion_queries.py +97 -0
  16. miniworld_maze/core/miniworld_gymnasium/opengl.py +21 -0
  17. miniworld_maze/core/miniworld_gymnasium/params.py +128 -0
  18. miniworld_maze/core/miniworld_gymnasium/random.py +105 -0
  19. miniworld_maze/core/miniworld_gymnasium/rendering/__init__.py +7 -0
  20. miniworld_maze/core/miniworld_gymnasium/rendering/drawing.py +77 -0
  21. miniworld_maze/core/miniworld_gymnasium/rendering/framebuffer.py +260 -0
  22. miniworld_maze/core/miniworld_gymnasium/rendering/texture.py +101 -0
  23. miniworld_maze/core/miniworld_gymnasium/rendering_engine.py +293 -0
  24. miniworld_maze/core/miniworld_gymnasium/room.py +330 -0
  25. miniworld_maze/core/miniworld_gymnasium/texture_utils.py +64 -0
  26. miniworld_maze/core/miniworld_gymnasium/textures/airduct_grate_1.png +0 -0
  27. miniworld_maze/core/miniworld_gymnasium/textures/asphalt_1.png +0 -0
  28. miniworld_maze/core/miniworld_gymnasium/textures/beanpaste_1.png +0 -0
  29. miniworld_maze/core/miniworld_gymnasium/textures/beige_1.png +0 -0
  30. miniworld_maze/core/miniworld_gymnasium/textures/black_1.png +0 -0
  31. miniworld_maze/core/miniworld_gymnasium/textures/blueberry_1.png +0 -0
  32. miniworld_maze/core/miniworld_gymnasium/textures/brick_wall_1.png +0 -0
  33. miniworld_maze/core/miniworld_gymnasium/textures/cardboard_1.png +0 -0
  34. miniworld_maze/core/miniworld_gymnasium/textures/cardboard_2.png +0 -0
  35. miniworld_maze/core/miniworld_gymnasium/textures/cardboard_3.png +0 -0
  36. miniworld_maze/core/miniworld_gymnasium/textures/cardboard_4.png +0 -0
  37. miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tile_noborder_1.png +0 -0
  38. miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tiles_1.png +0 -0
  39. miniworld_maze/core/miniworld_gymnasium/textures/cinder_blocks_1.png +0 -0
  40. miniworld_maze/core/miniworld_gymnasium/textures/cobaltgreen_1.png +0 -0
  41. miniworld_maze/core/miniworld_gymnasium/textures/concrete_1.png +0 -0
  42. miniworld_maze/core/miniworld_gymnasium/textures/concrete_2.png +0 -0
  43. miniworld_maze/core/miniworld_gymnasium/textures/concrete_3.png +0 -0
  44. miniworld_maze/core/miniworld_gymnasium/textures/concrete_4.png +0 -0
  45. miniworld_maze/core/miniworld_gymnasium/textures/concrete_tiles_1.png +0 -0
  46. miniworld_maze/core/miniworld_gymnasium/textures/copperred_1.png +0 -0
  47. miniworld_maze/core/miniworld_gymnasium/textures/crimson_1.png +0 -0
  48. miniworld_maze/core/miniworld_gymnasium/textures/door_doom_1.png +0 -0
  49. miniworld_maze/core/miniworld_gymnasium/textures/door_doom_2.png +0 -0
  50. miniworld_maze/core/miniworld_gymnasium/textures/door_garage_red.png +0 -0
  51. miniworld_maze/core/miniworld_gymnasium/textures/door_garage_white.png +0 -0
  52. miniworld_maze/core/miniworld_gymnasium/textures/door_steel_brown.png +0 -0
  53. miniworld_maze/core/miniworld_gymnasium/textures/door_steel_grey.png +0 -0
  54. miniworld_maze/core/miniworld_gymnasium/textures/door_steel_red.png +0 -0
  55. miniworld_maze/core/miniworld_gymnasium/textures/drywall_1.png +0 -0
  56. miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_bw_1.png +0 -0
  57. miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_white.png +0 -0
  58. miniworld_maze/core/miniworld_gymnasium/textures/grass_1.png +0 -0
  59. miniworld_maze/core/miniworld_gymnasium/textures/grass_2.png +0 -0
  60. miniworld_maze/core/miniworld_gymnasium/textures/lava_1.png +0 -0
  61. miniworld_maze/core/miniworld_gymnasium/textures/lava_2.png +0 -0
  62. miniworld_maze/core/miniworld_gymnasium/textures/lemongrass_1.png +0 -0
  63. miniworld_maze/core/miniworld_gymnasium/textures/lightbeige_1.png +0 -0
  64. miniworld_maze/core/miniworld_gymnasium/textures/lightcobaltgreen_1.png +0 -0
  65. miniworld_maze/core/miniworld_gymnasium/textures/lightgray_1.png +0 -0
  66. miniworld_maze/core/miniworld_gymnasium/textures/lightnavyblue_1.png +0 -0
  67. miniworld_maze/core/miniworld_gymnasium/textures/lightskyblue_1.png +0 -0
  68. miniworld_maze/core/miniworld_gymnasium/textures/lime_1.png +0 -0
  69. miniworld_maze/core/miniworld_gymnasium/textures/logo_mila_1.png +0 -0
  70. miniworld_maze/core/miniworld_gymnasium/textures/magenta_1.png +0 -0
  71. miniworld_maze/core/miniworld_gymnasium/textures/marble_1.png +0 -0
  72. miniworld_maze/core/miniworld_gymnasium/textures/marble_2.png +0 -0
  73. miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_1.png +0 -0
  74. miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_2.png +0 -0
  75. miniworld_maze/core/miniworld_gymnasium/textures/morningglory_1.png +0 -0
  76. miniworld_maze/core/miniworld_gymnasium/textures/navyblue_1.png +0 -0
  77. miniworld_maze/core/miniworld_gymnasium/textures/oakbrown_1.png +0 -0
  78. miniworld_maze/core/miniworld_gymnasium/textures/orange_1.png +0 -0
  79. miniworld_maze/core/miniworld_gymnasium/textures/orchid_1.png +0 -0
  80. miniworld_maze/core/miniworld_gymnasium/textures/picket_fence_1.png +0 -0
  81. miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.license +2 -0
  82. miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.png +0 -0
  83. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.license +2 -0
  84. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.png +0 -0
  85. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.license +2 -0
  86. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.png +0 -0
  87. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.license +2 -0
  88. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.png +0 -0
  89. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.license +2 -0
  90. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.png +0 -0
  91. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.license +2 -0
  92. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.png +0 -0
  93. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.license +2 -0
  94. miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.png +0 -0
  95. miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.license +2 -0
  96. miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.png +0 -0
  97. miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.license +2 -0
  98. miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.png +0 -0
  99. miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.license +2 -0
  100. miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.png +0 -0
  101. miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.license +2 -0
  102. miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.png +0 -0
  103. miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.license +2 -0
  104. miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.png +0 -0
  105. miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.license +2 -0
  106. miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.png +0 -0
  107. miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.license +2 -0
  108. miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.png +0 -0
  109. miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.license +2 -0
  110. miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.png +0 -0
  111. miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.license +2 -0
  112. miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.png +0 -0
  113. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.license +2 -0
  114. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.png +0 -0
  115. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.license +2 -0
  116. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.png +0 -0
  117. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.license +2 -0
  118. miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.png +0 -0
  119. miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.license +2 -0
  120. miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.png +0 -0
  121. miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.license +2 -0
  122. miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.png +0 -0
  123. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.license +2 -0
  124. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.png +0 -0
  125. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.license +2 -0
  126. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.png +0 -0
  127. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.license +2 -0
  128. miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.png +0 -0
  129. miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.license +2 -0
  130. miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.png +0 -0
  131. miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.license +2 -0
  132. miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.png +0 -0
  133. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.license +2 -0
  134. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.png +0 -0
  135. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.license +2 -0
  136. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.png +0 -0
  137. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.license +2 -0
  138. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.png +0 -0
  139. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.license +2 -0
  140. miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.png +0 -0
  141. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.license +2 -0
  142. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.png +0 -0
  143. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.license +2 -0
  144. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.png +0 -0
  145. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.license +2 -0
  146. miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.png +0 -0
  147. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.license +2 -0
  148. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.png +0 -0
  149. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.license +2 -0
  150. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.png +0 -0
  151. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.license +2 -0
  152. miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.png +0 -0
  153. miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.license +2 -0
  154. miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.png +0 -0
  155. miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.license +2 -0
  156. miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.png +0 -0
  157. miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.license +2 -0
  158. miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.png +0 -0
  159. miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.license +2 -0
  160. miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.png +0 -0
  161. miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.license +2 -0
  162. miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.png +0 -0
  163. miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.license +2 -0
  164. miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.png +0 -0
  165. miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.license +2 -0
  166. miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.png +0 -0
  167. miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.license +2 -0
  168. miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.png +0 -0
  169. miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.license +2 -0
  170. miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.png +0 -0
  171. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.license +2 -0
  172. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.png +0 -0
  173. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.license +2 -0
  174. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.png +0 -0
  175. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.license +2 -0
  176. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.png +0 -0
  177. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.license +2 -0
  178. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.png +0 -0
  179. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.license +2 -0
  180. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.png +0 -0
  181. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.license +2 -0
  182. miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.png +0 -0
  183. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.license +2 -0
  184. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.png +0 -0
  185. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.license +2 -0
  186. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.png +0 -0
  187. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.license +2 -0
  188. miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.png +0 -0
  189. miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.license +2 -0
  190. miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.png +0 -0
  191. miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.license +2 -0
  192. miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.png +0 -0
  193. miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.license +2 -0
  194. miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.png +0 -0
  195. miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.license +2 -0
  196. miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.png +0 -0
  197. miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.license +2 -0
  198. miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.png +0 -0
  199. miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.license +2 -0
  200. miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.png +0 -0
  201. miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.license +2 -0
  202. miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.png +0 -0
  203. miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.license +2 -0
  204. miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.png +0 -0
  205. miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.license +2 -0
  206. miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.png +0 -0
  207. miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.license +2 -0
  208. miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.png +0 -0
  209. miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.license +2 -0
  210. miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.png +0 -0
  211. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.license +2 -0
  212. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.png +0 -0
  213. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.license +2 -0
  214. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.png +0 -0
  215. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.license +2 -0
  216. miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.png +0 -0
  217. miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.license +2 -0
  218. miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.png +0 -0
  219. miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.license +2 -0
  220. miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.png +0 -0
  221. miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.license +2 -0
  222. miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.png +0 -0
  223. miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.license +2 -0
  224. miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.png +0 -0
  225. miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.license +2 -0
  226. miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.png +0 -0
  227. miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.license +2 -0
  228. miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.png +0 -0
  229. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.license +2 -0
  230. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.png +0 -0
  231. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.license +2 -0
  232. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.png +0 -0
  233. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.license +2 -0
  234. miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.png +0 -0
  235. miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.license +2 -0
  236. miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.png +0 -0
  237. miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.license +2 -0
  238. miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.png +0 -0
  239. miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.license +2 -0
  240. miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.png +0 -0
  241. miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.license +2 -0
  242. miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.png +0 -0
  243. miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.license +2 -0
  244. miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.png +0 -0
  245. miniworld_maze/core/miniworld_gymnasium/textures/realblueberry_1.png +0 -0
  246. miniworld_maze/core/miniworld_gymnasium/textures/redbean_1.png +0 -0
  247. miniworld_maze/core/miniworld_gymnasium/textures/rock_1.png +0 -0
  248. miniworld_maze/core/miniworld_gymnasium/textures/seablue_1.png +0 -0
  249. miniworld_maze/core/miniworld_gymnasium/textures/silver_1.png +0 -0
  250. miniworld_maze/core/miniworld_gymnasium/textures/skyblue_1.png +0 -0
  251. miniworld_maze/core/miniworld_gymnasium/textures/slime_1.png +0 -0
  252. miniworld_maze/core/miniworld_gymnasium/textures/stucco_1.png +0 -0
  253. miniworld_maze/core/miniworld_gymnasium/textures/sunnyyellow_1.png +0 -0
  254. miniworld_maze/core/miniworld_gymnasium/textures/turquoise_1.png +0 -0
  255. miniworld_maze/core/miniworld_gymnasium/textures/violet_1.png +0 -0
  256. miniworld_maze/core/miniworld_gymnasium/textures/water_1.png +0 -0
  257. miniworld_maze/core/miniworld_gymnasium/textures/water_2.png +0 -0
  258. miniworld_maze/core/miniworld_gymnasium/textures/water_3.png +0 -0
  259. miniworld_maze/core/miniworld_gymnasium/textures/white_1.png +0 -0
  260. miniworld_maze/core/miniworld_gymnasium/textures/wood_1.png +0 -0
  261. miniworld_maze/core/miniworld_gymnasium/textures/wood_2.png +0 -0
  262. miniworld_maze/core/miniworld_gymnasium/textures/wood_planks_1.png +0 -0
  263. miniworld_maze/core/miniworld_gymnasium/unified_env.py +1364 -0
  264. miniworld_maze/core/miniworld_gymnasium/utils.py +37 -0
  265. miniworld_maze/core/miniworld_gymnasium/wrappers.py +2 -0
  266. miniworld_maze/core/observation_types.py +32 -0
  267. miniworld_maze/environments/__init__.py +16 -0
  268. miniworld_maze/environments/base_grid_rooms.py +204 -0
  269. miniworld_maze/environments/factory.py +155 -0
  270. miniworld_maze/environments/nine_rooms.py +74 -0
  271. miniworld_maze/environments/spiral_nine_rooms.py +70 -0
  272. miniworld_maze/environments/twenty_five_rooms.py +122 -0
  273. miniworld_maze/tools/__init__.py +5 -0
  274. miniworld_maze/tools/generate_observations.py +199 -0
  275. miniworld_maze/wrappers/__init__.py +5 -0
  276. miniworld_maze/wrappers/image_transforms.py +40 -0
  277. miniworld_maze-1.0.0.dist-info/METADATA +108 -0
  278. miniworld_maze-1.0.0.dist-info/RECORD +280 -0
  279. miniworld_maze-1.0.0.dist-info/WHEEL +4 -0
  280. miniworld_maze-1.0.0.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,122 @@
1
+ """TwentyFiveRooms environment implementation."""
2
+
3
+ from ..core import ObservationLevel
4
+ from .base_grid_rooms import GridRoomsEnvironment
5
+
6
+
7
+ class TwentyFiveRooms(GridRoomsEnvironment):
8
+ """
9
+ Traverse the 25 rooms
10
+
11
+ ---------------------
12
+ | 0 | 1 | 2 | 3 | 4 |
13
+ ---------------------
14
+ | 5 | 6 | 7 | 8 | 9 |
15
+ ---------------------
16
+ |10 |11 |12 |13 |14 |
17
+ ---------------------
18
+ |15 |16 |17 |18 |19 |
19
+ ---------------------
20
+ |20 |21 |22 |23 |24 |
21
+ ---------------------
22
+ """
23
+
24
+ def __init__(
25
+ self,
26
+ connections=None,
27
+ textures=None,
28
+ placed_room=None,
29
+ obs_level=ObservationLevel.TOP_DOWN_PARTIAL,
30
+ continuous=False,
31
+ room_size=5,
32
+ door_size=2,
33
+ agent_mode=None,
34
+ obs_width=80,
35
+ obs_height=80,
36
+ **kwargs,
37
+ ):
38
+ # Default configuration for TwentyFiveRooms
39
+ default_connections = [
40
+ (0, 1),
41
+ (0, 5),
42
+ (1, 2),
43
+ (1, 6),
44
+ (2, 3),
45
+ (2, 7),
46
+ (3, 4),
47
+ (3, 8),
48
+ (4, 9),
49
+ (5, 6),
50
+ (5, 10),
51
+ (6, 7),
52
+ (6, 11),
53
+ (7, 8),
54
+ (7, 12),
55
+ (8, 9),
56
+ (8, 13),
57
+ (9, 14),
58
+ (10, 11),
59
+ (10, 15),
60
+ (11, 12),
61
+ (11, 16),
62
+ (12, 13),
63
+ (12, 17),
64
+ (13, 14),
65
+ (13, 18),
66
+ (14, 19),
67
+ (15, 16),
68
+ (15, 20),
69
+ (16, 17),
70
+ (16, 21),
71
+ (17, 18),
72
+ (17, 22),
73
+ (18, 19),
74
+ (18, 23),
75
+ (19, 24),
76
+ (20, 21),
77
+ (21, 22),
78
+ (22, 23),
79
+ (23, 24),
80
+ ]
81
+ default_textures = [
82
+ "crimson",
83
+ "beanpaste",
84
+ "cobaltgreen",
85
+ "lightnavyblue",
86
+ "skyblue",
87
+ "lightcobaltgreen",
88
+ "oakbrown",
89
+ "copperred",
90
+ "lightgray",
91
+ "lime",
92
+ "turquoise",
93
+ "violet",
94
+ "beige",
95
+ "morningglory",
96
+ "silver",
97
+ "magenta",
98
+ "sunnyyellow",
99
+ "blueberry",
100
+ "lightbeige",
101
+ "seablue",
102
+ "lemongrass",
103
+ "orchid",
104
+ "redbean",
105
+ "orange",
106
+ "realblueberry",
107
+ ]
108
+
109
+ super().__init__(
110
+ grid_size=5,
111
+ connections=connections or default_connections,
112
+ textures=textures or default_textures,
113
+ placed_room=placed_room,
114
+ obs_level=obs_level,
115
+ continuous=continuous,
116
+ room_size=room_size,
117
+ door_size=door_size,
118
+ agent_mode=agent_mode,
119
+ obs_width=obs_width,
120
+ obs_height=obs_height,
121
+ **kwargs,
122
+ )
@@ -0,0 +1,5 @@
1
+ """Tools for Nine Rooms environments."""
2
+
3
+ from .generate_observations import generate_observations, main
4
+
5
+ __all__ = ["generate_observations", "main"]
@@ -0,0 +1,199 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Generate comprehensive observations for Nine Rooms environment variants.
4
+ Supports: NineRooms, SpiralNineRooms, TwentyFiveRooms
5
+ """
6
+
7
+ import argparse
8
+ import os
9
+
10
+ import numpy as np
11
+ from PIL import Image
12
+
13
+ from ..core import FrameBuffer
14
+ from ..environments.factory import create_nine_rooms_env
15
+
16
+
17
+ def generate_observations(variant, output_dir=None, high_res_full_views=False):
18
+ """Generate comprehensive observations for the specified environment variant."""
19
+ if output_dir is None:
20
+ output_dir = f"{variant.lower()}_observations"
21
+
22
+ os.makedirs(output_dir, exist_ok=True)
23
+
24
+ # Create environment
25
+ env = create_nine_rooms_env(variant=variant, size=64)
26
+
27
+ # Get base environment for direct render access
28
+ base_env = getattr(env, 'env', getattr(env, '_env', env))
29
+ while hasattr(base_env, "env") or hasattr(base_env, "_env"):
30
+ if hasattr(base_env, "env"):
31
+ base_env = base_env.env
32
+ elif hasattr(base_env, "_env"):
33
+ base_env = base_env._env
34
+ else:
35
+ break
36
+
37
+ # Reset environment
38
+ obs, _ = env.reset(seed=42)
39
+
40
+ # Create high-resolution frame buffer if requested
41
+ high_res_fb = None
42
+ if high_res_full_views:
43
+ high_res_fb = FrameBuffer(512, 512, 8)
44
+
45
+ # === FULL ENVIRONMENT OBSERVATIONS ===
46
+
47
+ # 1. Full view with agent at starting position
48
+ if high_res_full_views:
49
+ full_view_start = base_env.render_top_view(
50
+ frame_buffer=high_res_fb, POMDP=False
51
+ )
52
+ else:
53
+ full_view_start = base_env.render_top_view(POMDP=False)
54
+ Image.fromarray(full_view_start).save(f"{output_dir}/full_view_start.png")
55
+
56
+ # 2. Full view without agent (clean maze view)
57
+ if high_res_full_views:
58
+ full_view_clean = base_env.render_top_view(
59
+ frame_buffer=high_res_fb, POMDP=False, render_ag=False
60
+ )
61
+ else:
62
+ full_view_clean = base_env.render_top_view(POMDP=False, render_ag=False)
63
+ Image.fromarray(full_view_clean).save(f"{output_dir}/full_view_clean.png")
64
+
65
+ # 3. Full view with agent in center
66
+ center_x = (base_env.min_x + base_env.max_x) / 2
67
+ center_z = (base_env.min_z + base_env.max_z) / 2
68
+ base_env.place_agent(pos=[center_x, 0.0, center_z])
69
+ if high_res_full_views:
70
+ full_view_center = base_env.render_top_view(
71
+ frame_buffer=high_res_fb, POMDP=False
72
+ )
73
+ else:
74
+ full_view_center = base_env.render_top_view(POMDP=False)
75
+ Image.fromarray(full_view_center).save(f"{output_dir}/full_view_center.png")
76
+
77
+ # === PARTIAL OBSERVATIONS ===
78
+
79
+ # Reset agent to start position
80
+ base_env.place_agent(pos=[2.5, 0.0, 2.5])
81
+
82
+ # 1. Partial view from starting position
83
+ partial_start = base_env.render_top_view(POMDP=True)
84
+ Image.fromarray(partial_start).save(f"{output_dir}/partial_start.png")
85
+
86
+ # 2. Partial view from center
87
+ base_env.place_agent(pos=[center_x, 0.0, center_z])
88
+ partial_center = base_env.render_top_view(POMDP=True)
89
+ Image.fromarray(partial_center).save(f"{output_dir}/partial_center.png")
90
+
91
+ # 3. Partial view from corner/edge
92
+ corner_x = base_env.max_x - 2.5
93
+ corner_z = base_env.max_z - 2.5
94
+ base_env.place_agent(pos=[corner_x, 0.0, corner_z])
95
+ partial_corner = base_env.render_top_view(POMDP=True)
96
+ Image.fromarray(partial_corner).save(f"{output_dir}/partial_corner.png")
97
+
98
+ # 4. Partial view at strategic location
99
+ if variant == "NineRooms":
100
+ strategic_x, strategic_z = 15.0, 7.5 # Room boundary
101
+ elif variant == "SpiralNineRooms":
102
+ strategic_x, strategic_z = 22.5, 15.0 # Center of spiral
103
+ else: # TwentyFiveRooms
104
+ strategic_x, strategic_z = 37.5, 37.5 # Mid-outer area
105
+
106
+ base_env.place_agent(pos=[strategic_x, 0.0, strategic_z])
107
+ partial_strategic = base_env.render_top_view(POMDP=True)
108
+ Image.fromarray(partial_strategic).save(f"{output_dir}/partial_strategic.png")
109
+
110
+ # === WRAPPED OBSERVATIONS ===
111
+
112
+ # Reset environment
113
+ obs, _ = env.reset(seed=42)
114
+
115
+ # 1. Standard gymnasium observation
116
+ obs_hwc = np.transpose(obs, (1, 2, 0))
117
+ Image.fromarray(obs_hwc).save(f"{output_dir}/gymnasium_standard.png")
118
+
119
+ # 2. Observations after movement
120
+ actions = [2, 2, 1] # move_forward, move_forward, turn_right
121
+ action_names = ["move_forward", "move_forward", "turn_right"]
122
+
123
+ for i, action in enumerate(actions):
124
+ obs, _, _, _, _ = env.step(action)
125
+ obs_hwc = np.transpose(obs, (1, 2, 0))
126
+ Image.fromarray(obs_hwc).save(
127
+ f"{output_dir}/gymnasium_step_{i + 1}_{action_names[i]}.png"
128
+ )
129
+
130
+ # === RENDER_ON_POS EXAMPLES ===
131
+
132
+ # Define test positions based on variant
133
+ if variant == "NineRooms":
134
+ test_positions = [
135
+ [7.5, 0.0, 7.5], # top-middle room center
136
+ [37.5, 0.0, 37.5], # bottom-right room center
137
+ [22.5, 0.0, 22.5], # environment center
138
+ [7.5, 0.0, 22.5], # middle-left room center
139
+ ]
140
+ elif variant == "SpiralNineRooms":
141
+ test_positions = [
142
+ [7.5, 0.0, 7.5], # top-left room (spiral start)
143
+ [37.5, 0.0, 37.5], # bottom-right room (spiral end)
144
+ [22.5, 0.0, 7.5], # top-right room
145
+ [7.5, 0.0, 37.5], # bottom-left room
146
+ ]
147
+ else: # TwentyFiveRooms
148
+ test_positions = [
149
+ [37.5, 0.0, 37.5], # room (1,1) - near corner
150
+ [112.5, 0.0, 112.5], # room (4,4) - far corner
151
+ [75.0, 0.0, 75.0], # center room (2,2)
152
+ [37.5, 0.0, 112.5], # room (1,4) - opposite corner
153
+ ]
154
+
155
+ for i, pos in enumerate(test_positions):
156
+ render_obs = env.render_on_pos(pos)
157
+
158
+ # Convert CHW to HWC for PIL
159
+ if len(render_obs.shape) == 3 and render_obs.shape[0] == 3:
160
+ render_obs = np.transpose(render_obs, (1, 2, 0))
161
+
162
+ Image.fromarray(render_obs).save(f"{output_dir}/render_on_pos_{i + 1}.png")
163
+
164
+ env.close()
165
+ return output_dir
166
+
167
+
168
+ def main():
169
+ parser = argparse.ArgumentParser(
170
+ description="Generate observations for Nine Rooms environment variants"
171
+ )
172
+ parser.add_argument(
173
+ "variant",
174
+ choices=["NineRooms", "SpiralNineRooms", "TwentyFiveRooms"],
175
+ help="Environment variant to use",
176
+ )
177
+ parser.add_argument(
178
+ "--output-dir",
179
+ type=str,
180
+ default=None,
181
+ help="Output directory for images (default: {variant}_observations)",
182
+ )
183
+ parser.add_argument(
184
+ "--high-res-full",
185
+ action="store_true",
186
+ help="Generate 512x512 high-resolution full environment views",
187
+ )
188
+
189
+ args = parser.parse_args()
190
+
191
+ output_dir = generate_observations(
192
+ args.variant, args.output_dir, args.high_res_full
193
+ )
194
+
195
+ return output_dir
196
+
197
+
198
+ if __name__ == "__main__":
199
+ main()
@@ -0,0 +1,5 @@
1
+ """Gymnasium wrappers for Nine Rooms environments."""
2
+
3
+ from .image_transforms import ImageToPyTorch
4
+
5
+ __all__ = ["ImageToPyTorch"]
@@ -0,0 +1,40 @@
1
+ """Image transformation wrappers for Nine Rooms environments."""
2
+
3
+ import gymnasium as gym
4
+ import numpy as np
5
+ from gymnasium import spaces
6
+
7
+
8
+ class ImageToPyTorch(gym.ObservationWrapper):
9
+ """Convert HWC to CHW format for PyTorch compatibility."""
10
+
11
+ def __init__(self, env):
12
+ """
13
+ Initialize PyTorch-compatible image transformation wrapper.
14
+
15
+ Transforms observation space from HWC (Height, Width, Channels) format
16
+ to CHW (Channels, Height, Width) format expected by PyTorch models.
17
+
18
+ Args:
19
+ env: The environment to wrap
20
+ """
21
+ super(ImageToPyTorch, self).__init__(env)
22
+ obs_shape = self.observation_space.shape
23
+ self.observation_space = spaces.Box(
24
+ low=0,
25
+ high=255,
26
+ shape=(obs_shape[2], obs_shape[0], obs_shape[1]),
27
+ dtype=np.uint8,
28
+ )
29
+
30
+ def observation(self, observation):
31
+ """
32
+ Transform observation from HWC to CHW format.
33
+
34
+ Args:
35
+ observation: Input observation in HWC format (H, W, C)
36
+
37
+ Returns:
38
+ np.ndarray: Observation in CHW format (C, H, W)
39
+ """
40
+ return np.transpose(observation, (2, 0, 1))
@@ -0,0 +1,108 @@
1
+ Metadata-Version: 2.3
2
+ Name: miniworld-maze
3
+ Version: 1.0.0
4
+ Summary: Multi-room maze environments from the DrStrategy paper for reinforcement learning research
5
+ Keywords: reinforcement-learning,environment,gymnasium,multi-room-maze,drstrategy,maze-navigation,partial-observability,3d-environments
6
+ Author: Tim Joseph
7
+ Author-email: Tim Joseph <tim@mctigger.com>
8
+ License: MIT License
9
+
10
+ Copyright (c) 2025 DrStrategy Research Team
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
29
+ Classifier: Development Status :: 4 - Beta
30
+ Classifier: Intended Audience :: Science/Research
31
+ Classifier: Intended Audience :: Developers
32
+ Classifier: Operating System :: OS Independent
33
+ Classifier: Programming Language :: Python :: 3
34
+ Classifier: Programming Language :: Python :: 3.8
35
+ Classifier: Programming Language :: Python :: 3.9
36
+ Classifier: Programming Language :: Python :: 3.10
37
+ Classifier: Programming Language :: Python :: 3.11
38
+ Classifier: Programming Language :: Python :: 3.12
39
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
40
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
41
+ Classifier: Environment :: Console
42
+ Classifier: Typing :: Typed
43
+ Requires-Dist: gymnasium>=1.0.0,<2.0.0
44
+ Requires-Dist: numpy>=1.20.0,<3.0.0
45
+ Requires-Dist: opencv-python>=4.5.0,<5.0.0
46
+ Requires-Dist: pillow>=8.0.0,<11.0.0
47
+ Requires-Dist: pyopengl>=3.1.0,<4.0.0
48
+ Requires-Dist: pyglet>=1.5.0,<2.0.0
49
+ Requires-Dist: black>=22.0,<25.0 ; extra == 'dev'
50
+ Requires-Dist: isort>=5.10,<6.0 ; extra == 'dev'
51
+ Requires-Dist: flake8>=4.0,<7.0 ; extra == 'dev'
52
+ Requires-Dist: build>=0.8.0,<2.0.0 ; extra == 'dev'
53
+ Requires-Dist: twine>=4.0.0,<6.0.0 ; extra == 'dev'
54
+ Requires-Dist: mujoco>=2.3.0,<4.0.0 ; extra == 'mujoco'
55
+ Requires-Python: >=3.8
56
+ Project-URL: Bug Tracker, https://github.com/mctigger/miniworld-maze/issues
57
+ Project-URL: Documentation, https://github.com/mctigger/miniworld-maze#readme
58
+ Project-URL: Homepage, https://github.com/mctigger/miniworld-maze
59
+ Project-URL: Repository, https://github.com/mctigger/miniworld-maze
60
+ Provides-Extra: dev
61
+ Provides-Extra: mujoco
62
+ Description-Content-Type: text/markdown
63
+
64
+ # MiniWorld DrStrategy - Multi-Room Maze Environment
65
+
66
+ A refactored implementation of Dr. Strategy's MiniWorld-based maze environments with updated dependencies and modern Python packaging. Based on the now-deprecated [MiniWorld](https://github.com/Farama-Foundation/Miniworld) project and the original [DrStrategy implementation](https://github.com/ahn-ml/drstrategy).
67
+
68
+ ## Environment Observations
69
+
70
+ ### Environment Views
71
+ Full environment layout and render-on-position views:
72
+
73
+ | Full Environment | Partial Top-Down Observations | Partial First-Person Observations |
74
+ |---|---|---|
75
+ | ![Full View Clean](assets/images/full_view_clean.png) | ![Top Middle TD](assets/images/render_on_pos_1_top_middle_room_topdown.png) ![Center TD](assets/images/render_on_pos_3_environment_center_topdown.png) | ![Top Middle FP](assets/images/render_on_pos_1_top_middle_room_firstperson.png) ![Center FP](assets/images/render_on_pos_3_environment_center_firstperson.png) |
76
+
77
+ ## Installation
78
+
79
+ ```bash
80
+ pip install miniworld-maze
81
+ ```
82
+
83
+ ## Usage
84
+
85
+ ```python
86
+ from miniworld_drstrategy import create_nine_rooms_env
87
+
88
+ # Create environment
89
+ env = create_nine_rooms_env(variant="NineRooms", size=64)
90
+ obs, info = env.reset()
91
+
92
+ # Take actions
93
+ action = env.action_space.sample()
94
+ obs, reward, terminated, truncated, info = env.step(action)
95
+
96
+ env.close()
97
+ ```
98
+
99
+ ## Environment Variants
100
+
101
+ - **NineRooms**: 3×3 grid layout
102
+ - **SpiralNineRooms**: Spiral connection pattern
103
+ - **TwentyFiveRooms**: 5×5 grid layout
104
+
105
+
106
+ ## License
107
+
108
+ MIT License - see LICENSE file for details.