Fin menu v2

This commit is contained in:
lecointre
2025-12-02 13:36:37 +01:00
parent 49f6297800
commit b1fcb88c58
12 changed files with 79 additions and 192 deletions
+1 -8
View File
@@ -6,14 +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
# (Transforme src/*.c en obj/*.o)
OBJS = $(patsubst src/%.c, obj/%.o, $(SRCS)) OBJS = $(patsubst src/%.c, obj/%.o, $(SRCS))
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@@ -41,10 +38,6 @@ 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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+5 -112
View File
@@ -1,44 +1,27 @@
<<<<<<< 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) */
=======
#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)
@@ -46,7 +29,6 @@ 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);
@@ -56,38 +38,18 @@ 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];
@@ -102,49 +64,22 @@ 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
} }
} }
@@ -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 */ /* 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 */
@@ -185,29 +108,17 @@ 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;
} }
@@ -217,7 +128,6 @@ 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;
@@ -226,19 +136,19 @@ void game_loop(game_state_t *state)
if (key == XK_Escape) { if (key == XK_Escape) {
go_on = 0; 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) { 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; target_index = (empty_r + 1) * state->cols + empty_c;
} else if (key == XK_Down) { } 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; target_index = (empty_r - 1) * state->cols + empty_c;
} }
else if (key == XK_Left) { 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); target_index = empty_r * state->cols + (empty_c + 1);
} else if (key == XK_Right) { } 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); 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
+1 -12
View File
@@ -1,4 +1,3 @@
<<<<<<< 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,13 +5,7 @@
#define GAME_VIEW_H #define GAME_VIEW_H
#include "game_logic.h" #include "game_logic.h"
#include "defs.h" /* Nécessaire pour les constantes de fenêtre */ #include "defs.h"
=======
#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);
@@ -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. */ /* 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
+34 -20
View File
@@ -2,13 +2,12 @@
* 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"
#include "images.h" #include "images.h"
#include "game_view.h" /* NOUVEAU: Pour la boucle de jeu */ #include "game_view.h"
#include "defs.h" /* NOUVEAU: Pour les constantes de fenêtre */ #include "defs.h"
#include <graph.h> #include <graph.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@@ -18,18 +17,23 @@ int main(void)
{ {
menu_state_t menu_state; menu_state_t menu_state;
unsigned long next_update; unsigned long next_update;
int play_again = 1;
/* 1. Initialisation de l'environnement IUT */ /* 1. Initialisation de l'environnement IUT */
InitialiserGraphique(); InitialiserGraphique();
CreerFenetre(10, 10, WINDOW_WIDTH, WINDOW_HEIGHT); CreerFenetre(10, 10, WINDOW_WIDTH, WINDOW_HEIGHT);
srand((unsigned int)time(NULL)); srand((unsigned int)time(NULL));
menu_init(&menu_state);
/* 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; next_update = Microsecondes() + REFRESH_CYCLE;
/* 2. Boucle du Menu */ while (menu_state.ready_to_play == 0 && menu_state.ready_to_play != -1)
while (menu_state.ready_to_play == 0)
{ {
if (Microsecondes() > next_update) if (Microsecondes() > next_update)
{ {
@@ -38,46 +42,56 @@ int main(void)
next_update = Microsecondes() + REFRESH_CYCLE; next_update = Microsecondes() + REFRESH_CYCLE;
} }
if (SourisCliquee()) if (SourisCliquee()) {
{
menu_handle_mouse_click(&menu_state); menu_handle_mouse_click(&menu_state);
} }
menu_handle_key(&menu_state); menu_handle_key(&menu_state);
} }
/* 3. Transition vers le jeu */ /* Sortie du menu par validation */
if (menu_state.ready_to_play == 1) { if (menu_state.ready_to_play == 1) {
image_source_t img_src; image_source_t img_src;
tile_t **tiles; tile_t **tiles;
game_state_t game_state; game_state_t game_state;
int num_tiles = menu_state.rows * menu_state.cols; int num_tiles;
/* Préparation des données et initialisation du moteur de jeu */ /* Préparation des données et initialisation du moteur de jeu */
img_src = get_image_source(menu_state.selected_image); img_src = get_image_source(menu_state.selected_image);
tiles = images_slice(img_src, menu_state.rows, menu_state.cols); 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 */ 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); game_shuffle_safe(&game_state, 500);
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.\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) */ /* 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); images_free_tiles(tiles, num_tiles);
game_free(&game_state); game_free(&game_state);
} }
} while (play_again == 1);
FermerGraphique(); FermerGraphique();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
+2 -4
View File
@@ -1,6 +1,4 @@
/* src/menu_view.h /* src/menu_view.h */
* Définition de l'état du menu et des prototypes pour le module de configuration.
*/
#ifndef MENU_VIEW_H #ifndef MENU_VIEW_H
#define MENU_VIEW_H #define MENU_VIEW_H
@@ -15,7 +13,7 @@ typedef struct {
int rows; /* Nombre de lignes (3 à 8) */ int rows; /* Nombre de lignes (3 à 8) */
int cols; /* Nombre de colonnes (3 à 8) */ int cols; /* Nombre de colonnes (3 à 8) */
int ready_to_play; /* 1 si le joueur a validé, -1 si demande de quitter */ 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 */ /* Prototypes des fonctions publiques */
void menu_init(menu_state_t *state); void menu_init(menu_state_t *state);
BIN
View File
Binary file not shown.