From d47240d482809e9591a23304c7337e60361b27e5 Mon Sep 17 00:00:00 2001 From: Vincent BRUNEAU Date: Thu, 12 Dec 2024 15:33:01 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20d'un=20p'tit=20bonus,=20pensez=20=C3=A0?= =?UTF-8?q?=20me=20citer=20si=20vous=20l'utilisez=20^^?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bonus.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 bonus.c diff --git a/bonus.c b/bonus.c new file mode 100644 index 0000000..25b0be9 --- /dev/null +++ b/bonus.c @@ -0,0 +1,150 @@ +// modifie la position du joueur pour éviter le spawn kill et le spawn win +//implémenté par Vincent BRUNEAU ;)- +static void prevent_bad_spawn(game *g) +{ + if (g->m->nb_minotaurs == g->m->nb_reachable - 4) + { + //avec autant de minotaure, cette fonction serait une perte de temps + printf("Debbug prevent_bad_spawn: trop de minotaures pour être efficace, abandon de la fonction\n"); + return; + } + const int save = g->m->player; //la cellule qui contient le joueur + free_occupied_maze(g->m, save); + int neighbour = get_adj_maze(g->m, save, NORTH); + bool good_spawn = has_wall_maze(g->m, save, NORTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour); + neighbour = get_adj_maze(g->m, save, EAST); + good_spawn = good_spawn && (has_wall_maze(g->m, save, EAST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, save, SOUTH); + good_spawn = good_spawn && (has_wall_maze(g->m, save, SOUTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, save, WEST); + good_spawn = good_spawn && (has_wall_maze(g->m, save, WEST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + good_spawn = good_spawn && get_object_maze(g->m, save) != EXIT; + int fusible = g->m->hsize * g->m->vsize / 2; // on limite le nombre de tentatives + while (!good_spawn && fusible-- > 0) + { + getrandom(&g->m->player, sizeof(g->m->player), 0); + g->m->player = abs(g->m->player) % (g->m->hsize * g->m->vsize); + //le départ doit être valide + good_spawn = can_be_used(g->m, g->m->player) && !is_occupied_maze(g->m, g->m->player); + //le départ ne doit pas tuer le joueur + neighbour = get_adj_maze(g->m, g->m->player, NORTH); + good_spawn = good_spawn && (has_wall_maze(g->m, g->m->player, NORTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, g->m->player, EAST); + good_spawn = good_spawn && (has_wall_maze(g->m, g->m->player, EAST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, g->m->player, SOUTH); + good_spawn = good_spawn && (has_wall_maze(g->m, g->m->player, SOUTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, g->m->player, WEST); + good_spawn = good_spawn && (has_wall_maze(g->m, g->m->player, WEST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + //le départ ne doit pas être la sortie + good_spawn = good_spawn && get_object_maze(g->m, g->m->player) != EXIT; + } + if (fusible <= 0) + { + fprintf(stderr, "Warning prevent_bad_spawn: impossible de trouver un spawn correct dans un delai raisonnable\n"); + for (int i = 0; i < g->m->hsize * g->m->vsize; i++) + { + good_spawn = can_be_used(g->m, i) && !is_occupied_maze(g->m, i); + neighbour = get_adj_maze(g->m, i, NORTH); + good_spawn = good_spawn && (has_wall_maze(g->m, i, NORTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, i, EAST); + good_spawn = good_spawn && (has_wall_maze(g->m, i, EAST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, i, SOUTH); + good_spawn = good_spawn && (has_wall_maze(g->m, i, SOUTH) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + neighbour = get_adj_maze(g->m, i, WEST); + good_spawn = good_spawn && (has_wall_maze(g->m, i, WEST) || !can_be_used(g->m, neighbour) || !is_occupied_maze(g->m, neighbour)); + good_spawn = good_spawn && get_object_maze(g->m, i) != EXIT; + if (good_spawn) + { + g->m->player = i; + break; + } + } + } + if (!good_spawn) + { + fprintf(stdout, "Warnint prevent_bad_spawn: impossible de trouver un spawn correct\n"); + //plutôt que de bouger le joueur, on bouge les minotaures + g->m->player = save; + make_occupied_maze(g->m, save); + neighbour = get_adj_maze(g->m, save, NORTH); + int mino = has_minotaur_maze(g->m, neighbour); + if (mino != -1 && !has_wall_maze(g->m, save, NORTH)) + { + int place; //la cellule qui contient le minotaure actuel + do + { + getrandom(&place, sizeof(place), 0); + place %= g->m->hsize * g->m->vsize; + good_spawn = can_be_used(g->m, place) && !is_occupied_maze(g->m, place); + good_spawn = good_spawn && (get_adj_maze(g->m, place, NORTH) != save || has_wall_maze(g->m, place, NORTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, EAST) != save || has_wall_maze(g->m, place, EAST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, WEST) != save || has_wall_maze(g->m, place, WEST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, SOUTH) != save || has_wall_maze(g->m, place, SOUTH)); + } while (!good_spawn); + free_occupied_maze(g->m, g->m->minotaurs[mino]); + g->m->minotaurs[mino] = place; + make_occupied_maze(g->m, place); + } + neighbour = get_adj_maze(g->m, save, SOUTH); + mino = has_minotaur_maze(g->m, neighbour); + if (mino != -1 && !has_wall_maze(g->m, save, SOUTH)) + { + int place; //la cellule qui contient le minotaure actuel + do + { + getrandom(&place, sizeof(place), 0); + place %= g->m->hsize * g->m->vsize; + good_spawn = can_be_used(g->m, place) && !is_occupied_maze(g->m, place); + good_spawn = good_spawn && (get_adj_maze(g->m, place, EAST) != save || has_wall_maze(g->m, place, EAST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, SOUTH) != save || has_wall_maze(g->m, place, SOUTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, WEST) != save || has_wall_maze(g->m, place, WEST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, NORTH) != save || has_wall_maze(g->m, place, NORTH)); + } while (!good_spawn); + free_occupied_maze(g->m, g->m->minotaurs[mino]); + g->m->minotaurs[mino] = place; + make_occupied_maze(g->m, place); + } + neighbour = get_adj_maze(g->m, save, EAST); + mino = has_minotaur_maze(g->m, neighbour); + if (mino != -1 && !has_wall_maze(g->m, save, EAST)) + { + int place; //la cellule qui contient le minotaure actuel + do + { + getrandom(&place, sizeof(place), 0); + place %= g->m->hsize * g->m->vsize; + good_spawn = can_be_used(g->m, place) && !is_occupied_maze(g->m, place); + good_spawn = good_spawn && (get_adj_maze(g->m, place, NORTH) != save || has_wall_maze(g->m, place, NORTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, EAST) != save || has_wall_maze(g->m, place, EAST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, SOUTH) != save || has_wall_maze(g->m, place, SOUTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, WEST) != save || has_wall_maze(g->m, place, WEST)); + } while (!good_spawn); + free_occupied_maze(g->m, g->m->minotaurs[mino]); + g->m->minotaurs[mino] = place; + make_occupied_maze(g->m, place); + } + neighbour = get_adj_maze(g->m, save, WEST); + mino = has_minotaur_maze(g->m, neighbour); + if (mino != -1 && !has_wall_maze(g->m, save, WEST)) + { + int place; //la cellule qui contient le minotaure actuel + do + { + getrandom(&place, sizeof(place), 0); + place %= g->m->hsize * g->m->vsize; + good_spawn = can_be_used(g->m, place) && !is_occupied_maze(g->m, place); + good_spawn = good_spawn && (get_adj_maze(g->m, place, NORTH) != save || has_wall_maze(g->m, place, NORTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, SOUTH) != save || has_wall_maze(g->m, place, SOUTH)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, WEST) != save || has_wall_maze(g->m, place, WEST)); + good_spawn = good_spawn && (get_adj_maze(g->m, place, EAST) != save || has_wall_maze(g->m, place, EAST)); + } while (!good_spawn); + free_occupied_maze(g->m, g->m->minotaurs[mino]); + g->m->minotaurs[mino] = place; + make_occupied_maze(g->m, place); + } + } + else + { + make_occupied_maze(g->m, g->m->player); + } +}