Files
DEV/SAE11_2024/jeu.c
EmmanuelTiamzon 2a4b74f54e update
2025-12-05 10:36:05 +01:00

366 lines
14 KiB
C

#include <stdlib.h>
#include <graph.h>
#include "jeu.h"
#include "utilitaires.h"
#include "graphique.h"
void GestionJeu(int grille[][9], int taille_grille, int pion_bleu, int pion_orange, int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange, int nombre_joueurs) {
int x, y, caseX, caseY, tour = 0, etat = 0; /* 0 = placement du pion, 1 = placement de la croix */
int dernierXBleu = -1, dernierYBleu = -1;
int dernierXOrange = -1, dernierYOrange = -1;
couleur grisClair = CouleurParComposante(255, 255, 255);
couleur noir = CouleurParComposante(0, 0, 0);
couleur bleu = CouleurParComposante(2, 183, 219);
couleur orange = CouleurParComposante(250, 143, 2);
int xTexte = 380, yTexte = 560, largeurTexte = 480, hauteurTexte = 25; /* Position et taille de la zone texte*/
while (1) {
/* Choisir la couleur du texte et afficher le texte approprié*/
if (etat == 0) { /*Placement du pion*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu", 1);
}
} else { /* Placement de la croix*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange de placer la croix", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu de placer la croix", 1);
}
}
/* Gestion des clics de la souris*/
if (SourisCliquee()) {
SourisPosition();
x = _X;
y = _Y;
/* Calcul des indices de la case cliquée*/
caseX = (x - offset_x) / largeur_case;
caseY = (y - offset_y) / largeur_case;
/* Vérification si les coordonnées de la case sont valides*/
if (caseX >= 0 && caseX < taille_grille && caseY >= 0 && caseY < taille_grille) {
if (etat == 0) { /*Placement du pion*/
int dernierX = (tour % 2 == 0) ? dernierXBleu : dernierXOrange;
int dernierY = (tour % 2 == 0) ? dernierYBleu : dernierYOrange;
if (grille[caseY][caseX] == 0 && /* Case vide */
((dernierX == -1 && dernierY == -1) || /* Premier placement */
DeplacementValide(dernierX, dernierY, caseX, caseY))) {
/*Effacer la dernière position du pion*/
if (dernierX != -1 && dernierY != -1) {
grille[dernierY][dernierX] = 0;
RedessinerCase(dernierX, dernierY, largeur_case, offset_x, offset_y);
}
/* Affichage du nouveau pion*/
int pion = (tour % 2 == 0) ? pion_bleu : pion_orange;
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /*Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion);
/*Mise à jour de la grille*/
grille[caseY][caseX] = (tour % 2 == 0) ? 1 : 2;
/* Mise à jour des coordonnées du dernier pion*/
if (tour % 2 == 0) {
dernierXBleu = caseX;
dernierYBleu = caseY;
} else {
dernierXOrange = caseX;
dernierYOrange = caseY;
}
etat = 1; /* Passage à l'état de placement de la croix*/
}
} else if (etat == 1) { /* Placement de la croix*/
if (grille[caseY][caseX] == 0) { /*La case est vide*/
/* Ajout de la croix à la grille*/
grille[caseY][caseX] = (tour % 2 == 0) ? 3 : 4;
/*Affichage de la croix*/
int croix_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2;
int croix = (tour % 2 == 0) ? croix_bleu : croix_orange;
AfficherCroix(croix_x, croix_y, croix);
/*Passage au prochain tour*/
tour++;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /*Zone d'effacement du texte*/
etat = 0;
/*Vérification des conditions de blocage*/
if (tour >= 2) {
if (EstBloque(grille, taille_grille, dernierXBleu, dernierYBleu)) {
MenuFin(2, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
} else if (EstBloque(grille, taille_grille, dernierXOrange, dernierYOrange)) {
MenuFin(1, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
}
}
}
}
}
}
/* Vérification de la fin de la partie*/
if (EstGrillePleine(grille, taille_grille)) {
int gagnant = (tour % 2 == 0) ? 2 : 1;
MenuFin(gagnant, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange);
return; /* Fin du jeu*/
}
}
}
void GestionJeuIA(int grille[][9], int taille_grille, int pion_bleu, int pion_orange, int largeur_case, int offset_x, int offset_y, int croix_bleu, int croix_orange) {
int x, y, caseX, caseY, tour = 0, etat = 0; /* 0 = placement du pion, 1 = placement de la croix */
int dernierXBleu = -1, dernierYBleu = -1;
int dernierXOrange = -1, dernierYOrange = -1;
int xTexte = 380, yTexte = 560, largeurTexte = 500, hauteurTexte = 25; /* Position et taille de la zone texte*/
couleur grisClair = CouleurParComposante(255, 255, 255);
couleur noir = CouleurParComposante(0, 0, 0);
couleur bleu = CouleurParComposante(2, 183, 219);
couleur orange = CouleurParComposante(250, 143, 2);
while (1) {
/* Choisir la couleur du texte et afficher le texte approprié*/
if (etat == 0) { /* Placement du pion*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu", 1);
}
} else { /* Placement de la croix*/
if (tour % 2 == 1) {
ChoisirCouleurDessin(orange);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur orange de placer la croix", 1);
} else {
ChoisirCouleurDessin(bleu);
EcrireTexte(xTexte, yTexte + 20, "C'est au tour du joueur bleu de placer la croix", 1);
}
}
if (tour % 2 == 0) {
/* Tour du joueur humain (bleu) */
if (SourisCliquee()) {
SourisPosition();
x = _X;
y = _Y;
/* Calcul des indices de la case cliquée */
caseX = (x - offset_x) / largeur_case;
caseY = (y - offset_y) / largeur_case;
/* Vérification si les coordonnées de la case sont valides */
if (caseX >= 0 && caseX < taille_grille && caseY >= 0 && caseY < taille_grille) {
if (etat == 0 && grille[caseY][caseX] == 0 &&
(dernierXBleu == -1 || DeplacementValide(dernierXBleu, dernierYBleu, caseX, caseY))) {
/* Effacer la dernière position du pion */
if (dernierXBleu != -1 && dernierYBleu != -1) {
grille[dernierYBleu][dernierXBleu] = 0;
RedessinerCase(dernierXBleu, dernierYBleu, largeur_case, offset_x, offset_y);
}
/* Affichage du pion bleu */
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /* Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion_bleu);
/* Mise à jour de la grille */
grille[caseY][caseX] = 1;
dernierXBleu = caseX;
dernierYBleu = caseY;
etat = 1; /* Passage à l'état de placement de la croix */
} else if (etat == 1 && grille[caseY][caseX] == 0) {
/* Placement de la croix */
int croix_x = offset_x + caseX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + caseY * largeur_case + (largeur_case - 50) / 2;
AfficherCroix(croix_x, croix_y, croix_bleu);
grille[caseY][caseX] = 3;
tour++;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /*Zone d'effacement du texte*/
etat = 0;
}
}
}
} else {
/* Tour de l'IA (orange) */
int pionX, pionY, croixX, croixY;
/* Placer le pion de l'IA dans une zone valide */
do {
pionX = rand() % taille_grille;
pionY = rand() % taille_grille;
/* Vérifier si la case est vide et si le déplacement est valide par rapport au dernier pion */
} while (grille[pionY][pionX] != 0 ||
(dernierXOrange != -1 && dernierYOrange != -1 && !DeplacementValide(dernierXOrange, dernierYOrange, pionX, pionY)));
if (dernierXOrange != -1 && dernierYOrange != -1) {
/* Effacer la dernière position du pion de l'IA */
grille[dernierYOrange][dernierXOrange] = 0;
RedessinerCase(dernierXOrange, dernierYOrange, largeur_case, offset_x, offset_y);
}
/* Affichage du pion orange */
int ajustement_x = (taille_grille <= 4) ? -30 : 0; /* Décale les pions à droite pour une petite grille*/
int ajustement_y = (taille_grille <= 4) ? -30 : 0; /* Décale les pions vers le haut pour une petite grille*/
int pion_x = offset_x + pionX * largeur_case + (largeur_case - 50) / 2 + ajustement_x;
int pion_y = offset_y + pionY * largeur_case + (largeur_case - 50) / 2 + ajustement_y;
AfficherPion(pion_x, pion_y, pion_orange);
/* Mise à jour de la grille */
grille[pionY][pionX] = 2;
dernierXOrange = pionX;
dernierYOrange = pionY;
/* Attente avant de placer la croix de l'IA */
Delai(500);
/* Placer la croix de l'IA */
do {
croixX = rand() % taille_grille;
croixY = rand() % taille_grille;
} while (grille[croixY][croixX] != 0 || (croixX == pionX && croixY == pionY)); /* Éviter de placer la croix sur le pion */
/* Affichage de la croix orange */
int croix_x = offset_x + croixX * largeur_case + (largeur_case - 50) / 2;
int croix_y = offset_y + croixY * largeur_case + (largeur_case - 50) / 2;
AfficherCroix(croix_x, croix_y, croix_orange);
/* Mise à jour de la grille */
grille[croixY][croixX] = 4;
ChoisirCouleurDessin(grisClair);
RemplirRectangle(xTexte, yTexte, largeurTexte, hauteurTexte); /* Zone d'effacement du texte*/
tour++;
}
/* Vérification des conditions de fin de jeu après chaque tour */
if (tour >= 2) {
if (EstBloque(grille, taille_grille, dernierXBleu, dernierYBleu)) {
MenuFin(2, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu, l'IA a gagné */
return;
} else if (EstBloque(grille, taille_grille, dernierXOrange, dernierYOrange)) {
MenuFin(1, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu, le joueur humain a gagné */
return;
}
}
/* Vérification de la fin de la partie si la grille est pleine */
if (EstGrillePleine(grille, taille_grille)) {
int gagnant = (tour % 2 == 0) ? 2 : 1; /* L'IA ou le joueur humain a gagné */
MenuFin(gagnant, grille, taille_grille, pion_bleu, pion_orange, croix_bleu, croix_orange); /* Fin du jeu */
return; /* Fin du jeu */
}
}
}
void debutJeu(int grille[][9], int taille_grille, int nombre_joueurs, int pion_bleu, int pion_orange, int croix_bleu, int croix_orange) {
couleur grisClair = CouleurParComposante(255, 255, 255);
/* Afficher le menu graphique pour la sélection */
MenuGraphique(&taille_grille, &nombre_joueurs);
/* Si les valeurs sont correctement définies, démarrer la partie */
if (taille_grille > 0 && nombre_joueurs > 0) {
int largeur_case = 500 / taille_grille; /* Calcul de la largeur d'une case */
int offset_x = (1000 - taille_grille * largeur_case) / 2;
int offset_y = (600 - taille_grille * largeur_case) / 2;
if (taille_grille <= 4) {
pion_bleu = ChargerSprite("Pionb_100x100.png");
pion_orange = ChargerSprite("Pionc_100x100.png");
} else {
pion_bleu = ChargerSprite("Pionb_50x50.png");
pion_orange = ChargerSprite("Pionc_50x50.png");
}
EffacerEcran(CouleurParComposante(255,255,255));
AfficherGrille(taille_grille, largeur_case, offset_x, offset_y);
ReinitialiserGrille(grille, taille_grille);
/* Lancer la gestion du jeu */
if (nombre_joueurs == 1) {
GestionJeuIA(grille, taille_grille, pion_bleu, pion_orange, largeur_case, offset_x, offset_y, croix_bleu, croix_orange);
LibererSprite(pion_bleu);
LibererSprite(pion_orange);
LibererSprite(croix_bleu);
LibererSprite(croix_orange);
} else {
GestionJeu(grille, taille_grille, pion_bleu, pion_orange, largeur_case, offset_x, offset_y, croix_bleu, croix_orange, nombre_joueurs);
LibererSprite(pion_bleu);
LibererSprite(pion_orange);
LibererSprite(croix_bleu);
LibererSprite(croix_orange);
}
}
}