/* src/main.c * Point d'entrée du programme Taquin. * Gère la boucle principale des événements et la transition de vue (Menu -> Jeu). */ #include "menu_view.h" #include "game_logic.h" #include "images.h" #include "game_view.h" #include "defs.h" #include #include #include #include int main(void) { menu_state_t menu_state; unsigned long next_update; int play_again = 1; /* 1. Initialisation de l'environnement IUT */ InitialiserGraphique(); CreerFenetre(10, 10, WINDOW_WIDTH, WINDOW_HEIGHT); srand((unsigned int)time(NULL)); /* Grande boucle pour rejouer (retourne au menu) */ do { play_again = 0; /* Réinitialisation pour cette tentative */ /* 2. Phase de Configuration (Menu) */ menu_init(&menu_state); next_update = Microsecondes() + REFRESH_CYCLE; while (menu_state.ready_to_play == 0 && menu_state.ready_to_play != -1) { if (Microsecondes() > next_update) { menu_render(&menu_state); CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); next_update = Microsecondes() + REFRESH_CYCLE; } if (SourisCliquee()) { menu_handle_mouse_click(&menu_state); } menu_handle_key(&menu_state); } /* Sortie du menu par validation */ if (menu_state.ready_to_play == 1) { image_source_t img_src; tile_t **tiles; game_state_t game_state; int num_tiles; /* Préparation des données et initialisation du moteur de jeu */ img_src = get_image_source(menu_state.selected_image); tiles = images_slice(img_src, menu_state.rows, menu_state.cols); if (tiles == NULL) { fprintf(stderr, "Erreur: Allocation tuiles echouee. Retour au menu.\n"); continue; } num_tiles = menu_state.rows * menu_state.cols; game_init(&game_state, menu_state.rows, menu_state.cols, tiles); game_shuffle_safe(&game_state, 500); printf("DEBUG: Jeu prêt. Grille %d x %d melangee.\n", game_state.rows, game_state.cols); /* Lancement de la BOUCLE DE JEU */ game_loop(&game_state); /* Après game_loop (si la boucle est sortie par victoire ou ESC) */ /* S'assurer que le joueur veut rejouer */ if (ToucheEnAttente()) { int final_key = Touche(); if (final_key == 'n' || final_key == 'N') { play_again = 1; /* Remet la grande boucle en marche */ } } /* Nettoyage des ressources allouées */ images_free_tiles(tiles, num_tiles); game_free(&game_state); } } while (play_again == 1); FermerGraphique(); return EXIT_SUCCESS; }