#include #include #include #include #include "jeu.h" #include "jeu_ia.h" void jouerModeIA(struct EtatJeu *etatJeu) { int gagnant; while (1) { if (etatJeu->tourJoueur == 1) { if (SourisCliquee()) { if (etatJeu->phase == 0) { gererPlacementInitialIA(etatJeu); } else { gererTourJoueurIA(etatJeu); } } } else { usleep(500000); if (etatJeu->phase == 0) { placementIA(etatJeu); } else if (etatJeu->phase == 1) { deplacementIA(etatJeu); } else { blocageIA(etatJeu); } } if (etatJeu->phase > 0) { gagnant = verifierVictoire(*etatJeu); if (gagnant != 0) { afficherVictoire(gagnant); while (!SourisCliquee()) { usleep(100000); } break; } } usleep(20000); } } void gererPlacementInitialIA(struct EtatJeu *etatJeu) { int x, y, i, j; int largeurFenetre = 800; int hauteurFenetre = 600; int marge = 50; int tailleCase; int startX, startY; x = _X; y = _Y; 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; x -= startX; y -= startY; i = y / tailleCase; j = x / tailleCase; if (i >= 0 && i < etatJeu->tailleGrille && j >= 0 && j < etatJeu->tailleGrille && etatJeu->grille[i][j] == 0) { etatJeu->grille[i][j] = 1; etatJeu->joueur1.x = j; etatJeu->joueur1.y = i; etatJeu->tourJoueur = 2; dessinerGrille(*etatJeu); } } void gererTourJoueurIA(struct EtatJeu *etatJeu) { int x, y, i, j; int largeurFenetre = 800; int hauteurFenetre = 600; int marge = 50; int tailleCase; int startX, startY; struct Position posActuelle; struct Position posCliquee; x = _X; y = _Y; 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; x -= startX; y -= startY; i = y / tailleCase; j = x / tailleCase; posActuelle = etatJeu->joueur1; posCliquee.x = j; posCliquee.y = i; if (i >= 0 && i < etatJeu->tailleGrille && j >= 0 && j < etatJeu->tailleGrille) { if (etatJeu->phase == 1) { if (etatJeu->grille[i][j] == 0 && estCaseAdjacente(posActuelle, posCliquee)) { etatJeu->grille[etatJeu->joueur1.y][etatJeu->joueur1.x] = 0; etatJeu->grille[i][j] = 1; etatJeu->joueur1.x = j; etatJeu->joueur1.y = i; etatJeu->phase = 2; dessinerGrille(*etatJeu); } } else if (etatJeu->phase == 2) { if (etatJeu->grille[i][j] == 0) { etatJeu->grille[i][j] = 3; etatJeu->phase = 1; etatJeu->tourJoueur = 2; dessinerGrille(*etatJeu); } } } } void placementIA(struct EtatJeu *etatJeu) { int i, j; do { i = rand() % etatJeu->tailleGrille; j = rand() % etatJeu->tailleGrille; } while (etatJeu->grille[i][j] != 0); etatJeu->grille[i][j] = 2; etatJeu->joueur2.x = j; etatJeu->joueur2.y = i; etatJeu->phase = 1; etatJeu->tourJoueur = 1; dessinerGrille(*etatJeu); } void deplacementIA(struct EtatJeu *etatJeu) { int dx, dy; int newX, newY; int trouve = 0; for(dx = -1; dx <= 1 && !trouve; dx++) { for(dy = -1; dy <= 1 && !trouve; dy++) { if(dx == 0 && dy == 0) continue; newX = etatJeu->joueur2.x + dx; newY = etatJeu->joueur2.y + dy; if(newX >= 0 && newX < etatJeu->tailleGrille && newY >= 0 && newY < etatJeu->tailleGrille && etatJeu->grille[newY][newX] == 0) { etatJeu->grille[etatJeu->joueur2.y][etatJeu->joueur2.x] = 0; etatJeu->grille[newY][newX] = 2; etatJeu->joueur2.x = newX; etatJeu->joueur2.y = newY; etatJeu->phase = 2; trouve = 1; } } } dessinerGrille(*etatJeu); } void blocageIA(struct EtatJeu *etatJeu) { int i, j; int trouve = 0; do { i = rand() % etatJeu->tailleGrille; j = rand() % etatJeu->tailleGrille; } while (etatJeu->grille[i][j] != 0); etatJeu->grille[i][j] = 3; etatJeu->phase = 1; etatJeu->tourJoueur = 1; dessinerGrille(*etatJeu); }