This commit is contained in:
lecointre
2025-12-01 22:12:51 +01:00
4 changed files with 136 additions and 5 deletions
+8
View File
@@ -6,7 +6,11 @@ CFLAGS = -Wall -Wextra -std=c89
LDFLAGS = -lgraph LDFLAGS = -lgraph
TARGET = taquin TARGET = taquin
<<<<<<< HEAD
# Liste de tous les fichiers sources (.c) - INCLUT TOUS LES MODULES # 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 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 # Liste de tous les fichiers objets (.o) correspondants
@@ -37,6 +41,10 @@ run: $(TARGET)
# Nettoyage # Nettoyage
clean: clean:
<<<<<<< HEAD
@rm -rf obj $(TARGET) @rm -rf obj $(TARGET)
=======
@rm -rf obj $(TARGET)
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
.PHONY : all clean run .PHONY : all clean run
+106
View File
@@ -1,28 +1,44 @@
<<<<<<< HEAD
/* src/game_view.c /* src/game_view.c
* Implémentation du rendu graphique du plateau et de la boucle d'interaction. * Implémentation du rendu graphique du plateau et de la boucle d'interaction.
*/ */
=======
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
#include "game_view.h" #include "game_view.h"
#include <graph.h> #include <graph.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
<<<<<<< HEAD
/* Constantes et variables globales (définies dans d'autres modules ou par l'IUT) */ /* 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 _X;
extern int _Y; extern int _Y;
#define MARGIN 50 /* Marge autour du plateau */ #define MARGIN 50 /* Marge autour du plateau */
<<<<<<< HEAD
/* --- Fonctions Utilitaires Privées --- */ /* --- Fonctions Utilitaires Privées --- */
/* Vérifie si un clic est sur une tuile donnée */ /* 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) 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 && return (x_click >= tile_x && x_click <= tile_x + tile_w &&
y_click >= tile_y && y_click <= tile_y + tile_h); y_click >= tile_y && y_click <= tile_y + tile_h);
} }
<<<<<<< HEAD
/* --- Fonctions de Rendu et de Logique --- */ /* --- Fonctions de Rendu et de Logique --- */
=======
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
/* Dessine le plateau de jeu */ /* Dessine le plateau de jeu */
void game_render(const game_state_t *state) void game_render(const game_state_t *state)
@@ -30,6 +46,7 @@ void game_render(const game_state_t *state)
int i, r, c; int i, r, c;
couleur C_FOND = CouleurParNom("gray"); couleur C_FOND = CouleurParNom("gray");
couleur C_BORDURE = CouleurParNom("black"); couleur C_BORDURE = CouleurParNom("black");
<<<<<<< HEAD
EffacerEcran(C_FOND); EffacerEcran(C_FOND);
@@ -39,18 +56,38 @@ void game_render(const game_state_t *state)
ChoisirCouleurDessin(C_BORDURE); 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 */ /* Boucle sur toutes les cases du plateau */
for (i = 0; i < state->rows * state->cols; i++) { for (i = 0; i < state->rows * state->cols; i++) {
int tile_id = state->permutation[i]; int tile_id = state->permutation[i];
int x_pos, y_pos; int x_pos, y_pos;
<<<<<<< HEAD
r = i / state->cols; r = i / state->cols;
c = i % state->cols; c = i % state->cols;
=======
r = i / state->cols;
c = i % state->cols;
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
/* Position d'affichage sur l'écran */ /* Position d'affichage sur l'écran */
x_pos = MARGIN + c * tile_display_w; x_pos = MARGIN + c * tile_display_w;
y_pos = MARGIN + r * tile_display_h; y_pos = MARGIN + r * tile_display_h;
<<<<<<< HEAD
if (tile_id != -1) { /* C'est une tuile (non vide) */ if (tile_id != -1) { /* C'est une tuile (non vide) */
tile_t *current_tile = state->all_tiles[tile_id]; tile_t *current_tile = state->all_tiles[tile_id];
@@ -65,22 +102,49 @@ void game_render(const game_state_t *state)
} else { } else {
/* Dessine la case vide en couleur distincte (jaune) */ /* 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")); ChoisirCouleurDessin(CouleurParNom("yellow"));
RemplirRectangle(x_pos, y_pos, tile_display_w, tile_display_h); RemplirRectangle(x_pos, y_pos, tile_display_w, tile_display_h);
ChoisirCouleurDessin(C_BORDURE); ChoisirCouleurDessin(C_BORDURE);
DessinerRectangle(x_pos, y_pos, tile_display_w, tile_display_h); DessinerRectangle(x_pos, y_pos, tile_display_w, tile_display_h);
} }
} }
<<<<<<< HEAD
=======
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
/* Affichage du compteur de coups */ /* Affichage du compteur de coups */
char buffer[100]; char buffer[100];
sprintf(buffer, "Coups: %lu", state->moves); sprintf(buffer, "Coups: %lu", state->moves);
EcrireTexte(MARGIN, WINDOW_HEIGHT - 30, buffer, 1); EcrireTexte(MARGIN, WINDOW_HEIGHT - 30, buffer, 1);
<<<<<<< HEAD
/* Affichage de la victoire */ /* Affichage de la victoire */
if (state->is_solved) { if (state->is_solved) {
ChoisirCouleurDessin(CouleurParNom("red")); ChoisirCouleurDessin(CouleurParNom("red"));
EcrireTexte(WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 2, "BRAVO ! PRESSEZ UNE TOUCHE.", 2); 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 */ /* Gère les entrées (clic/clavier) et la boucle principale du jeu */
void game_loop(game_state_t *state) void game_loop(game_state_t *state)
{ {
<<<<<<< HEAD
unsigned long next_update = Microsecondes() + REFRESH_CYCLE; unsigned long next_update = Microsecondes() + REFRESH_CYCLE;
int go_on = 1; int go_on = 1;
while (go_on && !state->is_solved) 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 */ /* Rendu et rafraîchissement */
if (Microsecondes() > next_update) if (Microsecondes() > next_update)
{ {
game_render(state); game_render(state);
<<<<<<< HEAD
CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0); CopierZone(0, 0, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0);
next_update = Microsecondes() + REFRESH_CYCLE; 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 */ /* Gestion des événements Souris */
@@ -109,17 +185,29 @@ void game_loop(game_state_t *state)
int y_click = _Y; int y_click = _Y;
int tile_w = state->all_tiles[0]->width; int tile_w = state->all_tiles[0]->width;
int tile_h = state->all_tiles[0]->height; int tile_h = state->all_tiles[0]->height;
<<<<<<< HEAD
=======
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
/* Parcourir toutes les tuiles pour voir laquelle a été cliquée */ /* Parcourir toutes les tuiles pour voir laquelle a été cliquée */
for (i = 0; i < state->rows * state->cols; i++) { for (i = 0; i < state->rows * state->cols; i++) {
int r = i / state->cols; int r = i / state->cols;
int c = i % state->cols; int c = i % state->cols;
<<<<<<< HEAD
=======
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
int x_pos = MARGIN + c * tile_w; int x_pos = MARGIN + c * tile_w;
int y_pos = MARGIN + r * tile_h; int y_pos = MARGIN + r * tile_h;
if (is_in_tile_rect(x_click, y_click, x_pos, y_pos, tile_w, 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 (indice i) */
=======
/* Tenter de déplacer la tuile cliquée */
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
game_move_tile(state, i); game_move_tile(state, i);
break; break;
} }
@@ -129,6 +217,7 @@ void game_loop(game_state_t *state)
/* Gestion des événements Clavier */ /* Gestion des événements Clavier */
if (ToucheEnAttente()) { if (ToucheEnAttente()) {
int key = Touche(); int key = Touche();
<<<<<<< HEAD
int target_index = -1; int target_index = -1;
int empty_r = state->empty_index / state->cols; 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
+11
View File
@@ -1,3 +1,4 @@
<<<<<<< HEAD
/* src/game_view.h /* src/game_view.h
* Définitions du module de la vue du plateau de jeu. * Définitions du module de la vue du plateau de jeu.
*/ */
@@ -6,6 +7,12 @@
#include "game_logic.h" #include "game_logic.h"
#include "defs.h" /* Nécessaire pour les constantes de fenêtre */ #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. */ /* Dessine le plateau de jeu, les tuiles à leur position actuelle, et le compteur de coups. */
void game_render(const game_state_t *state); 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. */ /* Gère la boucle principale du jeu, les événements (clics/clavier) et les rafraîchissements. */
void game_loop(game_state_t *state); void game_loop(game_state_t *state);
<<<<<<< HEAD
#endif /* GAME_VIEW_H */ #endif /* GAME_VIEW_H */
=======
#endif /* GAME_VIEW_H */
>>>>>>> 35d0b2d664efc5214a4ffbfd165dbee45dba3a2c
+6
View File
@@ -2,6 +2,7 @@
* Point d'entrée du programme Taquin. * Point d'entrée du programme Taquin.
* Gère la boucle principale des événements et la transition de vue (Menu -> Jeu). * Gère la boucle principale des événements et la transition de vue (Menu -> Jeu).
*/ */
#include "game_view.h"
#include "menu_view.h" #include "menu_view.h"
#include "game_logic.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", printf("DEBUG: Jeu prêt. Grille %d x %d melangee. Lancement de la boucle de jeu...\n",
game_state.rows, game_state.cols); game_state.rows, game_state.cols);
<<<<<<< HEAD
/* Lancement de la BOUCLE DE JEU */ /* Lancement de la BOUCLE DE JEU */
game_loop(&game_state); 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) */ /* Nettoyage final (après que le joueur a fini de jouer) */
images_free_tiles(tiles, num_tiles); images_free_tiles(tiles, num_tiles);