diff --git a/Makefile b/Makefile index 21a9cfc..4fceb3d 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +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 @@ -21,22 +25,26 @@ 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/src/game_view.c b/src/game_view.c index 8963608..1d989b7 100644 --- a/src/game_view.c +++ b/src/game_view.c @@ -1,28 +1,44 @@ +<<<<<<< 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) @@ -30,6 +46,7 @@ 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); @@ -39,18 +56,38 @@ 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]; @@ -65,22 +102,49 @@ 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 } } @@ -88,17 +152,29 @@ 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 */ @@ -109,17 +185,29 @@ 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; } @@ -129,6 +217,7 @@ 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; @@ -180,3 +269,20 @@ 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 8abefee..89a7079 100644 --- a/src/game_view.h +++ b/src/game_view.h @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* src/game_view.h * Définitions du module de la vue du plateau de jeu. */ @@ -6,6 +7,12 @@ #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 /* Dessine le plateau de jeu, les tuiles à leur position actuelle, et le compteur de coups. */ void game_render(const game_state_t *state); @@ -13,4 +20,8 @@ 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 e3fecd4..dafc663 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ * 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" @@ -64,8 +65,13 @@ int main(void) 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);