// // Created by snapshot112 on 10/15/25. // #include "maze_runner.h" #include #include #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"); return NULL; } rooster *rp = grid_from_file(fh); fclose(fh); // 3. Bepaal of het lezen van het rooster is gelukt. if (rp == NULL) { fprintf(stderr, "Kan rooster niet maken.\n"); return NULL; } 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!"); rooster_zet_toestand(rp, STATE_BEGIN); return; } 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) { 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(); if (rp == NULL) { return; } show_grid(rp); rooster_zet_toestand(rp, STATE_AAN_HET_SPELEN); // Game zelf. while (rooster_vraag_toestand(rp) == STATE_AAN_HET_SPELEN) { speel_maze(rp); } // Exit game. game_exit_screen(rp); rooster_klaar(rp); }