From b1fcb88c582466fe06888e54e9eb376d7e47a833 Mon Sep 17 00:00:00 2001 From: lecointre Date: Tue, 2 Dec 2025 13:36:37 +0100 Subject: [PATCH] Fin menu v2 --- Makefile | 19 +++----- obj/game_logic.o | Bin 4024 -> 4024 bytes obj/game_view.o | Bin 5064 -> 5064 bytes obj/images.o | Bin 3048 -> 3048 bytes obj/main.o | Bin 3368 -> 3792 bytes obj/menu_view.o | Bin 6160 -> 6152 bytes obj/utils.o | Bin 1496 -> 1496 bytes src/game_view.c | 117 ++--------------------------------------------- src/game_view.h | 13 +----- src/main.c | 116 +++++++++++++++++++++++++--------------------- src/menu_view.h | 6 +-- taquin | Bin 22048 -> 22048 bytes 12 files changed, 79 insertions(+), 192 deletions(-) diff --git a/Makefile b/Makefile index 4fceb3d..9a52d92 100644 --- a/Makefile +++ b/Makefile @@ -2,18 +2,15 @@ # Variables de compilation CC = gcc -CFLAGS = -Wall -Wextra -std=c89 +CFLAGS = -Wall -Wextra -std=c89 LDFLAGS = -lgraph TARGET = taquin -<<<<<<< HEAD # Liste de tous les fichiers sources (.c) - INCLUT TOUS LES MODULES -======= -# Liste de tous les fichiers sources (.c) - INCLUT game_view.c ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c SRCS = src/main.c src/menu_view.c src/game_logic.c src/images.c src/utils.c src/game_view.c # Liste de tous les fichiers objets (.o) correspondants +# (Transforme src/*.c en obj/*.o) OBJS = $(patsubst src/%.c, obj/%.o, $(SRCS)) # ---------------------------------------------------------------------- @@ -25,26 +22,22 @@ all: dir $(TARGET) # Crée le dossier obj/ si non existant dir: - @mkdir -p obj + @mkdir -p obj # Règle de liaison : crée l'exécutable taquin à partir de tous les objets $(TARGET): $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) # Règle générique pour la compilation de tous les .c en .o obj/%.o: src/%.c - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ # Exécute le programme run: $(TARGET) - ./$(TARGET) + ./$(TARGET) # Nettoyage clean: -<<<<<<< HEAD @rm -rf obj $(TARGET) -======= - @rm -rf obj $(TARGET) ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c .PHONY : all clean run diff --git a/obj/game_logic.o b/obj/game_logic.o index ca3442c3625997b47e1e57ca9ddf4a5ae8ca6bc4..cf48cf81968caf1b8af1d73459357381fed153f2 100644 GIT binary patch delta 412 zcmdlXze9e*4@Ma!k8V~51_lO?URyBLd2p8o0|Uc8Mg|6k&EibljPkO7|Nr;sc0JKu zzyhWm1U!0upLq0!KIlCDg5mFGN9Nazj4qRPS*s^6Wwqop)icsFR4_6yGBvO;G@ks1 zRfdsqGACO#KO@LUM?QfzCTCtYrazk}v-vVIGERQT9?obz*^)z_v3PPOhdZP1Mj0^aJh_ldTr!gxVm?SE50Xl*$qTu}CBK1$q2>r7$;wT> z$R*AgGx;S~zN9tOt_2W-z%Bv_6;CeY7MJven*Rh%R%Y@-ZgIv1lXr68XH1$rlc$_< Q(PTkhd&WhZ19{V#0EGQ*d;kCd delta 392 zcmdlXze9e*4@P-ak8V~51_lO?&V#!&7#JA#F@iX~P_g5iMVPo58KovGFv~Fg{j=GQ z`86Y><76$?>d7lu&G=08jPwi@j0}uS3@i*xC%<8pVPu%h$yUwJ0y4#sPoRy-nU{^} z|K`bTzKo14lOM8&GulnI`mcB`<)?VqjokVqjnZIqT1V2)Hp>kV{-L86?cWzyLCXn}LA=Cd)V3kxQIW9!$DT zF60uI%wdL@4^qj4q>^{?LN0O1pCDnVIYLOXijyyLi8IDee#wEC7OV B9f1G< delta 100 zcmX@1enNf2O(ss)2_C(?3=9kmlOHh!aPDMcU|{g*Wo6iG&HRIjr}G$y4HD`+zS*9Q znUT*#&q&Wu!N|bK#K6M9baDW@0wcrbLiTu8#(9%3^7J$Q+MLKcossd!=AV4$SpbbM B9cusp diff --git a/obj/images.o b/obj/images.o index 7daa184e298283adfe3625b9d6077bc1299798e5..7da29035e2ae819fbaf55241d0559c4b2f5484b5 100644 GIT binary patch delta 57 zcmaDM{z80%DYK5Lo{^rRf{}rdsey%|F#`y&FfcGEFfcH%GB7Z>`-L(vF)$tgi7{?Y IWNzmG06Q)TJpcdz delta 57 zcmaDM{z80%DYK4=o{^rRf{}rdiGhWIDFX`-L(vF)$tgi7{+W IWNzmG06OvsI{*Lx diff --git a/obj/main.o b/obj/main.o index 9e8a3b2f78c874c139c7ef91ac58c82ed6340397..cd27842f63127f7c9bcd0f10b4975207accec896 100644 GIT binary patch delta 1154 zcmZ1>bwPH522%j{L@h(E{=4JC} zW@cW(#KX=pc_XLXn#*LddGKVuV9+`ZRS)B1Sn7j%mpM%MFVDbl;iNl7g#Vn{15$}E|j&89CFl3$vfk?NY~SW=RjSCYyA;ZL5) zW-q|Nz@QEC3*T*|;**~KNZkz_fMWJ@Op zvWqiL1e41qH?oUMo<~y2gQW5Sl_;d7D&!<8B;}VT=cIx-S*fLZdU{+84DQa(Rtg&K zexaHQh9-JOdWH%{21X_Z76zsu8$g(afq_ARfq?;Jzq?;30}}(|0gxEO~%5RQj31?(HJ~@#^obe`@d;lh2fyqB$l5Mghn>eG` z4!e1Ig&izNF2Nt_Q!{11{iKa#ldWJgYM z!y-nAG{{GSNV3zA#D$Q=mrq{EDQ>t8Dhmo;W+d6eP;roHB1q!rCtu_g4}FFtD~2Td z2}xWWN&F9zxCD~8D9Bo9EJ#k?%JrL3e)2|cbIu!V5WhG~{>W|46wfp{kXvlB1CIub z*}$X0nE=)6J9#6IIn!FE$**|qm`*~K@@g<$V49r8Ysbhic_ptslLY7FSG;zd4j?Zw lFfbHMHsmws+yIJr1_lQ8$%TC8oCct%WME(@nQX`-4* z^$;UHIuGuvVPs%<;laYd&>h;+?b^Y3p|?WAquX@@R5M(ODojaFuMHD61uSp{IL&y- z%)sE$?YhHb@^of%0jQrH!9n8Ld0_Kx=BX@`^EnRjnd%wo87deV7?~Pa7#dHu=agh* zoE*s+&ELb!z`)?hC(y>^%*)2yzWFdGFC(M+fyBVj0ihUl7#J9s7#JC@ zPiEvcXY845$^D%1&}2m(cgCxmGkMN4F6d4YfdW9sCK0{V>YlNklwCC`Ck4{R_41IQ_hp_YA|oG2(RDFhP2B5OK% zqM*2>A5@lwfq{XWfq~)Ae+WpQd{9taG7l;XvH-+{$(Bw2C@3yj2NGgnU_jT~I$2Rj zTyhVRtRRxf7bXV^iA&yu%7RQ5L6Utwxlu@5@+UY|LQED%l69TDQAk`e1{$a!dj*hW zlP5nE5|_+IlI28_Ee7j7jwCCABztADqp&!m{NzaCaK=NEHwueOUWK}00W>s0E(PK1 zlOGC;OR7W7d4MK6Z?d4seMYs(A4SX=1tx2X+B2nbOr9trHn~Am1I9ccs==5s`K72m zqs(MYF?%KpPKXLI4MvN}E5+$&P~JlHWlQ47P-U z0py^iP>ZD}7Yd3?I)a3-$VN?GC@3yj43!1>Nq~WY;m>~vsG59HP+YPJNtP2ywhOFx zI#d>9J&3s+YVXm>hCV!s3#5kz_$p1q%U<$$`S* zlBc1*Xn;720b~OR->KH=n7Vk)EM~k%5t^frX**#F_Gpj2m~#vjPB&iwJT6 delta 30 mcmcb?eS>>KH=l`~k)EM~k%5tkfrWwT#F_Gp3>$aKvjPB&Y6x%u diff --git a/src/game_view.c b/src/game_view.c index 1d989b7..94c4ca9 100644 --- a/src/game_view.c +++ b/src/game_view.c @@ -1,44 +1,27 @@ -<<<<<<< HEAD /* src/game_view.c * Implémentation du rendu graphique du plateau et de la boucle d'interaction. */ -======= ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c #include "game_view.h" #include #include #include -<<<<<<< HEAD -/* Constantes et variables globales (définies dans d'autres modules ou par l'IUT) */ -======= -#define WINDOW_WIDTH 800 -#define WINDOW_HEIGHT 600 - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c extern int _X; extern int _Y; #define MARGIN 50 /* Marge autour du plateau */ -<<<<<<< HEAD /* --- Fonctions Utilitaires Privées --- */ /* Vérifie si un clic est sur une tuile donnée */ -======= -/* Fonction utilitaire : vérifie si un clic est sur une tuile donnée */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c static int is_in_tile_rect(int x_click, int y_click, int tile_x, int tile_y, int tile_w, int tile_h) { return (x_click >= tile_x && x_click <= tile_x + tile_w && y_click >= tile_y && y_click <= tile_y + tile_h); } -<<<<<<< HEAD /* --- Fonctions de Rendu et de Logique --- */ -======= ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c /* Dessine le plateau de jeu */ void game_render(const game_state_t *state) @@ -46,7 +29,6 @@ void game_render(const game_state_t *state) int i, r, c; couleur C_FOND = CouleurParNom("gray"); couleur C_BORDURE = CouleurParNom("black"); -<<<<<<< HEAD EffacerEcran(C_FOND); @@ -56,38 +38,18 @@ void game_render(const game_state_t *state) ChoisirCouleurDessin(C_BORDURE); -======= - - EffacerEcran(C_FOND); - - /* Calcul de la taille de chaque tuile pour l'affichage (utilise la taille de la première tuile) */ - int tile_display_w = state->all_tiles[0]->width; - int tile_display_h = state->all_tiles[0]->height; - - - ChoisirCouleurDessin(C_BORDURE); - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c /* Boucle sur toutes les cases du plateau */ for (i = 0; i < state->rows * state->cols; i++) { int tile_id = state->permutation[i]; int x_pos, y_pos; -<<<<<<< HEAD r = i / state->cols; c = i % state->cols; -======= - - r = i / state->cols; - c = i % state->cols; - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c /* Position d'affichage sur l'écran */ x_pos = MARGIN + c * tile_display_w; y_pos = MARGIN + r * tile_display_h; -<<<<<<< HEAD if (tile_id != -1) { /* C'est une tuile (non vide) */ tile_t *current_tile = state->all_tiles[tile_id]; @@ -102,49 +64,22 @@ void game_render(const game_state_t *state) } else { /* Dessine la case vide en couleur distincte (jaune) */ -======= - if (tile_id != -1) { /* Ne dessine pas si c'est la case vide */ - tile_t *current_tile = state->all_tiles[tile_id]; - - /* ChargerImage(fichier, x_dst, y_dst, x_src, y_src, l, h) */ - ChargerImage(current_tile->path, - x_pos, y_pos, - current_tile->src_x, current_tile->src_y, - tile_display_w, tile_display_h); - - /* Dessine une fine bordure autour de la tuile */ - DessinerRectangle(x_pos, y_pos, tile_display_w, tile_display_h); - - } else { - /* Dessine la case vide en jaune (ou couleur distincte) */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c ChoisirCouleurDessin(CouleurParNom("yellow")); RemplirRectangle(x_pos, y_pos, tile_display_w, tile_display_h); ChoisirCouleurDessin(C_BORDURE); DessinerRectangle(x_pos, y_pos, tile_display_w, tile_display_h); } } -<<<<<<< HEAD -======= - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c /* Affichage du compteur de coups */ char buffer[100]; sprintf(buffer, "Coups: %lu", state->moves); EcrireTexte(MARGIN, WINDOW_HEIGHT - 30, buffer, 1); -<<<<<<< HEAD /* Affichage de la victoire */ if (state->is_solved) { ChoisirCouleurDessin(CouleurParNom("red")); EcrireTexte(WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 2, "BRAVO ! PRESSEZ UNE TOUCHE.", 2); -======= - - /* Affichage de la victoire si résolu */ - if (state->is_solved) { - /* TODO: Afficher un grand BRAVO */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c } } @@ -152,29 +87,17 @@ void game_render(const game_state_t *state) /* Gère les entrées (clic/clavier) et la boucle principale du jeu */ void game_loop(game_state_t *state) { -<<<<<<< HEAD unsigned long next_update = Microsecondes() + REFRESH_CYCLE; int go_on = 1; while (go_on && !state->is_solved) -======= - unsigned long next_update = Microsecondes() + 50000L; - int go_on = 1; - - while (go_on && !state->is_solved) ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c { /* Rendu et rafraîchissement */ if (Microsecondes() > next_update) { game_render(state); -<<<<<<< HEAD CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); next_update = Microsecondes() + REFRESH_CYCLE; -======= - CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); - next_update = Microsecondes() + 50000L; ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c } /* Gestion des événements Souris */ @@ -185,29 +108,17 @@ void game_loop(game_state_t *state) int y_click = _Y; int tile_w = state->all_tiles[0]->width; int tile_h = state->all_tiles[0]->height; -<<<<<<< HEAD -======= - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c /* Parcourir toutes les tuiles pour voir laquelle a été cliquée */ for (i = 0; i < state->rows * state->cols; i++) { int r = i / state->cols; int c = i % state->cols; -<<<<<<< HEAD -======= - ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c int x_pos = MARGIN + c * tile_w; int y_pos = MARGIN + r * tile_h; if (is_in_tile_rect(x_click, y_click, x_pos, y_pos, tile_w, tile_h)) { -<<<<<<< HEAD /* Tenter de déplacer la tuile cliquée (indice i) */ -======= - /* Tenter de déplacer la tuile cliquée */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c game_move_tile(state, i); break; } @@ -217,7 +128,6 @@ void game_loop(game_state_t *state) /* Gestion des événements Clavier */ if (ToucheEnAttente()) { int key = Touche(); -<<<<<<< HEAD int target_index = -1; int empty_r = state->empty_index / state->cols; @@ -226,19 +136,19 @@ void game_loop(game_state_t *state) if (key == XK_Escape) { go_on = 0; } - /* CORRECTION FINALE : Inverse le mapping de commande pour la perception intuitive */ + /* CORRECTION FINALE : Inverse le mapping pour la perception intuitive */ else if (key == XK_Up) { - /* Le joueur appuie HAUT (monte) -> la tuile en BAS (r+1) doit monter */ + /* Flèche HAUT : Déplace la tuile en BAS (r + 1) vers le vide (r) */ target_index = (empty_r + 1) * state->cols + empty_c; } else if (key == XK_Down) { - /* Le joueur appuie BAS (descend) -> la tuile en HAUT (r-1) doit descendre */ + /* Flèche BAS : Déplace la tuile en HAUT (r - 1) vers le vide (r) */ target_index = (empty_r - 1) * state->cols + empty_c; } else if (key == XK_Left) { - /* Le joueur appuie GAUCHE -> la tuile à DROITE (c+1) va à gauche */ + /* Flèche GAUCHE : Déplace la tuile de DROITE (c + 1) vers le vide (c) */ target_index = empty_r * state->cols + (empty_c + 1); } else if (key == XK_Right) { - /* Le joueur appuie DROITE -> la tuile à GAUCHE (c-1) va à droite */ + /* Flèche DROITE : Déplace la tuile de GAUCHE (c - 1) vers le vide (c) */ target_index = empty_r * state->cols + (empty_c - 1); } @@ -269,20 +179,3 @@ void game_loop(game_state_t *state) } } } -======= - if (key == XK_Escape) { - go_on = 0; /* Quitter la boucle de jeu */ - } - /* TODO: Ajouter les flèches pour les déplacements clavier */ - } - } - - /* Si la boucle est terminée par la victoire, on affiche le BRAVO */ - if (state->is_solved) { - game_render(state); /* Dernière mise à jour pour montrer l'image complète */ - CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); - printf("BRAVO ! Partie terminee en %lu coups.\n", state->moves); - Touche(); /* Attend une touche avant de nettoyer */ - } -} ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c diff --git a/src/game_view.h b/src/game_view.h index 89a7079..ba9b6b7 100644 --- a/src/game_view.h +++ b/src/game_view.h @@ -1,4 +1,3 @@ -<<<<<<< HEAD /* src/game_view.h * Définitions du module de la vue du plateau de jeu. */ @@ -6,13 +5,7 @@ #define GAME_VIEW_H #include "game_logic.h" -#include "defs.h" /* Nécessaire pour les constantes de fenêtre */ -======= -#ifndef GAME_VIEW_H -#define GAME_VIEW_H - -#include "game_logic.h" /* Nécessaire pour connaître la structure game_state_t */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c +#include "defs.h" /* Dessine le plateau de jeu, les tuiles à leur position actuelle, et le compteur de coups. */ void game_render(const game_state_t *state); @@ -20,8 +13,4 @@ void game_render(const game_state_t *state); /* Gère la boucle principale du jeu, les événements (clics/clavier) et les rafraîchissements. */ void game_loop(game_state_t *state); -<<<<<<< HEAD #endif /* GAME_VIEW_H */ -======= -#endif /* GAME_VIEW_H */ ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c diff --git a/src/main.c b/src/main.c index dafc663..6c7eab2 100644 --- a/src/main.c +++ b/src/main.c @@ -2,13 +2,12 @@ * Point d'entrée du programme Taquin. * Gère la boucle principale des événements et la transition de vue (Menu -> Jeu). */ -#include "game_view.h" #include "menu_view.h" #include "game_logic.h" #include "images.h" -#include "game_view.h" /* NOUVEAU: Pour la boucle de jeu */ -#include "defs.h" /* NOUVEAU: Pour les constantes de fenêtre */ +#include "game_view.h" +#include "defs.h" #include #include #include @@ -18,66 +17,81 @@ 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)); - menu_init(&menu_state); - next_update = Microsecondes() + REFRESH_CYCLE; + /* Grande boucle pour rejouer (retourne au menu) */ + do { + play_again = 0; /* Réinitialisation pour cette tentative */ - /* 2. Boucle du Menu */ - while (menu_state.ready_to_play == 0) - { - if (Microsecondes() > next_update) + /* 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) { - menu_render(&menu_state); - CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); - next_update = Microsecondes() + REFRESH_CYCLE; + 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); } - if (SourisCliquee()) - { - menu_handle_mouse_click(&menu_state); - } + } while (play_again == 1); - menu_handle_key(&menu_state); - } - - /* 3. Transition vers le jeu */ - if (menu_state.ready_to_play == 1) { - - image_source_t img_src; - tile_t **tiles; - game_state_t game_state; - int num_tiles = menu_state.rows * menu_state.cols; - - /* 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); - game_init(&game_state, menu_state.rows, menu_state.cols, tiles); - - /* Mélange le plateau */ - game_shuffle_safe(&game_state, 500); - - printf("DEBUG: Jeu prêt. Grille %d x %d melangee. Lancement de la boucle de jeu...\n", - game_state.rows, game_state.cols); - -<<<<<<< HEAD - /* Lancement de la BOUCLE DE JEU */ - game_loop(&game_state); -======= - /* TODO: Boucle de JEU (GRANDE PARTIE 3) */ - game_loop(&game_state); ->>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c - - /* Nettoyage final (après que le joueur a fini de jouer) */ - images_free_tiles(tiles, num_tiles); - game_free(&game_state); - } - FermerGraphique(); return EXIT_SUCCESS; } diff --git a/src/menu_view.h b/src/menu_view.h index 3d34f75..cbead52 100644 --- a/src/menu_view.h +++ b/src/menu_view.h @@ -1,6 +1,4 @@ -/* src/menu_view.h - * Définition de l'état du menu et des prototypes pour le module de configuration. - */ +/* src/menu_view.h */ #ifndef MENU_VIEW_H #define MENU_VIEW_H @@ -15,7 +13,7 @@ typedef struct { int rows; /* Nombre de lignes (3 à 8) */ int cols; /* Nombre de colonnes (3 à 8) */ int ready_to_play; /* 1 si le joueur a validé, -1 si demande de quitter */ -} menu_state_t; +} menu_state_t; /* <--- POINT-VIRGULE CORRECT */ /* Prototypes des fonctions publiques */ void menu_init(menu_state_t *state); diff --git a/taquin b/taquin index ed640ef52b15bade806ea2cddc8ad79be7dfe916..b161afaf95ad0aa6d12868f1d44bc5a4b24b2a51 100755 GIT binary patch delta 4300 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 delta 4146 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