codingpirates-maze 0.1.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.
Files changed (539) hide show
  1. codingpirates_maze-0.1.0.dist-info/METADATA +105 -0
  2. codingpirates_maze-0.1.0.dist-info/RECORD +539 -0
  3. codingpirates_maze-0.1.0.dist-info/WHEEL +4 -0
  4. codingpirates_maze-0.1.0.dist-info/licenses/LICENSE +201 -0
  5. importer/code_blocks.py +339 -0
  6. importer/convert_level.py +150 -0
  7. importer/create_course.py +278 -0
  8. importer/lesson.md.j2 +3 -0
  9. importer/maze.py.j2 +20 -0
  10. importer/test.py +24 -0
  11. importer/test_all.py +24 -0
  12. maze/__init__.py +9 -0
  13. maze/bee.py +184 -0
  14. maze/beeshape.py +115 -0
  15. maze/birds.py +69 -0
  16. maze/collector.py +106 -0
  17. maze/farmer.py +95 -0
  18. maze/harvester.py +141 -0
  19. maze/images/bee/background.png +0 -0
  20. maze/images/bee/cloud.gif +0 -0
  21. maze/images/bee/honeycomb.gif +0 -0
  22. maze/images/bee/path.gif +0 -0
  23. maze/images/bee/purple_flower.gif +0 -0
  24. maze/images/bee/red_flower.gif +0 -0
  25. maze/images/birds/.gitignore +2 -0
  26. maze/images/birds/background.png +0 -0
  27. maze/images/birds/monster.gif +0 -0
  28. maze/images/birds/path.gif +0 -0
  29. maze/images/birds/tnt.gif +0 -0
  30. maze/images/birds/wall_1.gif +0 -0
  31. maze/images/birds/wall_2.gif +0 -0
  32. maze/images/birds/wall_3.gif +0 -0
  33. maze/images/birds/wall_4.gif +0 -0
  34. maze/images/birds/wall_5.gif +0 -0
  35. maze/images/collector/.gitignore +1 -0
  36. maze/images/collector/crystal.gif +0 -0
  37. maze/images/collector/floor_1.gif +0 -0
  38. maze/images/collector/floor_2.gif +0 -0
  39. maze/images/collector/floor_3.gif +0 -0
  40. maze/images/collector/floor_4.gif +0 -0
  41. maze/images/collector/wall_1.gif +0 -0
  42. maze/images/collector/wall_2.gif +0 -0
  43. maze/images/farmer/background.png +0 -0
  44. maze/images/farmer/corn.gif +0 -0
  45. maze/images/farmer/hole.gif +0 -0
  46. maze/images/farmer/lettuce.gif +0 -0
  47. maze/images/farmer/path.gif +0 -0
  48. maze/images/farmer/pile.gif +0 -0
  49. maze/images/farmer/pumpkin.gif +0 -0
  50. maze/images/farmer/sprout.gif +0 -0
  51. maze/images/pvz/background.gif +0 -0
  52. maze/images/pvz/flower.gif +0 -0
  53. maze/images/pvz/obstacle.gif +0 -0
  54. maze/images/pvz/path.gif +0 -0
  55. maze/images/pvz/pumpkin.gif +0 -0
  56. maze/levels/CourseD_2022LessonExtra14a_2023.json +46 -0
  57. maze/levels/CourseD_2022LessonExtra14a_2024.json +46 -0
  58. maze/levels/CourseD_2022LessonExtra14a_2025.json +46 -0
  59. maze/levels/CourseD_2022LessonExtra15a_2023.json +46 -0
  60. maze/levels/CourseD_2022LessonExtra15a_2024.json +46 -0
  61. maze/levels/CourseD_2022LessonExtra15a_2025.json +46 -0
  62. maze/levels/CourseD_2022LessonExtra16a_2023.json +46 -0
  63. maze/levels/CourseD_2022LessonExtra16a_2024.json +46 -0
  64. maze/levels/CourseD_2022LessonExtra16a_2025.json +46 -0
  65. maze/levels/CourseD_2022_LessonExtra14b_2023.json +47 -0
  66. maze/levels/CourseD_2022_LessonExtra14b_2024.json +47 -0
  67. maze/levels/CourseD_2022_LessonExtra14b_2025.json +47 -0
  68. maze/levels/CourseD_2022_LessonExtra15b_2023.json +47 -0
  69. maze/levels/CourseD_2022_LessonExtra15b_2024.json +47 -0
  70. maze/levels/CourseD_2022_LessonExtra15b_2025.json +47 -0
  71. maze/levels/CourseD_2022_LessonExtra16b_2023.json +47 -0
  72. maze/levels/CourseD_2022_LessonExtra16b_2024.json +47 -0
  73. maze/levels/CourseD_2022_LessonExtra16b_2025.json +47 -0
  74. maze/levels/courseA_harvester_loops10_2024.json +51 -0
  75. maze/levels/courseA_harvester_loops11_2024.json +51 -0
  76. maze/levels/courseA_harvester_loops1_2024.json +50 -0
  77. maze/levels/courseA_harvester_loops2_2024.json +54 -0
  78. maze/levels/courseA_harvester_loops3_2024.json +57 -0
  79. maze/levels/courseA_harvester_loops4_2024.json +52 -0
  80. maze/levels/courseA_harvester_loops5_2024.json +53 -0
  81. maze/levels/courseA_harvester_loops5a_2024.json +53 -0
  82. maze/levels/courseA_harvester_loops5b_2024.json +52 -0
  83. maze/levels/courseA_harvester_loops6_2024.json +55 -0
  84. maze/levels/courseA_harvester_loops7_2024.json +53 -0
  85. maze/levels/courseA_harvester_loops9_2024.json +51 -0
  86. maze/levels/courseA_harvester_seq10_2024.json +50 -0
  87. maze/levels/courseA_harvester_seq11_2024.json +50 -0
  88. maze/levels/courseA_harvester_seq12_2024.json +50 -0
  89. maze/levels/courseA_harvester_seq13_2024.json +50 -0
  90. maze/levels/courseA_harvester_seq1_2024.json +49 -0
  91. maze/levels/courseA_harvester_seq2_2024.json +54 -0
  92. maze/levels/courseA_harvester_seq3_2024.json +54 -0
  93. maze/levels/courseA_harvester_seq4_2024.json +51 -0
  94. maze/levels/courseA_harvester_seq5_2024.json +51 -0
  95. maze/levels/courseA_harvester_seq6_2024.json +50 -0
  96. maze/levels/courseA_harvester_seq7_2024.json +51 -0
  97. maze/levels/courseA_harvester_seq8_2024.json +51 -0
  98. maze/levels/courseA_harvester_seq9_2024.json +51 -0
  99. maze/levels/courseA_maze_ramp2_2024.json +53 -0
  100. maze/levels/courseA_maze_ramp3a_2024.json +53 -0
  101. maze/levels/courseA_maze_ramp3b_2024.json +50 -0
  102. maze/levels/courseA_maze_ramp4a_2024.json +48 -0
  103. maze/levels/courseA_maze_ramp5a_2024.json +47 -0
  104. maze/levels/courseA_maze_seq10_2024.json +48 -0
  105. maze/levels/courseA_maze_seq11_2024.json +47 -0
  106. maze/levels/courseA_maze_seq12_2024.json +47 -0
  107. maze/levels/courseA_maze_seq13_2024.json +49 -0
  108. maze/levels/courseA_maze_seq1_2024.json +52 -0
  109. maze/levels/courseA_maze_seq5_2024.json +47 -0
  110. maze/levels/courseA_maze_seq5a_2024.json +47 -0
  111. maze/levels/courseA_maze_seq6_2024.json +47 -0
  112. maze/levels/courseA_maze_seq8_2024.json +47 -0
  113. maze/levels/courseA_maze_seq_challenge1_2024.json +45 -0
  114. maze/levels/courseA_maze_seq_challenge2_2024.json +50 -0
  115. maze/levels/courseB_collector_loops10_2024.json +53 -0
  116. maze/levels/courseB_collector_loops11_2024.json +51 -0
  117. maze/levels/courseB_collector_loops1_2024.json +53 -0
  118. maze/levels/courseB_collector_loops2_2024.json +53 -0
  119. maze/levels/courseB_collector_loops3_2024.json +57 -0
  120. maze/levels/courseB_collector_loops4_2024.json +57 -0
  121. maze/levels/courseB_collector_loops5_2024.json +54 -0
  122. maze/levels/courseB_collector_loops6_2024.json +54 -0
  123. maze/levels/courseB_collector_loops7_2024.json +53 -0
  124. maze/levels/courseB_collector_loops8_2024.json +54 -0
  125. maze/levels/courseB_collector_loops9_2024.json +54 -0
  126. maze/levels/courseB_collector_loops_challenge1_2024.json +54 -0
  127. maze/levels/courseB_collector_loops_challenge2a_2024.json +51 -0
  128. maze/levels/courseC_collector_loops_challenge2_2024.json +53 -0
  129. maze/levels/courseC_collector_prog1_2023.json +52 -0
  130. maze/levels/courseC_collector_prog1_2024.json +52 -0
  131. maze/levels/courseC_collector_prog2_2023.json +53 -0
  132. maze/levels/courseC_collector_prog2_2024.json +53 -0
  133. maze/levels/courseC_collector_prog3_2023.json +49 -0
  134. maze/levels/courseC_collector_prog3_2024.json +49 -0
  135. maze/levels/courseC_collector_prog4_2023.json +50 -0
  136. maze/levels/courseC_collector_prog4_2024.json +50 -0
  137. maze/levels/courseC_collector_prog5_2023.json +50 -0
  138. maze/levels/courseC_collector_prog5_2024.json +50 -0
  139. maze/levels/courseC_collector_prog6_2023.json +50 -0
  140. maze/levels/courseC_collector_prog6_2024.json +50 -0
  141. maze/levels/courseC_collector_prog7_2023.json +51 -0
  142. maze/levels/courseC_collector_prog7_2024.json +51 -0
  143. maze/levels/courseC_collector_prog8_2023.json +52 -0
  144. maze/levels/courseC_collector_prog8_2024.json +52 -0
  145. maze/levels/courseC_collector_prog9_2023.json +52 -0
  146. maze/levels/courseC_collector_prog9_2024.json +52 -0
  147. maze/levels/courseC_collector_prog_challenge1_2023.json +51 -0
  148. maze/levels/courseC_collector_prog_challenge1_2024.json +51 -0
  149. maze/levels/courseC_collector_prog_challenge2_2023.json +51 -0
  150. maze/levels/courseC_collector_prog_challenge2_2024.json +51 -0
  151. maze/levels/courseC_harvester_loops10_2024.json +50 -0
  152. maze/levels/courseC_harvester_loops11_2024.json +50 -0
  153. maze/levels/courseC_harvester_loops11_predict1_2024.json +47 -0
  154. maze/levels/courseC_harvester_loops1_2024.json +52 -0
  155. maze/levels/courseC_harvester_loops2_2024.json +50 -0
  156. maze/levels/courseC_harvester_loops3_2024.json +50 -0
  157. maze/levels/courseC_harvester_loops4_2024.json +50 -0
  158. maze/levels/courseC_harvester_loops5_2024.json +50 -0
  159. maze/levels/courseC_harvester_loops6_2024.json +50 -0
  160. maze/levels/courseC_harvester_loops7_2024.json +50 -0
  161. maze/levels/courseC_harvester_loops8_2024.json +49 -0
  162. maze/levels/courseC_harvester_loops9_2024.json +50 -0
  163. maze/levels/courseC_harvester_loops_challenge1a_2024.json +50 -0
  164. maze/levels/courseC_harvester_loops_challenge2_2024.json +48 -0
  165. maze/levels/courseC_maze_debugging1.json +47 -0
  166. maze/levels/courseC_maze_debugging2.json +44 -0
  167. maze/levels/courseC_maze_debugging3.json +46 -0
  168. maze/levels/courseC_maze_debugging4.json +44 -0
  169. maze/levels/courseC_maze_debugging5.json +46 -0
  170. maze/levels/courseC_maze_debugging6.json +44 -0
  171. maze/levels/courseC_maze_debugging7.json +45 -0
  172. maze/levels/courseC_maze_debugging8_predict1.json +43 -0
  173. maze/levels/courseC_maze_debugging9.json +44 -0
  174. maze/levels/courseC_maze_loops_challenge1a_2024.json +47 -0
  175. maze/levels/courseC_maze_programming1_2023.json +50 -0
  176. maze/levels/courseC_maze_programming1_2024.json +50 -0
  177. maze/levels/courseC_maze_programming2_2023.json +53 -0
  178. maze/levels/courseC_maze_programming2_2024.json +53 -0
  179. maze/levels/courseC_maze_programming3_2023.json +47 -0
  180. maze/levels/courseC_maze_programming3_2024.json +47 -0
  181. maze/levels/courseC_maze_programming4_2023.json +46 -0
  182. maze/levels/courseC_maze_programming4_2024.json +46 -0
  183. maze/levels/courseC_maze_programming5_2023.json +46 -0
  184. maze/levels/courseC_maze_programming5_2024.json +46 -0
  185. maze/levels/courseC_maze_programming6_2023.json +50 -0
  186. maze/levels/courseC_maze_programming6_2024.json +49 -0
  187. maze/levels/courseC_maze_programming7_2023.json +54 -0
  188. maze/levels/courseC_maze_programming7_2024.json +54 -0
  189. maze/levels/courseC_maze_programming8_2023.json +52 -0
  190. maze/levels/courseC_maze_programming8_2024.json +51 -0
  191. maze/levels/courseC_maze_programming8_predict1_2024.json +45 -0
  192. maze/levels/courseC_maze_programming9_2023.json +47 -0
  193. maze/levels/courseC_maze_programming9_2024.json +47 -0
  194. maze/levels/courseC_maze_programming_challenge1_2023.json +47 -0
  195. maze/levels/courseC_maze_programming_challenge1_2024.json +47 -0
  196. maze/levels/courseC_maze_programming_challenge2_2023.json +49 -0
  197. maze/levels/courseC_maze_programming_challenge2_2024.json +49 -0
  198. maze/levels/courseD_bee_conditionals10_2023.json +57 -0
  199. maze/levels/courseD_bee_conditionals10_2024.json +57 -0
  200. maze/levels/courseD_bee_conditionals10_2025.json +57 -0
  201. maze/levels/courseD_bee_conditionals1_predict1_2023.json +51 -0
  202. maze/levels/courseD_bee_conditionals1_predict1_2024.json +51 -0
  203. maze/levels/courseD_bee_conditionals1_predict1_2025.json +51 -0
  204. maze/levels/courseD_bee_conditionals2_2023.json +60 -0
  205. maze/levels/courseD_bee_conditionals2_2024.json +60 -0
  206. maze/levels/courseD_bee_conditionals2_2025.json +60 -0
  207. maze/levels/courseD_bee_conditionals3_2023.json +57 -0
  208. maze/levels/courseD_bee_conditionals3_2024.json +57 -0
  209. maze/levels/courseD_bee_conditionals3_2025.json +57 -0
  210. maze/levels/courseD_bee_conditionals4_2023.json +58 -0
  211. maze/levels/courseD_bee_conditionals4_2024.json +58 -0
  212. maze/levels/courseD_bee_conditionals4_2025.json +58 -0
  213. maze/levels/courseD_bee_conditionals5_2023.json +58 -0
  214. maze/levels/courseD_bee_conditionals5_2024.json +58 -0
  215. maze/levels/courseD_bee_conditionals5_2025.json +58 -0
  216. maze/levels/courseD_bee_conditionals6_2023.json +57 -0
  217. maze/levels/courseD_bee_conditionals6_2024.json +57 -0
  218. maze/levels/courseD_bee_conditionals6_2025.json +57 -0
  219. maze/levels/courseD_bee_conditionals7_2023.json +57 -0
  220. maze/levels/courseD_bee_conditionals7_2024.json +57 -0
  221. maze/levels/courseD_bee_conditionals7_2025.json +57 -0
  222. maze/levels/courseD_bee_conditionals7_predict2_2023.json +54 -0
  223. maze/levels/courseD_bee_conditionals7_predict2_2024.json +54 -0
  224. maze/levels/courseD_bee_conditionals7_predict2_2025.json +54 -0
  225. maze/levels/courseD_bee_conditionals8_2023.json +57 -0
  226. maze/levels/courseD_bee_conditionals8_2024.json +57 -0
  227. maze/levels/courseD_bee_conditionals8_2025.json +57 -0
  228. maze/levels/courseD_bee_conditionals9_2023.json +55 -0
  229. maze/levels/courseD_bee_conditionals9_2024.json +55 -0
  230. maze/levels/courseD_bee_conditionals9_2025.json +55 -0
  231. maze/levels/courseD_bee_conditionals_challenge1_2023.json +57 -0
  232. maze/levels/courseD_bee_conditionals_challenge1_2024.json +57 -0
  233. maze/levels/courseD_bee_conditionals_challenge1_2025.json +57 -0
  234. maze/levels/courseD_bee_conditionals_challenge2_2023.json +58 -0
  235. maze/levels/courseD_bee_conditionals_challenge2_2024.json +58 -0
  236. maze/levels/courseD_bee_conditionals_challenge2_2025.json +58 -0
  237. maze/levels/courseD_bee_nestedLoops1.json +49 -0
  238. maze/levels/courseD_bee_nestedLoops1_2023.json +53 -0
  239. maze/levels/courseD_bee_nestedLoops1_2024.json +53 -0
  240. maze/levels/courseD_bee_nestedLoops1_2025.json +53 -0
  241. maze/levels/courseD_bee_nestedLoops1a.json +49 -0
  242. maze/levels/courseD_bee_nestedLoops1a_2023.json +55 -0
  243. maze/levels/courseD_bee_nestedLoops1a_2024.json +55 -0
  244. maze/levels/courseD_bee_nestedLoops1a_2025.json +55 -0
  245. maze/levels/courseD_bee_nestedLoops2.json +50 -0
  246. maze/levels/courseD_bee_nestedLoops2_2023.json +57 -0
  247. maze/levels/courseD_bee_nestedLoops2_2024.json +57 -0
  248. maze/levels/courseD_bee_nestedLoops2_2025.json +57 -0
  249. maze/levels/courseD_bee_nestedLoops2_predict1.json +51 -0
  250. maze/levels/courseD_bee_nestedLoops2_predict1_2023.json +51 -0
  251. maze/levels/courseD_bee_nestedLoops2_predict1_2024.json +51 -0
  252. maze/levels/courseD_bee_nestedLoops2_predict1_2025.json +51 -0
  253. maze/levels/courseD_bee_nestedLoops7.json +53 -0
  254. maze/levels/courseD_bee_nestedLoops7_2023.json +59 -0
  255. maze/levels/courseD_bee_nestedLoops7_2024.json +59 -0
  256. maze/levels/courseD_bee_nestedLoops7_2025.json +59 -0
  257. maze/levels/courseD_bee_nestedLoops8.json +52 -0
  258. maze/levels/courseD_bee_nestedLoops8_2023.json +59 -0
  259. maze/levels/courseD_bee_nestedLoops8_2024.json +59 -0
  260. maze/levels/courseD_bee_nestedLoops8_2025.json +59 -0
  261. maze/levels/courseD_bee_nestedLoops9.json +53 -0
  262. maze/levels/courseD_bee_nestedLoops9_2023.json +60 -0
  263. maze/levels/courseD_bee_nestedLoops9_2024.json +60 -0
  264. maze/levels/courseD_bee_nestedLoops9_2025.json +60 -0
  265. maze/levels/courseD_bee_nestedLoops9_predict2.json +51 -0
  266. maze/levels/courseD_bee_nestedLoops9_predict2_2023.json +54 -0
  267. maze/levels/courseD_bee_nestedLoops9_predict2_2024.json +54 -0
  268. maze/levels/courseD_bee_nestedLoops9_predict2_2025.json +54 -0
  269. maze/levels/courseD_collector_debugging1a_2023.json +50 -0
  270. maze/levels/courseD_collector_debugging1a_2024.json +50 -0
  271. maze/levels/courseD_collector_debugging1a_2025.json +50 -0
  272. maze/levels/courseD_collector_debugging2a_2023.json +50 -0
  273. maze/levels/courseD_collector_debugging2a_2024.json +50 -0
  274. maze/levels/courseD_collector_debugging2a_2025.json +50 -0
  275. maze/levels/courseD_collector_debugging3a_2023.json +50 -0
  276. maze/levels/courseD_collector_debugging3a_2024.json +50 -0
  277. maze/levels/courseD_collector_debugging3a_2025.json +50 -0
  278. maze/levels/courseD_collector_debugging4a_2023.json +50 -0
  279. maze/levels/courseD_collector_debugging4a_2024.json +50 -0
  280. maze/levels/courseD_collector_debugging4a_2025.json +50 -0
  281. maze/levels/courseD_collector_debugging5a_2023.json +50 -0
  282. maze/levels/courseD_collector_debugging5a_2024.json +50 -0
  283. maze/levels/courseD_collector_debugging5a_2025.json +50 -0
  284. maze/levels/courseD_collector_debugging6a_2023.json +56 -0
  285. maze/levels/courseD_collector_debugging6a_2024.json +56 -0
  286. maze/levels/courseD_collector_debugging6a_2025.json +56 -0
  287. maze/levels/courseD_collector_debugging8a_2023.json +49 -0
  288. maze/levels/courseD_collector_debugging8a_2024.json +49 -0
  289. maze/levels/courseD_collector_debugging8a_2025.json +49 -0
  290. maze/levels/courseD_collector_debugging9a_2023.json +49 -0
  291. maze/levels/courseD_collector_debugging9a_2024.json +49 -0
  292. maze/levels/courseD_collector_debugging9a_2025.json +49 -0
  293. maze/levels/courseD_collector_nested_loops_challenge2_2024.json +50 -0
  294. maze/levels/courseD_collector_nested_loops_challenge2_2025.json +50 -0
  295. maze/levels/courseD_farmer_while10_2023.json +50 -0
  296. maze/levels/courseD_farmer_while10_2024.json +50 -0
  297. maze/levels/courseD_farmer_while10_2025.json +50 -0
  298. maze/levels/courseD_farmer_while10_predict2_2024.json +45 -0
  299. maze/levels/courseD_farmer_while10_predict2_2025.json +45 -0
  300. maze/levels/courseD_farmer_while1_2023.json +49 -0
  301. maze/levels/courseD_farmer_while1_2024.json +49 -0
  302. maze/levels/courseD_farmer_while1_2025.json +49 -0
  303. maze/levels/courseD_farmer_while2_2023.json +45 -0
  304. maze/levels/courseD_farmer_while2_2024.json +45 -0
  305. maze/levels/courseD_farmer_while2_2025.json +45 -0
  306. maze/levels/courseD_farmer_while3_2023.json +47 -0
  307. maze/levels/courseD_farmer_while3_2024.json +47 -0
  308. maze/levels/courseD_farmer_while3_2025.json +47 -0
  309. maze/levels/courseD_farmer_while4_2023.json +50 -0
  310. maze/levels/courseD_farmer_while4_2024.json +50 -0
  311. maze/levels/courseD_farmer_while4_2025.json +50 -0
  312. maze/levels/courseD_farmer_while4_predict1_2024.json +47 -0
  313. maze/levels/courseD_farmer_while4_predict1_2025.json +47 -0
  314. maze/levels/courseD_farmer_while5_2023.json +52 -0
  315. maze/levels/courseD_farmer_while5_2024.json +52 -0
  316. maze/levels/courseD_farmer_while5_2025.json +52 -0
  317. maze/levels/courseD_farmer_while6_2023.json +51 -0
  318. maze/levels/courseD_farmer_while6_2024.json +51 -0
  319. maze/levels/courseD_farmer_while6_2025.json +51 -0
  320. maze/levels/courseD_farmer_while7_2023.json +52 -0
  321. maze/levels/courseD_farmer_while7_2024.json +52 -0
  322. maze/levels/courseD_farmer_while7_2025.json +52 -0
  323. maze/levels/courseD_farmer_while8_2023.json +51 -0
  324. maze/levels/courseD_farmer_while8_2024.json +51 -0
  325. maze/levels/courseD_farmer_while8_2025.json +51 -0
  326. maze/levels/courseD_farmer_while9_2023.json +50 -0
  327. maze/levels/courseD_farmer_while9_2024.json +50 -0
  328. maze/levels/courseD_farmer_while9_2025.json +50 -0
  329. maze/levels/courseD_farmer_while_challenge1_2023.json +50 -0
  330. maze/levels/courseD_farmer_while_challenge1_2024.json +50 -0
  331. maze/levels/courseD_farmer_while_challenge1_2025.json +50 -0
  332. maze/levels/courseD_harvester_nested_loops_challenge1_2024.json +51 -0
  333. maze/levels/courseD_harvester_nested_loops_challenge1_2025.json +51 -0
  334. maze/levels/courseD_iceage_loops10_2024.json +48 -0
  335. maze/levels/courseD_iceage_loops10_2025.json +48 -0
  336. maze/levels/courseD_iceage_loops11_2024.json +46 -0
  337. maze/levels/courseD_iceage_loops11_2025.json +46 -0
  338. maze/levels/courseD_iceage_loops12_2024.json +46 -0
  339. maze/levels/courseD_iceage_loops12_2025.json +46 -0
  340. maze/levels/courseD_iceage_loops1_2024.json +49 -0
  341. maze/levels/courseD_iceage_loops1_2025.json +49 -0
  342. maze/levels/courseD_iceage_loops2_2024.json +51 -0
  343. maze/levels/courseD_iceage_loops2_2025.json +51 -0
  344. maze/levels/courseD_iceage_loops3_2024.json +51 -0
  345. maze/levels/courseD_iceage_loops3_2025.json +51 -0
  346. maze/levels/courseD_iceage_loops4_2024.json +47 -0
  347. maze/levels/courseD_iceage_loops4_2025.json +47 -0
  348. maze/levels/courseD_iceage_loops6_2024.json +47 -0
  349. maze/levels/courseD_iceage_loops6_2025.json +47 -0
  350. maze/levels/courseD_iceage_loops7_2024.json +47 -0
  351. maze/levels/courseD_iceage_loops7_2025.json +47 -0
  352. maze/levels/courseD_iceage_loops8_2024.json +49 -0
  353. maze/levels/courseD_iceage_loops8_2025.json +49 -0
  354. maze/levels/courseD_iceage_loops9_2024.json +49 -0
  355. maze/levels/courseD_iceage_loops9_2025.json +49 -0
  356. maze/levels/courseD_maze_intro4_2023.json +45 -0
  357. maze/levels/courseD_maze_intro4_2024.json +45 -0
  358. maze/levels/courseD_maze_intro4_2025.json +45 -0
  359. maze/levels/courseD_maze_intro5a_2023.json +45 -0
  360. maze/levels/courseD_maze_intro5a_2024.json +45 -0
  361. maze/levels/courseD_maze_intro5a_2025.json +45 -0
  362. maze/levels/courseD_maze_intro5c_2023.json +45 -0
  363. maze/levels/courseD_maze_intro5c_2024.json +45 -0
  364. maze/levels/courseD_maze_intro5c_2025.json +45 -0
  365. maze/levels/courseD_maze_nestedLoops3.json +46 -0
  366. maze/levels/courseD_maze_nestedLoops3_2023.json +47 -0
  367. maze/levels/courseD_maze_nestedLoops3_2024.json +47 -0
  368. maze/levels/courseD_maze_nestedLoops3_2025.json +47 -0
  369. maze/levels/courseD_maze_nestedLoops4.json +45 -0
  370. maze/levels/courseD_maze_nestedLoops4_2023.json +47 -0
  371. maze/levels/courseD_maze_nestedLoops4_2024.json +47 -0
  372. maze/levels/courseD_maze_nestedLoops4_2025.json +47 -0
  373. maze/levels/courseD_maze_nestedLoops5.json +44 -0
  374. maze/levels/courseD_maze_nestedLoops5_2023.json +45 -0
  375. maze/levels/courseD_maze_nestedLoops5_2024.json +45 -0
  376. maze/levels/courseD_maze_nestedLoops5_2025.json +45 -0
  377. maze/levels/courseD_maze_nestedLoops6.json +43 -0
  378. maze/levels/courseD_maze_nestedLoops6_2023.json +45 -0
  379. maze/levels/courseD_maze_nestedLoops6_2024.json +45 -0
  380. maze/levels/courseD_maze_nestedLoops6_2025.json +45 -0
  381. maze/levels/courseD_maze_ramp1.json +47 -0
  382. maze/levels/courseD_maze_ramp1_2023.json +45 -0
  383. maze/levels/courseD_maze_ramp1_2024.json +45 -0
  384. maze/levels/courseD_maze_ramp1_2025.json +45 -0
  385. maze/levels/courseD_maze_ramp2.json +47 -0
  386. maze/levels/courseD_maze_ramp2_2023.json +45 -0
  387. maze/levels/courseD_maze_ramp2_2024.json +45 -0
  388. maze/levels/courseD_maze_ramp2_2025.json +45 -0
  389. maze/levels/courseD_maze_ramp3.json +46 -0
  390. maze/levels/courseD_maze_ramp3_2023.json +45 -0
  391. maze/levels/courseD_maze_ramp3_2024.json +45 -0
  392. maze/levels/courseD_maze_ramp3_2025.json +45 -0
  393. maze/levels/courseD_maze_ramp4.json +47 -0
  394. maze/levels/courseD_maze_ramp5.json +44 -0
  395. maze/levels/courseD_maze_ramp5_2023.json +42 -0
  396. maze/levels/courseD_maze_ramp5_2024.json +42 -0
  397. maze/levels/courseD_maze_ramp5_2025.json +42 -0
  398. maze/levels/courseD_maze_ramp5a.json +45 -0
  399. maze/levels/courseD_maze_ramp5b.json +45 -0
  400. maze/levels/courseD_maze_ramp5b_2023.json +43 -0
  401. maze/levels/courseD_maze_ramp5b_2024.json +43 -0
  402. maze/levels/courseD_maze_ramp5b_2025.json +43 -0
  403. maze/levels/courseD_maze_ramp5c.json +46 -0
  404. maze/levels/courseD_maze_ramp5d.json +45 -0
  405. maze/levels/courseD_maze_ramp5d_2023.json +43 -0
  406. maze/levels/courseD_maze_ramp5d_2024.json +43 -0
  407. maze/levels/courseD_maze_ramp5d_2025.json +43 -0
  408. maze/levels/courseD_maze_until10_2023.json +53 -0
  409. maze/levels/courseD_maze_until10_2024.json +53 -0
  410. maze/levels/courseD_maze_until10_2025.json +53 -0
  411. maze/levels/courseD_maze_until10_predict2_2024.json +52 -0
  412. maze/levels/courseD_maze_until10_predict2_2025.json +52 -0
  413. maze/levels/courseD_maze_until1_2023.json +47 -0
  414. maze/levels/courseD_maze_until1_2024.json +47 -0
  415. maze/levels/courseD_maze_until1_2025.json +47 -0
  416. maze/levels/courseD_maze_until2_predict1_2024.json +44 -0
  417. maze/levels/courseD_maze_until2_predict1_2025.json +44 -0
  418. maze/levels/courseD_maze_until3_2023.json +48 -0
  419. maze/levels/courseD_maze_until3_2024.json +48 -0
  420. maze/levels/courseD_maze_until3_2025.json +48 -0
  421. maze/levels/courseD_maze_until4_2023.json +49 -0
  422. maze/levels/courseD_maze_until4_2024.json +49 -0
  423. maze/levels/courseD_maze_until4_2025.json +49 -0
  424. maze/levels/courseD_maze_until5_2023.json +49 -0
  425. maze/levels/courseD_maze_until5_2024.json +49 -0
  426. maze/levels/courseD_maze_until5_2025.json +49 -0
  427. maze/levels/courseD_maze_until6_2023.json +49 -0
  428. maze/levels/courseD_maze_until6_2024.json +49 -0
  429. maze/levels/courseD_maze_until6_2025.json +49 -0
  430. maze/levels/courseD_maze_until7_2023.json +49 -0
  431. maze/levels/courseD_maze_until7_2024.json +49 -0
  432. maze/levels/courseD_maze_until7_2025.json +49 -0
  433. maze/levels/courseD_maze_until9_2023.json +53 -0
  434. maze/levels/courseD_maze_until9_2024.json +53 -0
  435. maze/levels/courseD_maze_until9_2025.json +53 -0
  436. maze/levels/courseD_scrat_predict1.json +44 -0
  437. maze/levels/courseD_scrat_ramp1.json +46 -0
  438. maze/levels/courseD_scrat_ramp2.json +47 -0
  439. maze/levels/courseD_scrat_ramp3.json +45 -0
  440. maze/levels/courseD_scrat_ramp4.json +46 -0
  441. maze/levels/courseD_scrat_ramp5.json +46 -0
  442. maze/levels/courseD_scrat_ramp6.json +47 -0
  443. maze/levels/courseD_scrat_ramp8.json +47 -0
  444. maze/levels/courseE_farmer_functions10a1_2023.json +55 -0
  445. maze/levels/courseE_farmer_functions10a1_2024.json +55 -0
  446. maze/levels/courseE_farmer_functions11_predict_2024.json +49 -0
  447. maze/levels/courseE_farmer_functions13_2023.json +55 -0
  448. maze/levels/courseE_farmer_functions13_2024.json +55 -0
  449. maze/levels/courseE_farmer_functions1_2023.json +54 -0
  450. maze/levels/courseE_farmer_functions1_2024.json +54 -0
  451. maze/levels/courseE_farmer_functions1a_2023.json +55 -0
  452. maze/levels/courseE_farmer_functions1a_2024.json +55 -0
  453. maze/levels/courseE_farmer_functions2b_2023.json +55 -0
  454. maze/levels/courseE_farmer_functions2b_2024.json +55 -0
  455. maze/levels/courseE_farmer_functions2ba_2023.json +55 -0
  456. maze/levels/courseE_farmer_functions2ba_2024.json +55 -0
  457. maze/levels/courseE_farmer_functions3c1_2023.json +56 -0
  458. maze/levels/courseE_farmer_functions3c1_2024.json +56 -0
  459. maze/levels/courseE_farmer_functions3c_2023.json +55 -0
  460. maze/levels/courseE_farmer_functions3c_2024.json +55 -0
  461. maze/levels/courseE_farmer_functions7a1_2023.json +59 -0
  462. maze/levels/courseE_farmer_functions7a1_2024.json +59 -0
  463. maze/levels/courseE_farmer_functions8a1_2023.json +56 -0
  464. maze/levels/courseE_farmer_functions8a1_2024.json +56 -0
  465. maze/levels/courseE_farmer_functions9a1_2023.json +58 -0
  466. maze/levels/courseE_farmer_functions9a1_2024.json +58 -0
  467. maze/levels/courseE_farmer_ramp11a_2023.json +49 -0
  468. maze/levels/courseE_farmer_ramp11a_2024.json +49 -0
  469. maze/levels/courseE_farmer_ramp11b_2023.json +50 -0
  470. maze/levels/courseE_farmer_ramp11b_2024.json +50 -0
  471. maze/levels/courseE_farmer_ramp12_forswap_2023.json +50 -0
  472. maze/levels/courseE_farmer_ramp12_forswap_2024.json +50 -0
  473. maze/levels/courseE_farmer_ramp12b_2023.json +50 -0
  474. maze/levels/courseE_farmer_ramp12b_2024.json +50 -0
  475. maze/levels/courseE_farmer_ramp12c_2023.json +50 -0
  476. maze/levels/courseE_farmer_ramp12c_2024.json +50 -0
  477. maze/levels/courseE_farmer_ramp12d_2023.json +50 -0
  478. maze/levels/courseE_farmer_ramp12d_2024.json +50 -0
  479. maze/levels/courseE_farmer_ramp12e_2023.json +50 -0
  480. maze/levels/courseE_farmer_ramp12e_2024.json +50 -0
  481. maze/levels/courseE_farmer_ramp12f_2023.json +51 -0
  482. maze/levels/courseE_farmer_ramp12f_2024.json +51 -0
  483. maze/levels/courseE_farmer_while1_2023.json +54 -0
  484. maze/levels/courseE_farmer_while1_2024.json +54 -0
  485. maze/levels/courseF_bee_conditionals10.json +53 -0
  486. maze/levels/courseF_bee_conditionals1_predict1.json +52 -0
  487. maze/levels/courseF_bee_conditionals2.json +53 -0
  488. maze/levels/courseF_bee_conditionals3.json +51 -0
  489. maze/levels/courseF_bee_conditionals4.json +50 -0
  490. maze/levels/courseF_bee_conditionals5.json +53 -0
  491. maze/levels/courseF_bee_conditionals7_predict2.json +53 -0
  492. maze/levels/courseF_bee_conditionals8.json +54 -0
  493. maze/levels/courseF_bee_for1.json +50 -0
  494. maze/levels/courseF_bee_for10.json +53 -0
  495. maze/levels/courseF_bee_for11.json +48 -0
  496. maze/levels/courseF_bee_for2.json +51 -0
  497. maze/levels/courseF_bee_for3_predict1.json +52 -0
  498. maze/levels/courseF_bee_for4.json +54 -0
  499. maze/levels/courseF_bee_for5.json +52 -0
  500. maze/levels/courseF_bee_for6.json +55 -0
  501. maze/levels/courseF_bee_for7.json +53 -0
  502. maze/levels/courseF_bee_for8.json +54 -0
  503. maze/levels/courseF_bee_for9.json +55 -0
  504. maze/levels/courseF_bee_for_challenge1.json +52 -0
  505. maze/levels/courseF_bee_for_challenge2.json +48 -0
  506. maze/levels/courseF_bee_functions2.json +55 -0
  507. maze/levels/courseF_bee_functions3.json +55 -0
  508. maze/levels/courseF_bee_functions3a.json +55 -0
  509. maze/levels/courseF_bee_functions4.json +54 -0
  510. maze/levels/courseF_bee_functions5a.json +55 -0
  511. maze/levels/courseF_bee_functions6.json +57 -0
  512. maze/levels/courseF_bee_functions7.json +55 -0
  513. maze/levels/courseF_bee_functions8a.json +52 -0
  514. maze/levels/courseF_bee_functionsPre7.json +56 -0
  515. maze/levels/courseF_bee_functions_challenge1.json +52 -0
  516. maze/levels/courseF_bee_functions_challenge2.json +51 -0
  517. maze/levels/courseF_bee_fwp1.json +52 -0
  518. maze/levels/courseF_bee_fwp2.json +52 -0
  519. maze/levels/courseF_bee_fwp3.json +54 -0
  520. maze/levels/courseF_bee_fwp4.json +52 -0
  521. maze/levels/courseF_bee_fwp5.json +52 -0
  522. maze/levels/courseF_bee_fwp6.json +53 -0
  523. maze/levels/courseF_bee_fwp7.json +52 -0
  524. maze/levels/courseF_bee_fwp8.json +55 -0
  525. maze/levels/courseF_bee_fwp9_predict1.json +54 -0
  526. maze/levels/courseF_bee_fwp_challenge1.json +47 -0
  527. maze/levels/courseF_bee_fwp_challenge2.json +48 -0
  528. maze/levels/coursea_maze_ramp1_2024.json +53 -0
  529. maze/levels/grade2_collector_10_2023.json +45 -0
  530. maze/levels/grade2_collector_10_2024.json +45 -0
  531. maze/levels/grade2_collector_A_2023.json +50 -0
  532. maze/levels/grade2_collector_A_2024.json +50 -0
  533. maze/levels/grade2_collector_A_predict1_2023.json +46 -0
  534. maze/levels/grade2_collector_A_predict1_2024.json +46 -0
  535. maze/maze.py +650 -0
  536. maze/puzzle.py +75 -0
  537. maze/pvz.py +62 -0
  538. maze/screencapture.py +22 -0
  539. maze/zombieshape.py +108 -0
maze/bee.py ADDED
@@ -0,0 +1,184 @@
1
+ from enum import Enum
2
+ import random
3
+ from .maze import SquareType, MazeType, Cell, Player, Maze
4
+ from .farmer import FarmerMazeType
5
+
6
+
7
+ class BeeMazeType(MazeType):
8
+
9
+ def __init__(self):
10
+ super().__init__()
11
+ self.cellClass = BeeCell
12
+ self.playerClass = BeePlayer
13
+ self.subfolder = "bee"
14
+
15
+ def setup(self, level, maze):
16
+ super().setup(level, maze)
17
+ screen = maze.screen
18
+ screen.bgpic(Maze.shapefile("background", ".png"))
19
+ screen.register_shape(Maze.shapefile("cloud"))
20
+ screen.register_shape(Maze.shapefile("path"))
21
+ screen.register_shape(Maze.shapefile("purple_flower"))
22
+ screen.register_shape(Maze.shapefile("red_flower"))
23
+ screen.register_shape(Maze.shapefile("honeycomb"))
24
+
25
+ def parse_cell_from_old_values(self, map_cell, initial_dirt_cell):
26
+ map_cell = str(map_cell)
27
+ initial_dirt_cell = int(initial_dirt_cell)
28
+ tileType = featureType = value = cloudType = flowerColor = None
29
+
30
+ if initial_dirt_cell != 0 and any(substring in map_cell for substring in ['1', 'R', 'P', 'FC']):
31
+ tileType = SquareType.OPEN
32
+ featureType = BeeFeatureType.FLOWER if initial_dirt_cell > 0 else BeeFeatureType.HIVE
33
+ value = abs(initial_dirt_cell)
34
+ cloudType = CloudType.STATIC if map_cell == 'FC' else CloudType.NONE
35
+ if map_cell == 'R':
36
+ flowerColor = FlowerColor.RED
37
+ elif map_cell == 'P':
38
+ flowerColor = FlowerColor.PURPLE
39
+ else:
40
+ flowerColor = FlowerColor.DEFAULT
41
+ else:
42
+ tileType = int(map_cell)
43
+
44
+ return dict(tileType=tileType, featureType=featureType, value=value, cloudType=cloudType,
45
+ flowerColor=flowerColor)
46
+
47
+
48
+ BEE_SHAPE = ((0, -22), (-4, -20), (-7, -13), (7, -13), (-7, -13), (-7.6, -5.6), (7.6, -5.6), (-7.6, -5.6), (-2.6, 7.4),
49
+ (-13.1, -10.5), (-18, -13), (-23, -11), (-25, -6), (-23, -1), (-2.6, 7.5), (-7, 9), (-6, 15), (-4, 17),
50
+ (-7, 20), (-11, 22), (-7, 20), (-4, 17), (0, 18), (4, 17), (7, 20), (11, 22), (7, 20), (4, 17), (6, 15),
51
+ (7, 9), (2.6, 7.5), (23, -1), (25, -6), (23, -11), (18, -13), (13.1, -10.5), (2.6, 7.4), (7.6, -5.6),
52
+ (7, -13), (4, -20))
53
+
54
+
55
+ class BeeFeatureType(Enum):
56
+ NONE = None
57
+ HIVE = 0
58
+ FLOWER = 1
59
+ VARIABLE = 2
60
+
61
+
62
+ class CloudType(Enum):
63
+ NONE = None
64
+ STATIC = 0
65
+ HIVE_OR_FLOWER = 1
66
+ FLOWER_OR_NOTHING = 2
67
+ HIVE_OR_NOTHING = 3
68
+ ANY = 4
69
+
70
+
71
+ class FlowerColor(Enum):
72
+ DEFAULT = None
73
+ RED = 0
74
+ PURPLE = 1
75
+
76
+
77
+ class BeeCell(Cell):
78
+
79
+ def __init__(self, tileType=0, value=0, range=0, featureType=None, flowerColor=None, cloudType=None):
80
+ super().__init__(tileType=tileType, value=value, range=range)
81
+ self.featureType = BeeFeatureType(featureType)
82
+ self.flowerColor = FlowerColor(flowerColor)
83
+ self.cloudType = CloudType(cloudType)
84
+
85
+ def is_variable_range(self):
86
+ return False
87
+
88
+ def draw(self, x, y):
89
+ if not self.isCloud() and self.featureType in (BeeFeatureType.NONE, BeeFeatureType.VARIABLE):
90
+ self.value = 0
91
+ super().draw(x, y)
92
+
93
+ def isFlower(self):
94
+ return self.featureType == BeeFeatureType.FLOWER
95
+
96
+ def isHive(self):
97
+ return self.featureType == BeeFeatureType.HIVE
98
+
99
+ def redraw(self):
100
+ if self.isCloud() or self.featureType not in (BeeFeatureType.NONE, BeeFeatureType.VARIABLE):
101
+ self.showturtle()
102
+ else:
103
+ self.hideturtle()
104
+
105
+ if self.cloudType != CloudType.NONE:
106
+ self.shape(Maze.shapefile("cloud"))
107
+ elif self.isFlower():
108
+ if self.flowerColor != FlowerColor.RED:
109
+ self.shape(Maze.shapefile("purple_flower"))
110
+ else:
111
+ self.shape(Maze.shapefile("red_flower"))
112
+ self.draw_value()
113
+ elif self.isHive():
114
+ self.shape(Maze.shapefile("honeycomb"))
115
+ self.draw_value()
116
+
117
+ def isCloud(self):
118
+ return self.cloudType != CloudType.NONE
119
+
120
+ def needs_visit(self):
121
+ return self.isCloud() or self.isFlower() or self.isHive()
122
+
123
+ def reveal(self):
124
+ possibilities = None
125
+ if self.isCloud():
126
+ if self.cloudType == CloudType.HIVE_OR_FLOWER:
127
+ possibilities = [BeeFeatureType.HIVE, BeeFeatureType.FLOWER]
128
+ elif self.cloudType == CloudType.FLOWER_OR_NOTHING:
129
+ possibilities = [BeeFeatureType.FLOWER, BeeFeatureType.FLOWER, BeeFeatureType.NONE]
130
+ elif self.cloudType == CloudType.HIVE_OR_NOTHING:
131
+ possibilities = [BeeFeatureType.HIVE, BeeFeatureType.HIVE, BeeFeatureType.NONE]
132
+ elif self.cloudType == CloudType.ANY:
133
+ possibilities = [BeeFeatureType.NONE, BeeFeatureType.HIVE, BeeFeatureType.FLOWER]
134
+
135
+ if possibilities:
136
+ self.featureType = random.choice(possibilities)
137
+
138
+ if self.featureType == BeeFeatureType.NONE:
139
+ # When there is no feature type, set the value to 0 so that
140
+ # we can detect the win condition properly
141
+ self.value = 0
142
+ elif self.value == 0:
143
+ self.value = 1
144
+
145
+ self.cloudType = CloudType.NONE
146
+ self.redraw()
147
+
148
+
149
+ class BeePlayer(Player):
150
+
151
+ def __init__(self, maze):
152
+ super().__init__(maze)
153
+
154
+ screen = self._turtle.getscreen()
155
+
156
+ screen.register_shape("bee", BEE_SHAPE)
157
+
158
+ self._turtle.color("black", "yellow")
159
+ self._turtle.shape("bee")
160
+
161
+ def at_flower(self):
162
+ return self._get_current_cell().isFlower()
163
+
164
+ def at_honeycomb(self):
165
+ return self._get_current_cell().isHive()
166
+
167
+ def nectar(self):
168
+ return self._get_value_if(lambda cell: cell.isFlower())
169
+
170
+ def honey(self):
171
+ return self._get_value_if(lambda cell: cell.isHive())
172
+
173
+ def get_nectar(self):
174
+ self._process(lambda cell: cell.isFlower())
175
+
176
+ def make_honey(self):
177
+ self._process(lambda cell: cell.isHive())
178
+
179
+ at_hive = at_honeycomb
180
+
181
+ def _check(self):
182
+ if self.maze.maze_type.detect_win_scenario(self.maze):
183
+ self._success()
184
+ super()._check()
maze/beeshape.py ADDED
@@ -0,0 +1,115 @@
1
+ import turtle
2
+
3
+ # Define the coordinates for the bee shape (a simple polygon)
4
+ bee_shape = (
5
+ (-4, 0),
6
+ (-3, -1),
7
+ (-1.9, -1.5),
8
+ (-0.8, -1.5),
9
+ (1.9, -0.5), # Start of top wing
10
+ (-1.8, -2.7),
11
+ (-2.1, -3.5),
12
+ (-1.9, -4.3),
13
+ (-1.9, -4.3)
14
+ )
15
+
16
+ lg_bee_shape = (
17
+ (-22, 0),
18
+ (-20, -4),
19
+ (-13, -7),
20
+ (-5.6, -7.6),
21
+ (7.4, -2.6), # Start of top wing
22
+ (-10.5, -13.1),
23
+ (-13, -18),
24
+ (-11, -23),
25
+ (-6, -25),
26
+ (-1, -23),
27
+ (7.5, -2.6), # End of top wing
28
+ (9, -7),
29
+ (15, -6),
30
+ (17, -4), # Start of top antenna
31
+ (20, -7),
32
+ (22, -11), # Tip of top antenna
33
+ (20, -7),
34
+ (17, -4), # End of top antenna
35
+ (18, 0),
36
+ (17, 4), # Start of bottom antenna
37
+ (20, 7),
38
+ (22, 11), # Tip of bottom antenna
39
+ (20, 7),
40
+ (17, 4), # End of bottom antenna
41
+ (15, 6),
42
+ (9, 7),
43
+ (7.5, 2.6), # Start of bottom wing
44
+ (-1, 23),
45
+ (-6, 25),
46
+ (-11, 23),
47
+ (-13, 18),
48
+ (-10.5, 13.1),
49
+ (7.4, 2.6), # End of bottom wing
50
+ (-5.6, 7.6),
51
+ (-13, 7),
52
+ (-20, 4)
53
+ # (-22, 0),
54
+ )
55
+
56
+
57
+ lg_bee_shape2 = (
58
+ (0 , -22 ),
59
+ (-4 , -20 ),
60
+ (-7 , -13 ),
61
+ ( 7 , -13 ),
62
+ (-7 , -13 ),
63
+ (-7.6 , -5.6 ),
64
+ ( 7.6 , -5.6 ),
65
+ (-7.6 , -5.6 ),
66
+ (-2.6 , 7.4 ), # Start of top wing
67
+ (-13.1, -10.5 ),
68
+ (-18 , -13 ),
69
+ (-23 , -11 ),
70
+ (-25 , -6 ),
71
+ (-23 , -1 ),
72
+ (-2.6 , 7.5 ), # End of top wing
73
+ (-7 , 9 ),
74
+ (-6 , 15 ),
75
+ (-4 , 17 ), # Start of top antenna
76
+ (-7 , 20 ),
77
+ (-11 , 22 ), # Tip of top antenna
78
+ (-7 , 20 ),
79
+ (-4 , 17 ), # End of top antenna
80
+ (0 , 18 ),
81
+ (4 , 17 ), # Start of bottom antenna
82
+ (7 , 20 ),
83
+ (11 , 22 ), # Tip of bottom antenna
84
+ (7 , 20 ),
85
+ (4 , 17 ), # End of bottom antenna
86
+ (6 , 15 ),
87
+ (7 , 9 ),
88
+ (2.6 , 7.5 ), # Start of bottom wing
89
+ (23 , -1 ),
90
+ (25 , -6 ),
91
+ (23 , -11 ),
92
+ (18 , -13 ),
93
+ (13.1 , -10.5 ),
94
+ (2.6 , 7.4 ), # End of bottom wing
95
+ (7.6 , -5.6 ),
96
+ (7 , -13 ),
97
+ (4 , -20 )
98
+ )
99
+
100
+
101
+ # Register the bee shape with the name "bee"
102
+ turtle.register_shape("bee", lg_bee_shape2)
103
+
104
+ # Create a turtle using our custom bee shape
105
+ bee_turtle = turtle.Turtle()
106
+ bee_turtle.shape("bee")
107
+ bee_turtle.fillcolor("yellow") # Optional: Fill the bee shape with color
108
+
109
+ # Move the bee forward (you can add more movements here)
110
+ for i in range(50):
111
+ bee_turtle.forward(5 + 2 * i)
112
+ bee_turtle.right(45)
113
+
114
+ # Keep the turtle window open
115
+ turtle.done()
maze/birds.py ADDED
@@ -0,0 +1,69 @@
1
+ from enum import Enum
2
+ import random
3
+ from .maze import SquareType, MazeType, Cell, Player, Maze
4
+
5
+
6
+ BIRD_SHAPE = ((0,-12),(-1,-12),(-2,-10),(-3,-3),(-4,-1),(-10,3),(-20,3),(-24,4),(-11,9),(-8,9),(-3,7),(0,10),(0,10),
7
+ (3,7),(8,9),(11,9),(24,4),(20,3),(10,3),(4,-1),(3,-3),(2,-10),(1,-12),(0,-12))
8
+
9
+
10
+ class BirdsMazeType(MazeType):
11
+
12
+ def __init__(self):
13
+ super().__init__()
14
+ self.cellClass = BirdsCell
15
+ self.playerClass = Bird
16
+ self.subfolder = "birds"
17
+
18
+ def setup(self, level, maze):
19
+ super().setup(level, maze)
20
+ screen = maze.screen
21
+
22
+ screen.bgpic(Maze.shapefile("background", ".png"))
23
+ screen.register_shape(Maze.shapefile("path"))
24
+ screen.register_shape(Maze.shapefile("tnt"))
25
+ screen.register_shape(Maze.shapefile("monster"))
26
+
27
+ screen.register_shape(Maze.shapefile("wall_1"))
28
+ screen.register_shape(Maze.shapefile("wall_2"))
29
+ screen.register_shape(Maze.shapefile("wall_3"))
30
+ screen.register_shape(Maze.shapefile("wall_4"))
31
+ screen.register_shape(Maze.shapefile("wall_5"))
32
+
33
+ self.path()._stamp = False
34
+
35
+
36
+ class BirdsCell(Cell):
37
+
38
+ def __init__(self,tileType=0, value=0, range=0):
39
+ super().__init__(tileType=tileType, value=value, range=range)
40
+
41
+ def redraw(self):
42
+ if self.is_obstacle():
43
+ self.shape(Maze.shapefile("tnt"))
44
+ elif self.is_finish():
45
+ self.shape(Maze.shapefile("monster"))
46
+ elif self.is_wall():
47
+ tile = random.randint(1, 5)
48
+ self.shape(Maze.shapefile(f"wall_{tile}"))
49
+
50
+ if self.tileType in [SquareType.OPEN, SquareType.START]:
51
+ self.hideturtle()
52
+ else:
53
+ self.showturtle()
54
+
55
+ def needs_visit(self):
56
+ return self.is_finish()
57
+
58
+
59
+ class Bird(Player):
60
+
61
+ def __init__(self, maze):
62
+ super().__init__(maze)
63
+
64
+ screen = self._turtle.getscreen()
65
+
66
+ screen.register_shape("bird", BIRD_SHAPE)
67
+
68
+ self._turtle.color("black","red")
69
+ self._turtle.shape("bird")
maze/collector.py ADDED
@@ -0,0 +1,106 @@
1
+ import turtle
2
+ from enum import Enum
3
+ import random
4
+ from .maze import SquareType, MazeType, Cell, Player, Maze
5
+
6
+
7
+ COLLECTOR_SHAPE = (
8
+ (0, -15), (-5, -13), (-9, -8), (-9, 0), (-7, 5), (-9, 0), (-9, -8), (-5, -13), (-15, -12), (-19, -9), (-19, 0),
9
+ (-16, 9), (-7, 5), (-16, 9), (-15, 13), (-9, 13), (-7, 11), (-7, 5), (0, 8), (7, 5), (7, 11), (9, 13), (15, 13),
10
+ (16, 9), (7, 5), (16, 9), (19, 0), (19, -9), (15, -12), (5, -13), (9, -8), (9, 0), (7, 5), (9, 0), (9, -8),
11
+ (5, -13), (0, -15))
12
+
13
+ class CollectorMazeType(MazeType):
14
+
15
+ def __init__(self):
16
+ super().__init__()
17
+ self.cellClass = CollectorCell
18
+ self.pathClass = CollectorPath
19
+ self.playerClass = Collector
20
+ self.subfolder = "collector"
21
+ self.min_collected = -1
22
+
23
+ def setup(self, level, maze: Maze):
24
+ super().setup(level, maze)
25
+ screen = maze.screen
26
+
27
+ screen.bgcolor("dark grey")
28
+ screen.register_shape(Maze.shapefile("crystal"))
29
+
30
+ screen.register_shape(Maze.shapefile("wall_1"))
31
+ screen.register_shape(Maze.shapefile("wall_2"))
32
+
33
+ screen.register_shape(Maze.shapefile("floor_1"))
34
+ screen.register_shape(Maze.shapefile("floor_2"))
35
+ screen.register_shape(Maze.shapefile("floor_3"))
36
+ screen.register_shape(Maze.shapefile("floor_4"))
37
+
38
+ level_props = level['properties']
39
+ min_col = level_props.get("min_collected")
40
+ if min_col:
41
+ self.min_collected = int(min_col)
42
+
43
+ def detect_win_scenario(self, maze):
44
+ return maze.player._gems_collected >= self.min_collected
45
+
46
+
47
+
48
+ class CollectorPath(turtle.Turtle):
49
+ def __init__(self):
50
+ turtle.Turtle.__init__(self)
51
+ self.setheading(90)
52
+ self.penup()
53
+ self.speed(0)
54
+
55
+ def draw(self, x, y):
56
+ self.x = x
57
+ self.y = y
58
+ self.goto(x, y)
59
+ tile = random.randint(1, 4)
60
+ self.shape(Maze.shapefile(f"floor_{tile}"))
61
+ self.stamp()
62
+
63
+ class CollectorCell(Cell):
64
+
65
+ def __init__(self,tileType=0, value=0, range=0, featureType=None):
66
+ super().__init__(tileType=tileType, value=value, range=range)
67
+ # Some levels have featureType in the serialized_maze field, even though Collector does not use it for anything
68
+
69
+ def redraw(self):
70
+ if self.is_wall():
71
+ tile = random.randint(1, 2)
72
+ self.showturtle()
73
+ self.shape(Maze.shapefile(f"wall_{tile}"))
74
+
75
+ if self.value != 0:
76
+ self.shape(Maze.shapefile("crystal"))
77
+ self.showturtle()
78
+ self.draw_value()
79
+ elif not self.is_wall():
80
+ self.hideturtle()
81
+
82
+ if self.originalValue != 0 and self.value == 0:
83
+ # Clear any value that might have been previously written
84
+ self.clear()
85
+
86
+ def needs_visit(self):
87
+ return self.originalValue > 0
88
+
89
+
90
+ class Collector(Player):
91
+
92
+ def __init__(self, maze):
93
+ super().__init__(maze)
94
+
95
+ screen = self._turtle.getscreen()
96
+
97
+ screen.register_shape("collector", COLLECTOR_SHAPE)
98
+
99
+ self._turtle.color("black", "navajo white")
100
+ self._turtle.shape("collector")
101
+
102
+ self._gems_collected = 0
103
+
104
+ def collect(self):
105
+ self._process(lambda cell: cell.value > 0)
106
+ self._gems_collected += 1
maze/farmer.py ADDED
@@ -0,0 +1,95 @@
1
+ from enum import Enum
2
+ import random
3
+ from .maze import SquareType, MazeType, Cell, Player, Maze
4
+
5
+ FARMER_SHAPE = (
6
+ (0, -15), (-5, -13), (-9, -8), (-9, 0), (-7, 5), (-9, 0), (-9, -8), (-5, -13), (-15, -12), (-19, -9), (-19, 0),
7
+ (-16, 9), (-7, 5), (-16, 9), (-15, 13), (-9, 13), (-7, 11), (-7, 5), (0, 8), (7, 5), (7, 11), (9, 13), (15, 13),
8
+ (16, 9), (7, 5), (16, 9), (19, 0), (19, -9), (15, -12), (5, -13), (9, -8), (9, 0), (7, 5), (9, 0), (9, -8),
9
+ (5, -13), (0, -15))
10
+
11
+
12
+ class FarmerMazeType(MazeType):
13
+
14
+ def __init__(self):
15
+ super().__init__()
16
+ self.cellClass = FarmerCell
17
+ self.playerClass = Farmer
18
+ self.subfolder = "farmer"
19
+
20
+ def setup(self, level, maze):
21
+ super().setup(level, maze)
22
+ screen = maze.screen
23
+ screen.bgpic(Maze.shapefile("background", ".png"))
24
+ screen.register_shape(Maze.shapefile("path"))
25
+ screen.register_shape(Maze.shapefile("hole"))
26
+ screen.register_shape(Maze.shapefile("pile"))
27
+
28
+ def success(self, maze, player):
29
+ self.path().clear()
30
+ super().success(maze, player)
31
+
32
+
33
+ class FarmerCell(Cell):
34
+
35
+ def __init__(self, tileType=0, value=0, range=0, featureType=0, possibleFeatures: list = None, startsHidden=False):
36
+ super().__init__(tileType=tileType, value=value, range=range)
37
+
38
+ def redraw(self):
39
+ if self.value != 0:
40
+ if self.is_hole():
41
+ self.shape(Maze.shapefile("hole"))
42
+ else:
43
+ self.shape(Maze.shapefile("pile"))
44
+ self.showturtle()
45
+ else:
46
+ self.hideturtle()
47
+
48
+ if self.value != 0:
49
+ self.draw_value()
50
+
51
+ if self.originalValue != 0 and self.value == 0:
52
+ # Clear any value that might have been previously written
53
+ self.clear()
54
+
55
+ def is_hole(self):
56
+ return self.value < 0
57
+
58
+ def is_pile(self):
59
+ return self.value > 0
60
+
61
+ def needs_visit(self):
62
+ return self.originalValue != 0
63
+
64
+
65
+ class Farmer(Player):
66
+
67
+ def __init__(self, maze):
68
+ super().__init__(maze)
69
+
70
+ screen = self._turtle.getscreen()
71
+
72
+ screen.register_shape("farmer", FARMER_SHAPE)
73
+
74
+ self._turtle.color("black", "steel blue")
75
+ self._turtle.shape("farmer")
76
+
77
+ def remove(self):
78
+ """
79
+ Removes dirt from a pile
80
+ :return:
81
+ """
82
+ self._process(lambda cell: cell.is_pile())
83
+
84
+ def fill(self):
85
+ """
86
+ Fills the hole with dirt
87
+ :return:
88
+ """
89
+ self._process(lambda cell: cell.is_hole(), -1)
90
+
91
+ def at_pile(self):
92
+ return self._get_current_cell().is_pile()
93
+
94
+ def at_hole(self):
95
+ return self._get_current_cell().is_hole()
maze/harvester.py ADDED
@@ -0,0 +1,141 @@
1
+ from enum import Enum
2
+ import random
3
+ from .maze import SquareType, MazeType, Cell, Player, Maze
4
+ from .farmer import Farmer
5
+
6
+
7
+ class HarvesterFeatureType(Enum):
8
+ NONE = 0
9
+ CORN = 1
10
+ PUMPKIN = 2
11
+ LETTUCE = 3
12
+
13
+
14
+ class HarvesterMazeType(MazeType):
15
+
16
+ def __init__(self):
17
+ super().__init__()
18
+ self.cellClass = HarvesterCell
19
+ self.playerClass = Harvester
20
+ self.subfolder = "farmer"
21
+
22
+ def setup(self, level, maze):
23
+ super().setup(level, maze)
24
+ screen = maze.screen
25
+ screen.bgpic(Maze.shapefile("background", ".png"))
26
+ screen.register_shape(Maze.shapefile("path"))
27
+ screen.register_shape(Maze.shapefile("sprout"))
28
+ screen.register_shape(Maze.shapefile("lettuce"))
29
+ screen.register_shape(Maze.shapefile("corn"))
30
+ screen.register_shape(Maze.shapefile("pumpkin"))
31
+
32
+ def success(self, maze, player):
33
+ self.path().clear()
34
+ super().success(maze, player)
35
+
36
+
37
+ class HarvesterCell(Cell):
38
+
39
+ def __init__(self, tileType=0, value=0, range=0, featureType=0, possibleFeatures: list = None, startsHidden=False):
40
+ super().__init__(tileType=tileType, value=value, range=range)
41
+
42
+ self.feature_type = HarvesterFeatureType(featureType)
43
+
44
+ if type(possibleFeatures) is list:
45
+ self.possible_features = list(map(lambda feature: HarvesterFeatureType(feature), possibleFeatures))
46
+ else:
47
+ self.possible_features = [HarvesterFeatureType.NONE]
48
+
49
+ self.feature_type = random.choice(self.possible_features)
50
+ if self.feature_type == HarvesterFeatureType.NONE:
51
+ self.value = 0
52
+
53
+ if len(self.possible_features) > 1:
54
+ startsHidden = True
55
+
56
+ self.starts_hidden = startsHidden
57
+
58
+ def redraw(self):
59
+ if self.starts_hidden:
60
+ self.shape(Maze.shapefile("sprout"))
61
+ self.showturtle()
62
+ elif self.is_crop() and self.value > 0:
63
+ self.shape(Maze.shapefile(self.feature_type.name.lower()))
64
+ self.showturtle()
65
+ else:
66
+ self.hideturtle()
67
+
68
+ if self.value != 0 and not self.starts_hidden:
69
+ self.draw_value()
70
+
71
+ if self.originalValue != 0 and self.value == 0:
72
+ # Clear any value that might have been previously written
73
+ self.clear()
74
+
75
+ def reveal(self):
76
+ if self.starts_hidden:
77
+ self.starts_hidden = False
78
+ self.redraw()
79
+
80
+ def is_corn(self):
81
+ return self.feature_type == HarvesterFeatureType.CORN
82
+
83
+ def is_lettuce(self):
84
+ return self.feature_type == HarvesterFeatureType.LETTUCE
85
+
86
+ def is_pumpkin(self):
87
+ return self.feature_type == HarvesterFeatureType.PUMPKIN
88
+
89
+ def is_crop(self):
90
+ return self.feature_type is not HarvesterFeatureType.NONE
91
+
92
+ def needs_visit(self):
93
+ return self.originalValue != 0
94
+
95
+
96
+ class Harvester(Farmer):
97
+
98
+ def __init__(self, maze):
99
+ super().__init__(maze)
100
+
101
+ def pick_pumpkin(self):
102
+ """
103
+ Pick a pumpkin ripe for the taking
104
+ :return:
105
+ """
106
+ self._process(lambda cell: cell.is_pumpkin())
107
+
108
+ def pick_corn(self):
109
+ """
110
+ Pick the corn
111
+ :return:
112
+ """
113
+ self._process(lambda cell: cell.is_corn())
114
+
115
+ def pick_lettuce(self):
116
+ """
117
+ Pick the corn
118
+ :return:
119
+ """
120
+ self._process(lambda cell: cell.is_lettuce())
121
+
122
+ def at_corn(self):
123
+ return self._get_current_cell().is_corn()
124
+
125
+ def at_pumpkin(self):
126
+ return self._get_current_cell().is_pumpkin()
127
+
128
+ def at_lettuce(self):
129
+ return self._get_current_cell().is_lettuce()
130
+
131
+ def has_corn(self):
132
+ cell: FarmerCell = self._get_current_cell()
133
+ return cell.is_corn() and cell.value > 0
134
+
135
+ def has_pumpkin(self):
136
+ cell: FarmerCell = self._get_current_cell()
137
+ return cell.is_pumpkin() and cell.value > 0
138
+
139
+ def has_lettuce(self):
140
+ cell: FarmerCell = self._get_current_cell()
141
+ return cell.is_lettuce() and cell.value > 0
Binary file