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.
- codingpirates_maze-0.1.0.dist-info/METADATA +105 -0
- codingpirates_maze-0.1.0.dist-info/RECORD +539 -0
- codingpirates_maze-0.1.0.dist-info/WHEEL +4 -0
- codingpirates_maze-0.1.0.dist-info/licenses/LICENSE +201 -0
- importer/code_blocks.py +339 -0
- importer/convert_level.py +150 -0
- importer/create_course.py +278 -0
- importer/lesson.md.j2 +3 -0
- importer/maze.py.j2 +20 -0
- importer/test.py +24 -0
- importer/test_all.py +24 -0
- maze/__init__.py +9 -0
- maze/bee.py +184 -0
- maze/beeshape.py +115 -0
- maze/birds.py +69 -0
- maze/collector.py +106 -0
- maze/farmer.py +95 -0
- maze/harvester.py +141 -0
- maze/images/bee/background.png +0 -0
- maze/images/bee/cloud.gif +0 -0
- maze/images/bee/honeycomb.gif +0 -0
- maze/images/bee/path.gif +0 -0
- maze/images/bee/purple_flower.gif +0 -0
- maze/images/bee/red_flower.gif +0 -0
- maze/images/birds/.gitignore +2 -0
- maze/images/birds/background.png +0 -0
- maze/images/birds/monster.gif +0 -0
- maze/images/birds/path.gif +0 -0
- maze/images/birds/tnt.gif +0 -0
- maze/images/birds/wall_1.gif +0 -0
- maze/images/birds/wall_2.gif +0 -0
- maze/images/birds/wall_3.gif +0 -0
- maze/images/birds/wall_4.gif +0 -0
- maze/images/birds/wall_5.gif +0 -0
- maze/images/collector/.gitignore +1 -0
- maze/images/collector/crystal.gif +0 -0
- maze/images/collector/floor_1.gif +0 -0
- maze/images/collector/floor_2.gif +0 -0
- maze/images/collector/floor_3.gif +0 -0
- maze/images/collector/floor_4.gif +0 -0
- maze/images/collector/wall_1.gif +0 -0
- maze/images/collector/wall_2.gif +0 -0
- maze/images/farmer/background.png +0 -0
- maze/images/farmer/corn.gif +0 -0
- maze/images/farmer/hole.gif +0 -0
- maze/images/farmer/lettuce.gif +0 -0
- maze/images/farmer/path.gif +0 -0
- maze/images/farmer/pile.gif +0 -0
- maze/images/farmer/pumpkin.gif +0 -0
- maze/images/farmer/sprout.gif +0 -0
- maze/images/pvz/background.gif +0 -0
- maze/images/pvz/flower.gif +0 -0
- maze/images/pvz/obstacle.gif +0 -0
- maze/images/pvz/path.gif +0 -0
- maze/images/pvz/pumpkin.gif +0 -0
- maze/levels/CourseD_2022LessonExtra14a_2023.json +46 -0
- maze/levels/CourseD_2022LessonExtra14a_2024.json +46 -0
- maze/levels/CourseD_2022LessonExtra14a_2025.json +46 -0
- maze/levels/CourseD_2022LessonExtra15a_2023.json +46 -0
- maze/levels/CourseD_2022LessonExtra15a_2024.json +46 -0
- maze/levels/CourseD_2022LessonExtra15a_2025.json +46 -0
- maze/levels/CourseD_2022LessonExtra16a_2023.json +46 -0
- maze/levels/CourseD_2022LessonExtra16a_2024.json +46 -0
- maze/levels/CourseD_2022LessonExtra16a_2025.json +46 -0
- maze/levels/CourseD_2022_LessonExtra14b_2023.json +47 -0
- maze/levels/CourseD_2022_LessonExtra14b_2024.json +47 -0
- maze/levels/CourseD_2022_LessonExtra14b_2025.json +47 -0
- maze/levels/CourseD_2022_LessonExtra15b_2023.json +47 -0
- maze/levels/CourseD_2022_LessonExtra15b_2024.json +47 -0
- maze/levels/CourseD_2022_LessonExtra15b_2025.json +47 -0
- maze/levels/CourseD_2022_LessonExtra16b_2023.json +47 -0
- maze/levels/CourseD_2022_LessonExtra16b_2024.json +47 -0
- maze/levels/CourseD_2022_LessonExtra16b_2025.json +47 -0
- maze/levels/courseA_harvester_loops10_2024.json +51 -0
- maze/levels/courseA_harvester_loops11_2024.json +51 -0
- maze/levels/courseA_harvester_loops1_2024.json +50 -0
- maze/levels/courseA_harvester_loops2_2024.json +54 -0
- maze/levels/courseA_harvester_loops3_2024.json +57 -0
- maze/levels/courseA_harvester_loops4_2024.json +52 -0
- maze/levels/courseA_harvester_loops5_2024.json +53 -0
- maze/levels/courseA_harvester_loops5a_2024.json +53 -0
- maze/levels/courseA_harvester_loops5b_2024.json +52 -0
- maze/levels/courseA_harvester_loops6_2024.json +55 -0
- maze/levels/courseA_harvester_loops7_2024.json +53 -0
- maze/levels/courseA_harvester_loops9_2024.json +51 -0
- maze/levels/courseA_harvester_seq10_2024.json +50 -0
- maze/levels/courseA_harvester_seq11_2024.json +50 -0
- maze/levels/courseA_harvester_seq12_2024.json +50 -0
- maze/levels/courseA_harvester_seq13_2024.json +50 -0
- maze/levels/courseA_harvester_seq1_2024.json +49 -0
- maze/levels/courseA_harvester_seq2_2024.json +54 -0
- maze/levels/courseA_harvester_seq3_2024.json +54 -0
- maze/levels/courseA_harvester_seq4_2024.json +51 -0
- maze/levels/courseA_harvester_seq5_2024.json +51 -0
- maze/levels/courseA_harvester_seq6_2024.json +50 -0
- maze/levels/courseA_harvester_seq7_2024.json +51 -0
- maze/levels/courseA_harvester_seq8_2024.json +51 -0
- maze/levels/courseA_harvester_seq9_2024.json +51 -0
- maze/levels/courseA_maze_ramp2_2024.json +53 -0
- maze/levels/courseA_maze_ramp3a_2024.json +53 -0
- maze/levels/courseA_maze_ramp3b_2024.json +50 -0
- maze/levels/courseA_maze_ramp4a_2024.json +48 -0
- maze/levels/courseA_maze_ramp5a_2024.json +47 -0
- maze/levels/courseA_maze_seq10_2024.json +48 -0
- maze/levels/courseA_maze_seq11_2024.json +47 -0
- maze/levels/courseA_maze_seq12_2024.json +47 -0
- maze/levels/courseA_maze_seq13_2024.json +49 -0
- maze/levels/courseA_maze_seq1_2024.json +52 -0
- maze/levels/courseA_maze_seq5_2024.json +47 -0
- maze/levels/courseA_maze_seq5a_2024.json +47 -0
- maze/levels/courseA_maze_seq6_2024.json +47 -0
- maze/levels/courseA_maze_seq8_2024.json +47 -0
- maze/levels/courseA_maze_seq_challenge1_2024.json +45 -0
- maze/levels/courseA_maze_seq_challenge2_2024.json +50 -0
- maze/levels/courseB_collector_loops10_2024.json +53 -0
- maze/levels/courseB_collector_loops11_2024.json +51 -0
- maze/levels/courseB_collector_loops1_2024.json +53 -0
- maze/levels/courseB_collector_loops2_2024.json +53 -0
- maze/levels/courseB_collector_loops3_2024.json +57 -0
- maze/levels/courseB_collector_loops4_2024.json +57 -0
- maze/levels/courseB_collector_loops5_2024.json +54 -0
- maze/levels/courseB_collector_loops6_2024.json +54 -0
- maze/levels/courseB_collector_loops7_2024.json +53 -0
- maze/levels/courseB_collector_loops8_2024.json +54 -0
- maze/levels/courseB_collector_loops9_2024.json +54 -0
- maze/levels/courseB_collector_loops_challenge1_2024.json +54 -0
- maze/levels/courseB_collector_loops_challenge2a_2024.json +51 -0
- maze/levels/courseC_collector_loops_challenge2_2024.json +53 -0
- maze/levels/courseC_collector_prog1_2023.json +52 -0
- maze/levels/courseC_collector_prog1_2024.json +52 -0
- maze/levels/courseC_collector_prog2_2023.json +53 -0
- maze/levels/courseC_collector_prog2_2024.json +53 -0
- maze/levels/courseC_collector_prog3_2023.json +49 -0
- maze/levels/courseC_collector_prog3_2024.json +49 -0
- maze/levels/courseC_collector_prog4_2023.json +50 -0
- maze/levels/courseC_collector_prog4_2024.json +50 -0
- maze/levels/courseC_collector_prog5_2023.json +50 -0
- maze/levels/courseC_collector_prog5_2024.json +50 -0
- maze/levels/courseC_collector_prog6_2023.json +50 -0
- maze/levels/courseC_collector_prog6_2024.json +50 -0
- maze/levels/courseC_collector_prog7_2023.json +51 -0
- maze/levels/courseC_collector_prog7_2024.json +51 -0
- maze/levels/courseC_collector_prog8_2023.json +52 -0
- maze/levels/courseC_collector_prog8_2024.json +52 -0
- maze/levels/courseC_collector_prog9_2023.json +52 -0
- maze/levels/courseC_collector_prog9_2024.json +52 -0
- maze/levels/courseC_collector_prog_challenge1_2023.json +51 -0
- maze/levels/courseC_collector_prog_challenge1_2024.json +51 -0
- maze/levels/courseC_collector_prog_challenge2_2023.json +51 -0
- maze/levels/courseC_collector_prog_challenge2_2024.json +51 -0
- maze/levels/courseC_harvester_loops10_2024.json +50 -0
- maze/levels/courseC_harvester_loops11_2024.json +50 -0
- maze/levels/courseC_harvester_loops11_predict1_2024.json +47 -0
- maze/levels/courseC_harvester_loops1_2024.json +52 -0
- maze/levels/courseC_harvester_loops2_2024.json +50 -0
- maze/levels/courseC_harvester_loops3_2024.json +50 -0
- maze/levels/courseC_harvester_loops4_2024.json +50 -0
- maze/levels/courseC_harvester_loops5_2024.json +50 -0
- maze/levels/courseC_harvester_loops6_2024.json +50 -0
- maze/levels/courseC_harvester_loops7_2024.json +50 -0
- maze/levels/courseC_harvester_loops8_2024.json +49 -0
- maze/levels/courseC_harvester_loops9_2024.json +50 -0
- maze/levels/courseC_harvester_loops_challenge1a_2024.json +50 -0
- maze/levels/courseC_harvester_loops_challenge2_2024.json +48 -0
- maze/levels/courseC_maze_debugging1.json +47 -0
- maze/levels/courseC_maze_debugging2.json +44 -0
- maze/levels/courseC_maze_debugging3.json +46 -0
- maze/levels/courseC_maze_debugging4.json +44 -0
- maze/levels/courseC_maze_debugging5.json +46 -0
- maze/levels/courseC_maze_debugging6.json +44 -0
- maze/levels/courseC_maze_debugging7.json +45 -0
- maze/levels/courseC_maze_debugging8_predict1.json +43 -0
- maze/levels/courseC_maze_debugging9.json +44 -0
- maze/levels/courseC_maze_loops_challenge1a_2024.json +47 -0
- maze/levels/courseC_maze_programming1_2023.json +50 -0
- maze/levels/courseC_maze_programming1_2024.json +50 -0
- maze/levels/courseC_maze_programming2_2023.json +53 -0
- maze/levels/courseC_maze_programming2_2024.json +53 -0
- maze/levels/courseC_maze_programming3_2023.json +47 -0
- maze/levels/courseC_maze_programming3_2024.json +47 -0
- maze/levels/courseC_maze_programming4_2023.json +46 -0
- maze/levels/courseC_maze_programming4_2024.json +46 -0
- maze/levels/courseC_maze_programming5_2023.json +46 -0
- maze/levels/courseC_maze_programming5_2024.json +46 -0
- maze/levels/courseC_maze_programming6_2023.json +50 -0
- maze/levels/courseC_maze_programming6_2024.json +49 -0
- maze/levels/courseC_maze_programming7_2023.json +54 -0
- maze/levels/courseC_maze_programming7_2024.json +54 -0
- maze/levels/courseC_maze_programming8_2023.json +52 -0
- maze/levels/courseC_maze_programming8_2024.json +51 -0
- maze/levels/courseC_maze_programming8_predict1_2024.json +45 -0
- maze/levels/courseC_maze_programming9_2023.json +47 -0
- maze/levels/courseC_maze_programming9_2024.json +47 -0
- maze/levels/courseC_maze_programming_challenge1_2023.json +47 -0
- maze/levels/courseC_maze_programming_challenge1_2024.json +47 -0
- maze/levels/courseC_maze_programming_challenge2_2023.json +49 -0
- maze/levels/courseC_maze_programming_challenge2_2024.json +49 -0
- maze/levels/courseD_bee_conditionals10_2023.json +57 -0
- maze/levels/courseD_bee_conditionals10_2024.json +57 -0
- maze/levels/courseD_bee_conditionals10_2025.json +57 -0
- maze/levels/courseD_bee_conditionals1_predict1_2023.json +51 -0
- maze/levels/courseD_bee_conditionals1_predict1_2024.json +51 -0
- maze/levels/courseD_bee_conditionals1_predict1_2025.json +51 -0
- maze/levels/courseD_bee_conditionals2_2023.json +60 -0
- maze/levels/courseD_bee_conditionals2_2024.json +60 -0
- maze/levels/courseD_bee_conditionals2_2025.json +60 -0
- maze/levels/courseD_bee_conditionals3_2023.json +57 -0
- maze/levels/courseD_bee_conditionals3_2024.json +57 -0
- maze/levels/courseD_bee_conditionals3_2025.json +57 -0
- maze/levels/courseD_bee_conditionals4_2023.json +58 -0
- maze/levels/courseD_bee_conditionals4_2024.json +58 -0
- maze/levels/courseD_bee_conditionals4_2025.json +58 -0
- maze/levels/courseD_bee_conditionals5_2023.json +58 -0
- maze/levels/courseD_bee_conditionals5_2024.json +58 -0
- maze/levels/courseD_bee_conditionals5_2025.json +58 -0
- maze/levels/courseD_bee_conditionals6_2023.json +57 -0
- maze/levels/courseD_bee_conditionals6_2024.json +57 -0
- maze/levels/courseD_bee_conditionals6_2025.json +57 -0
- maze/levels/courseD_bee_conditionals7_2023.json +57 -0
- maze/levels/courseD_bee_conditionals7_2024.json +57 -0
- maze/levels/courseD_bee_conditionals7_2025.json +57 -0
- maze/levels/courseD_bee_conditionals7_predict2_2023.json +54 -0
- maze/levels/courseD_bee_conditionals7_predict2_2024.json +54 -0
- maze/levels/courseD_bee_conditionals7_predict2_2025.json +54 -0
- maze/levels/courseD_bee_conditionals8_2023.json +57 -0
- maze/levels/courseD_bee_conditionals8_2024.json +57 -0
- maze/levels/courseD_bee_conditionals8_2025.json +57 -0
- maze/levels/courseD_bee_conditionals9_2023.json +55 -0
- maze/levels/courseD_bee_conditionals9_2024.json +55 -0
- maze/levels/courseD_bee_conditionals9_2025.json +55 -0
- maze/levels/courseD_bee_conditionals_challenge1_2023.json +57 -0
- maze/levels/courseD_bee_conditionals_challenge1_2024.json +57 -0
- maze/levels/courseD_bee_conditionals_challenge1_2025.json +57 -0
- maze/levels/courseD_bee_conditionals_challenge2_2023.json +58 -0
- maze/levels/courseD_bee_conditionals_challenge2_2024.json +58 -0
- maze/levels/courseD_bee_conditionals_challenge2_2025.json +58 -0
- maze/levels/courseD_bee_nestedLoops1.json +49 -0
- maze/levels/courseD_bee_nestedLoops1_2023.json +53 -0
- maze/levels/courseD_bee_nestedLoops1_2024.json +53 -0
- maze/levels/courseD_bee_nestedLoops1_2025.json +53 -0
- maze/levels/courseD_bee_nestedLoops1a.json +49 -0
- maze/levels/courseD_bee_nestedLoops1a_2023.json +55 -0
- maze/levels/courseD_bee_nestedLoops1a_2024.json +55 -0
- maze/levels/courseD_bee_nestedLoops1a_2025.json +55 -0
- maze/levels/courseD_bee_nestedLoops2.json +50 -0
- maze/levels/courseD_bee_nestedLoops2_2023.json +57 -0
- maze/levels/courseD_bee_nestedLoops2_2024.json +57 -0
- maze/levels/courseD_bee_nestedLoops2_2025.json +57 -0
- maze/levels/courseD_bee_nestedLoops2_predict1.json +51 -0
- maze/levels/courseD_bee_nestedLoops2_predict1_2023.json +51 -0
- maze/levels/courseD_bee_nestedLoops2_predict1_2024.json +51 -0
- maze/levels/courseD_bee_nestedLoops2_predict1_2025.json +51 -0
- maze/levels/courseD_bee_nestedLoops7.json +53 -0
- maze/levels/courseD_bee_nestedLoops7_2023.json +59 -0
- maze/levels/courseD_bee_nestedLoops7_2024.json +59 -0
- maze/levels/courseD_bee_nestedLoops7_2025.json +59 -0
- maze/levels/courseD_bee_nestedLoops8.json +52 -0
- maze/levels/courseD_bee_nestedLoops8_2023.json +59 -0
- maze/levels/courseD_bee_nestedLoops8_2024.json +59 -0
- maze/levels/courseD_bee_nestedLoops8_2025.json +59 -0
- maze/levels/courseD_bee_nestedLoops9.json +53 -0
- maze/levels/courseD_bee_nestedLoops9_2023.json +60 -0
- maze/levels/courseD_bee_nestedLoops9_2024.json +60 -0
- maze/levels/courseD_bee_nestedLoops9_2025.json +60 -0
- maze/levels/courseD_bee_nestedLoops9_predict2.json +51 -0
- maze/levels/courseD_bee_nestedLoops9_predict2_2023.json +54 -0
- maze/levels/courseD_bee_nestedLoops9_predict2_2024.json +54 -0
- maze/levels/courseD_bee_nestedLoops9_predict2_2025.json +54 -0
- maze/levels/courseD_collector_debugging1a_2023.json +50 -0
- maze/levels/courseD_collector_debugging1a_2024.json +50 -0
- maze/levels/courseD_collector_debugging1a_2025.json +50 -0
- maze/levels/courseD_collector_debugging2a_2023.json +50 -0
- maze/levels/courseD_collector_debugging2a_2024.json +50 -0
- maze/levels/courseD_collector_debugging2a_2025.json +50 -0
- maze/levels/courseD_collector_debugging3a_2023.json +50 -0
- maze/levels/courseD_collector_debugging3a_2024.json +50 -0
- maze/levels/courseD_collector_debugging3a_2025.json +50 -0
- maze/levels/courseD_collector_debugging4a_2023.json +50 -0
- maze/levels/courseD_collector_debugging4a_2024.json +50 -0
- maze/levels/courseD_collector_debugging4a_2025.json +50 -0
- maze/levels/courseD_collector_debugging5a_2023.json +50 -0
- maze/levels/courseD_collector_debugging5a_2024.json +50 -0
- maze/levels/courseD_collector_debugging5a_2025.json +50 -0
- maze/levels/courseD_collector_debugging6a_2023.json +56 -0
- maze/levels/courseD_collector_debugging6a_2024.json +56 -0
- maze/levels/courseD_collector_debugging6a_2025.json +56 -0
- maze/levels/courseD_collector_debugging8a_2023.json +49 -0
- maze/levels/courseD_collector_debugging8a_2024.json +49 -0
- maze/levels/courseD_collector_debugging8a_2025.json +49 -0
- maze/levels/courseD_collector_debugging9a_2023.json +49 -0
- maze/levels/courseD_collector_debugging9a_2024.json +49 -0
- maze/levels/courseD_collector_debugging9a_2025.json +49 -0
- maze/levels/courseD_collector_nested_loops_challenge2_2024.json +50 -0
- maze/levels/courseD_collector_nested_loops_challenge2_2025.json +50 -0
- maze/levels/courseD_farmer_while10_2023.json +50 -0
- maze/levels/courseD_farmer_while10_2024.json +50 -0
- maze/levels/courseD_farmer_while10_2025.json +50 -0
- maze/levels/courseD_farmer_while10_predict2_2024.json +45 -0
- maze/levels/courseD_farmer_while10_predict2_2025.json +45 -0
- maze/levels/courseD_farmer_while1_2023.json +49 -0
- maze/levels/courseD_farmer_while1_2024.json +49 -0
- maze/levels/courseD_farmer_while1_2025.json +49 -0
- maze/levels/courseD_farmer_while2_2023.json +45 -0
- maze/levels/courseD_farmer_while2_2024.json +45 -0
- maze/levels/courseD_farmer_while2_2025.json +45 -0
- maze/levels/courseD_farmer_while3_2023.json +47 -0
- maze/levels/courseD_farmer_while3_2024.json +47 -0
- maze/levels/courseD_farmer_while3_2025.json +47 -0
- maze/levels/courseD_farmer_while4_2023.json +50 -0
- maze/levels/courseD_farmer_while4_2024.json +50 -0
- maze/levels/courseD_farmer_while4_2025.json +50 -0
- maze/levels/courseD_farmer_while4_predict1_2024.json +47 -0
- maze/levels/courseD_farmer_while4_predict1_2025.json +47 -0
- maze/levels/courseD_farmer_while5_2023.json +52 -0
- maze/levels/courseD_farmer_while5_2024.json +52 -0
- maze/levels/courseD_farmer_while5_2025.json +52 -0
- maze/levels/courseD_farmer_while6_2023.json +51 -0
- maze/levels/courseD_farmer_while6_2024.json +51 -0
- maze/levels/courseD_farmer_while6_2025.json +51 -0
- maze/levels/courseD_farmer_while7_2023.json +52 -0
- maze/levels/courseD_farmer_while7_2024.json +52 -0
- maze/levels/courseD_farmer_while7_2025.json +52 -0
- maze/levels/courseD_farmer_while8_2023.json +51 -0
- maze/levels/courseD_farmer_while8_2024.json +51 -0
- maze/levels/courseD_farmer_while8_2025.json +51 -0
- maze/levels/courseD_farmer_while9_2023.json +50 -0
- maze/levels/courseD_farmer_while9_2024.json +50 -0
- maze/levels/courseD_farmer_while9_2025.json +50 -0
- maze/levels/courseD_farmer_while_challenge1_2023.json +50 -0
- maze/levels/courseD_farmer_while_challenge1_2024.json +50 -0
- maze/levels/courseD_farmer_while_challenge1_2025.json +50 -0
- maze/levels/courseD_harvester_nested_loops_challenge1_2024.json +51 -0
- maze/levels/courseD_harvester_nested_loops_challenge1_2025.json +51 -0
- maze/levels/courseD_iceage_loops10_2024.json +48 -0
- maze/levels/courseD_iceage_loops10_2025.json +48 -0
- maze/levels/courseD_iceage_loops11_2024.json +46 -0
- maze/levels/courseD_iceage_loops11_2025.json +46 -0
- maze/levels/courseD_iceage_loops12_2024.json +46 -0
- maze/levels/courseD_iceage_loops12_2025.json +46 -0
- maze/levels/courseD_iceage_loops1_2024.json +49 -0
- maze/levels/courseD_iceage_loops1_2025.json +49 -0
- maze/levels/courseD_iceage_loops2_2024.json +51 -0
- maze/levels/courseD_iceage_loops2_2025.json +51 -0
- maze/levels/courseD_iceage_loops3_2024.json +51 -0
- maze/levels/courseD_iceage_loops3_2025.json +51 -0
- maze/levels/courseD_iceage_loops4_2024.json +47 -0
- maze/levels/courseD_iceage_loops4_2025.json +47 -0
- maze/levels/courseD_iceage_loops6_2024.json +47 -0
- maze/levels/courseD_iceage_loops6_2025.json +47 -0
- maze/levels/courseD_iceage_loops7_2024.json +47 -0
- maze/levels/courseD_iceage_loops7_2025.json +47 -0
- maze/levels/courseD_iceage_loops8_2024.json +49 -0
- maze/levels/courseD_iceage_loops8_2025.json +49 -0
- maze/levels/courseD_iceage_loops9_2024.json +49 -0
- maze/levels/courseD_iceage_loops9_2025.json +49 -0
- maze/levels/courseD_maze_intro4_2023.json +45 -0
- maze/levels/courseD_maze_intro4_2024.json +45 -0
- maze/levels/courseD_maze_intro4_2025.json +45 -0
- maze/levels/courseD_maze_intro5a_2023.json +45 -0
- maze/levels/courseD_maze_intro5a_2024.json +45 -0
- maze/levels/courseD_maze_intro5a_2025.json +45 -0
- maze/levels/courseD_maze_intro5c_2023.json +45 -0
- maze/levels/courseD_maze_intro5c_2024.json +45 -0
- maze/levels/courseD_maze_intro5c_2025.json +45 -0
- maze/levels/courseD_maze_nestedLoops3.json +46 -0
- maze/levels/courseD_maze_nestedLoops3_2023.json +47 -0
- maze/levels/courseD_maze_nestedLoops3_2024.json +47 -0
- maze/levels/courseD_maze_nestedLoops3_2025.json +47 -0
- maze/levels/courseD_maze_nestedLoops4.json +45 -0
- maze/levels/courseD_maze_nestedLoops4_2023.json +47 -0
- maze/levels/courseD_maze_nestedLoops4_2024.json +47 -0
- maze/levels/courseD_maze_nestedLoops4_2025.json +47 -0
- maze/levels/courseD_maze_nestedLoops5.json +44 -0
- maze/levels/courseD_maze_nestedLoops5_2023.json +45 -0
- maze/levels/courseD_maze_nestedLoops5_2024.json +45 -0
- maze/levels/courseD_maze_nestedLoops5_2025.json +45 -0
- maze/levels/courseD_maze_nestedLoops6.json +43 -0
- maze/levels/courseD_maze_nestedLoops6_2023.json +45 -0
- maze/levels/courseD_maze_nestedLoops6_2024.json +45 -0
- maze/levels/courseD_maze_nestedLoops6_2025.json +45 -0
- maze/levels/courseD_maze_ramp1.json +47 -0
- maze/levels/courseD_maze_ramp1_2023.json +45 -0
- maze/levels/courseD_maze_ramp1_2024.json +45 -0
- maze/levels/courseD_maze_ramp1_2025.json +45 -0
- maze/levels/courseD_maze_ramp2.json +47 -0
- maze/levels/courseD_maze_ramp2_2023.json +45 -0
- maze/levels/courseD_maze_ramp2_2024.json +45 -0
- maze/levels/courseD_maze_ramp2_2025.json +45 -0
- maze/levels/courseD_maze_ramp3.json +46 -0
- maze/levels/courseD_maze_ramp3_2023.json +45 -0
- maze/levels/courseD_maze_ramp3_2024.json +45 -0
- maze/levels/courseD_maze_ramp3_2025.json +45 -0
- maze/levels/courseD_maze_ramp4.json +47 -0
- maze/levels/courseD_maze_ramp5.json +44 -0
- maze/levels/courseD_maze_ramp5_2023.json +42 -0
- maze/levels/courseD_maze_ramp5_2024.json +42 -0
- maze/levels/courseD_maze_ramp5_2025.json +42 -0
- maze/levels/courseD_maze_ramp5a.json +45 -0
- maze/levels/courseD_maze_ramp5b.json +45 -0
- maze/levels/courseD_maze_ramp5b_2023.json +43 -0
- maze/levels/courseD_maze_ramp5b_2024.json +43 -0
- maze/levels/courseD_maze_ramp5b_2025.json +43 -0
- maze/levels/courseD_maze_ramp5c.json +46 -0
- maze/levels/courseD_maze_ramp5d.json +45 -0
- maze/levels/courseD_maze_ramp5d_2023.json +43 -0
- maze/levels/courseD_maze_ramp5d_2024.json +43 -0
- maze/levels/courseD_maze_ramp5d_2025.json +43 -0
- maze/levels/courseD_maze_until10_2023.json +53 -0
- maze/levels/courseD_maze_until10_2024.json +53 -0
- maze/levels/courseD_maze_until10_2025.json +53 -0
- maze/levels/courseD_maze_until10_predict2_2024.json +52 -0
- maze/levels/courseD_maze_until10_predict2_2025.json +52 -0
- maze/levels/courseD_maze_until1_2023.json +47 -0
- maze/levels/courseD_maze_until1_2024.json +47 -0
- maze/levels/courseD_maze_until1_2025.json +47 -0
- maze/levels/courseD_maze_until2_predict1_2024.json +44 -0
- maze/levels/courseD_maze_until2_predict1_2025.json +44 -0
- maze/levels/courseD_maze_until3_2023.json +48 -0
- maze/levels/courseD_maze_until3_2024.json +48 -0
- maze/levels/courseD_maze_until3_2025.json +48 -0
- maze/levels/courseD_maze_until4_2023.json +49 -0
- maze/levels/courseD_maze_until4_2024.json +49 -0
- maze/levels/courseD_maze_until4_2025.json +49 -0
- maze/levels/courseD_maze_until5_2023.json +49 -0
- maze/levels/courseD_maze_until5_2024.json +49 -0
- maze/levels/courseD_maze_until5_2025.json +49 -0
- maze/levels/courseD_maze_until6_2023.json +49 -0
- maze/levels/courseD_maze_until6_2024.json +49 -0
- maze/levels/courseD_maze_until6_2025.json +49 -0
- maze/levels/courseD_maze_until7_2023.json +49 -0
- maze/levels/courseD_maze_until7_2024.json +49 -0
- maze/levels/courseD_maze_until7_2025.json +49 -0
- maze/levels/courseD_maze_until9_2023.json +53 -0
- maze/levels/courseD_maze_until9_2024.json +53 -0
- maze/levels/courseD_maze_until9_2025.json +53 -0
- maze/levels/courseD_scrat_predict1.json +44 -0
- maze/levels/courseD_scrat_ramp1.json +46 -0
- maze/levels/courseD_scrat_ramp2.json +47 -0
- maze/levels/courseD_scrat_ramp3.json +45 -0
- maze/levels/courseD_scrat_ramp4.json +46 -0
- maze/levels/courseD_scrat_ramp5.json +46 -0
- maze/levels/courseD_scrat_ramp6.json +47 -0
- maze/levels/courseD_scrat_ramp8.json +47 -0
- maze/levels/courseE_farmer_functions10a1_2023.json +55 -0
- maze/levels/courseE_farmer_functions10a1_2024.json +55 -0
- maze/levels/courseE_farmer_functions11_predict_2024.json +49 -0
- maze/levels/courseE_farmer_functions13_2023.json +55 -0
- maze/levels/courseE_farmer_functions13_2024.json +55 -0
- maze/levels/courseE_farmer_functions1_2023.json +54 -0
- maze/levels/courseE_farmer_functions1_2024.json +54 -0
- maze/levels/courseE_farmer_functions1a_2023.json +55 -0
- maze/levels/courseE_farmer_functions1a_2024.json +55 -0
- maze/levels/courseE_farmer_functions2b_2023.json +55 -0
- maze/levels/courseE_farmer_functions2b_2024.json +55 -0
- maze/levels/courseE_farmer_functions2ba_2023.json +55 -0
- maze/levels/courseE_farmer_functions2ba_2024.json +55 -0
- maze/levels/courseE_farmer_functions3c1_2023.json +56 -0
- maze/levels/courseE_farmer_functions3c1_2024.json +56 -0
- maze/levels/courseE_farmer_functions3c_2023.json +55 -0
- maze/levels/courseE_farmer_functions3c_2024.json +55 -0
- maze/levels/courseE_farmer_functions7a1_2023.json +59 -0
- maze/levels/courseE_farmer_functions7a1_2024.json +59 -0
- maze/levels/courseE_farmer_functions8a1_2023.json +56 -0
- maze/levels/courseE_farmer_functions8a1_2024.json +56 -0
- maze/levels/courseE_farmer_functions9a1_2023.json +58 -0
- maze/levels/courseE_farmer_functions9a1_2024.json +58 -0
- maze/levels/courseE_farmer_ramp11a_2023.json +49 -0
- maze/levels/courseE_farmer_ramp11a_2024.json +49 -0
- maze/levels/courseE_farmer_ramp11b_2023.json +50 -0
- maze/levels/courseE_farmer_ramp11b_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12_forswap_2023.json +50 -0
- maze/levels/courseE_farmer_ramp12_forswap_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12b_2023.json +50 -0
- maze/levels/courseE_farmer_ramp12b_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12c_2023.json +50 -0
- maze/levels/courseE_farmer_ramp12c_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12d_2023.json +50 -0
- maze/levels/courseE_farmer_ramp12d_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12e_2023.json +50 -0
- maze/levels/courseE_farmer_ramp12e_2024.json +50 -0
- maze/levels/courseE_farmer_ramp12f_2023.json +51 -0
- maze/levels/courseE_farmer_ramp12f_2024.json +51 -0
- maze/levels/courseE_farmer_while1_2023.json +54 -0
- maze/levels/courseE_farmer_while1_2024.json +54 -0
- maze/levels/courseF_bee_conditionals10.json +53 -0
- maze/levels/courseF_bee_conditionals1_predict1.json +52 -0
- maze/levels/courseF_bee_conditionals2.json +53 -0
- maze/levels/courseF_bee_conditionals3.json +51 -0
- maze/levels/courseF_bee_conditionals4.json +50 -0
- maze/levels/courseF_bee_conditionals5.json +53 -0
- maze/levels/courseF_bee_conditionals7_predict2.json +53 -0
- maze/levels/courseF_bee_conditionals8.json +54 -0
- maze/levels/courseF_bee_for1.json +50 -0
- maze/levels/courseF_bee_for10.json +53 -0
- maze/levels/courseF_bee_for11.json +48 -0
- maze/levels/courseF_bee_for2.json +51 -0
- maze/levels/courseF_bee_for3_predict1.json +52 -0
- maze/levels/courseF_bee_for4.json +54 -0
- maze/levels/courseF_bee_for5.json +52 -0
- maze/levels/courseF_bee_for6.json +55 -0
- maze/levels/courseF_bee_for7.json +53 -0
- maze/levels/courseF_bee_for8.json +54 -0
- maze/levels/courseF_bee_for9.json +55 -0
- maze/levels/courseF_bee_for_challenge1.json +52 -0
- maze/levels/courseF_bee_for_challenge2.json +48 -0
- maze/levels/courseF_bee_functions2.json +55 -0
- maze/levels/courseF_bee_functions3.json +55 -0
- maze/levels/courseF_bee_functions3a.json +55 -0
- maze/levels/courseF_bee_functions4.json +54 -0
- maze/levels/courseF_bee_functions5a.json +55 -0
- maze/levels/courseF_bee_functions6.json +57 -0
- maze/levels/courseF_bee_functions7.json +55 -0
- maze/levels/courseF_bee_functions8a.json +52 -0
- maze/levels/courseF_bee_functionsPre7.json +56 -0
- maze/levels/courseF_bee_functions_challenge1.json +52 -0
- maze/levels/courseF_bee_functions_challenge2.json +51 -0
- maze/levels/courseF_bee_fwp1.json +52 -0
- maze/levels/courseF_bee_fwp2.json +52 -0
- maze/levels/courseF_bee_fwp3.json +54 -0
- maze/levels/courseF_bee_fwp4.json +52 -0
- maze/levels/courseF_bee_fwp5.json +52 -0
- maze/levels/courseF_bee_fwp6.json +53 -0
- maze/levels/courseF_bee_fwp7.json +52 -0
- maze/levels/courseF_bee_fwp8.json +55 -0
- maze/levels/courseF_bee_fwp9_predict1.json +54 -0
- maze/levels/courseF_bee_fwp_challenge1.json +47 -0
- maze/levels/courseF_bee_fwp_challenge2.json +48 -0
- maze/levels/coursea_maze_ramp1_2024.json +53 -0
- maze/levels/grade2_collector_10_2023.json +45 -0
- maze/levels/grade2_collector_10_2024.json +45 -0
- maze/levels/grade2_collector_A_2023.json +50 -0
- maze/levels/grade2_collector_A_2024.json +50 -0
- maze/levels/grade2_collector_A_predict1_2023.json +46 -0
- maze/levels/grade2_collector_A_predict1_2024.json +46 -0
- maze/maze.py +650 -0
- maze/puzzle.py +75 -0
- maze/pvz.py +62 -0
- maze/screencapture.py +22 -0
- 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
|