Got the minigame menu up, running and documented. Also split up the game file
This commit is contained in:
		
							
								
								
									
										128
									
								
								maze_runner.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								maze_runner.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| // | ||||
| // Created by snapshot112 on 10/15/25. | ||||
| // | ||||
|  | ||||
| #include "maze_runner.h" | ||||
|  | ||||
| #include <ncurses.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "grid_game_engine.h" | ||||
| #include "rooster.h" | ||||
|  | ||||
| /* | ||||
|  * Reads in the maze from the assets file. | ||||
|  */ | ||||
| static rooster *get_maze(void) { | ||||
|     // TODO: echt opties aanbieden in plaats van hardcoded 1 maze. | ||||
|     // Alternatief is om random een maze te genereren. dit is miss beter. | ||||
|  | ||||
|     // 2. Open het doolhof bestand en lees het rooster. | ||||
|     FILE *fh = fopen("assets/maze.txt", "r"); | ||||
|     if (fh == NULL) { | ||||
|         perror("loading maze"); | ||||
|         exit(EXIT_FAILURE); | ||||
|     } | ||||
|     rooster *rp = rooster_lees(fh); | ||||
|     fclose(fh); | ||||
|  | ||||
|     // 3. Bepaal of het lezen van het rooster is gelukt. | ||||
|     if (rp == NULL) { | ||||
|         fprintf(stderr, "Kan rooster niet maken.\n"); | ||||
|         exit(EXIT_FAILURE); | ||||
|     } | ||||
|  | ||||
|     return rp; | ||||
| } | ||||
|  | ||||
| /* Voert de benodigde veranderingen in het rooster door als de speler in een | ||||
|  * bepaalde richting probeert te bewegen. | ||||
|  * Input: | ||||
|  * rp   : een pointer naar het rooster | ||||
|  * dx,dy: de richting waarin de speler probeert te bewegen. De vier mogelijk- | ||||
|  *        heden voor (dx,dy) zijn (-1,0), (1,0), (0,-1), (0,1) voor resp. | ||||
|  *        links, rechts, omhoog en omlaag. | ||||
|  * | ||||
|  * Side effect: het rooster wordt aangepast op basis van de handeling van | ||||
|  *              de speler. | ||||
|  */ | ||||
| static void maze_runner_beweeg(rooster *rp, int dx, int dy) { | ||||
|     int playerx; | ||||
|     int playery; | ||||
|     rooster_zoek(rp, '*', &playerx, &playery); | ||||
|  | ||||
|     if (playerx == -1 || playery == -1) { | ||||
|         printf("Player not found!"); | ||||
|         exit(1); | ||||
|     } | ||||
|  | ||||
|     if (rooster_bevat(rp, playerx + dx, playery + dy) == 1) { | ||||
|         char new_location = rooster_kijk(rp, playerx + dx, playery + dy); | ||||
|         switch (new_location) { | ||||
|             case '#': | ||||
|                 break; | ||||
|             case 'X': | ||||
|                 update_grid(rp, ' ', playerx, playery); | ||||
|                 rooster_zet_toestand(rp, STATE_VERLOREN); | ||||
|                 break; | ||||
|             case ' ': | ||||
|                 update_grid(rp, ' ', playerx, playery); | ||||
|                 update_grid(rp, '*', playerx + dx, playery + dy); | ||||
|                 break; | ||||
|             case '$': | ||||
|                 update_grid(rp, ' ', playerx, playery); | ||||
|                 rooster_zet_toestand(rp, STATE_GEWONNEN); | ||||
|                 break; | ||||
|         } | ||||
|         refresh(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Speelt het spel met een gegeven rooster tot de toestand niet langer | ||||
|  * AAN_HET_SPELEN is. | ||||
|  */ | ||||
| static void speel_maze(rooster *rp) { | ||||
|     while (rooster_vraag_toestand(rp) == STATE_AAN_HET_SPELEN) | ||||
|     { | ||||
|         switch (getch()) { | ||||
|             case KEY_UP: // fallthrough | ||||
|             case 'w': | ||||
|             case 'W': | ||||
|                 maze_runner_beweeg(rp, 0, -1); | ||||
|                 break; | ||||
|             case KEY_DOWN: // fallthrough | ||||
|             case 's': | ||||
|             case 'S': | ||||
|                 maze_runner_beweeg(rp, 0, 1); | ||||
|                 break; | ||||
|             case KEY_LEFT: // fallthrough | ||||
|             case 'a': | ||||
|             case 'A': | ||||
|                 maze_runner_beweeg(rp, -1, 0); | ||||
|                 break; | ||||
|             case KEY_RIGHT: // fallthrough | ||||
|             case 'd': | ||||
|             case 'D': | ||||
|                 maze_runner_beweeg(rp, 1, 0); | ||||
|                 break; | ||||
|             case KEY_BACKSPACE: | ||||
|                 rooster_zet_toestand(rp, STATE_QUIT); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void maze_runner(void) { | ||||
|     // Voorbereiding. | ||||
|     rooster *rp = get_maze(); | ||||
|     show_grid(rp); | ||||
|     rooster_zet_toestand(rp, STATE_AAN_HET_SPELEN); | ||||
|  | ||||
|     // Game zelf. | ||||
|     speel_maze(rp); | ||||
|  | ||||
|     // Exit game. | ||||
|     game_exit_screen(rp); | ||||
|     rooster_klaar(rp); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user