#include #include #include #include #include "jeu.h" /* Fonction qui initialise le jeu */ struct EtatJeu initialiserJeu(int tailleGrille, int mode) { struct EtatJeu etat; int i; etat.tailleGrille = tailleGrille; etat.mode = mode; etat.tourJoueur = 1; etat.phase = 0; etat.joueur1.x = -1; etat.joueur1.y = -1; etat.joueur2.x = -1; etat.joueur2.y = -1; etat.grille = malloc(tailleGrille * sizeof(int*)); for(i = 0; i < tailleGrille; i++) { etat.grille[i] = malloc(tailleGrille * sizeof(int)); memset(etat.grille[i], 0, tailleGrille * sizeof(int)); } return etat; } /* Fonction qui vérifie si deux cases sont adjacentes */ int estCaseAdjacente(struct Position pos1, struct Position pos2) { return abs(pos1.x - pos2.x) <= 1 && abs(pos1.y - pos2.y) <= 1; } /* Fonction qui vérifie si le joueur peut déplacer son pion */ int peutDeplacer(struct EtatJeu etatJeu, int joueur) { struct Position pos; int i, j; int newX, newY; pos = joueur == 1 ? etatJeu.joueur1 : etatJeu.joueur2; for(i = -1; i <= 1; i++) { for(j = -1; j <= 1; j++) { if(i == 0 && j == 0) continue; newX = pos.x + i; newY = pos.y + j; if(newX >= 0 && newX < etatJeu.tailleGrille && newY >= 0 && newY < etatJeu.tailleGrille && etatJeu.grille[newY][newX] == 0) { return 1; } } } return 0; } /* Fonction qui affiche la grille de jeu */ void dessinerGrille(struct EtatJeu etatJeu) { int i, j; int largeurFenetre = 800; int hauteurFenetre = 600; int marge = 50; int tailleCase; int startX, startY; char message[100]; EffacerEcran(CouleurParNom("white")); ChoisirCouleurDessin(CouleurParNom("black")); if(etatJeu.phase == 0) { sprintf(message, "Joueur %d : Placez votre pion", etatJeu.tourJoueur); } else if(etatJeu.phase == 1) { sprintf(message, "Joueur %d : Deplacez votre pion", etatJeu.tourJoueur); } else { sprintf(message, "Joueur %d : Bloquez une case", etatJeu.tourJoueur); } EcrireTexte(200, 30, message, 2); tailleCase = (largeurFenetre - 2 * marge) / etatJeu.tailleGrille; if (tailleCase * etatJeu.tailleGrille > (hauteurFenetre - 2 * marge)) { tailleCase = (hauteurFenetre - 2 * marge) / etatJeu.tailleGrille; } startX = (largeurFenetre - (tailleCase * etatJeu.tailleGrille)) / 2; startY = (hauteurFenetre - (tailleCase * etatJeu.tailleGrille)) / 2; for (i = 0; i < etatJeu.tailleGrille; i++) { for (j = 0; j < etatJeu.tailleGrille; j++) { int x = startX + (j * tailleCase); int y = startY + (i * tailleCase); ChoisirCouleurDessin(CouleurParNom("black")); DessinerRectangle(x, y, tailleCase, tailleCase); if (etatJeu.grille[i][j] == 1) { ChoisirCouleurDessin(CouleurParNom("blue")); RemplirRectangle(x + 5, y + 5, tailleCase - 10, tailleCase - 10); } else if (etatJeu.grille[i][j] == 2) { ChoisirCouleurDessin(CouleurParNom("red")); RemplirRectangle(x + 5, y + 5, tailleCase - 10, tailleCase - 10); } else if (etatJeu.grille[i][j] == 3) { ChoisirCouleurDessin(CouleurParNom("black")); RemplirRectangle(x + 5, y + 5, tailleCase - 10, tailleCase - 10); } } } } /* Fonction qui affiche le gagnant de la partie */ void afficherVictoire(int gagnant) { char message[100]; EffacerEcran(CouleurParNom("white")); ChoisirCouleurDessin(CouleurParNom("black")); sprintf(message, "Le joueur %d remporte la partie !", gagnant); /* Affiche le gagnant après avoir clear la window de la partie */ EcrireTexte(250, 300, message, 2); EcrireTexte(200, 400, "Cliquez pour retourner au menu", 1); } /* Fonction qui vérifie si le joueur a gagné la partie */ int verifierVictoire(struct EtatJeu etatJeu) { if (etatJeu.phase == 0) { return 0; } if (!peutDeplacer(etatJeu, etatJeu.tourJoueur)) { return etatJeu.tourJoueur == 1 ? 2 : 1; } return 0; }