Test/LAB3_BRULEZ_HUGUET_SERRE/X-BOTS/Arene.cpp
2022-03-03 15:44:04 +01:00

158 lines
5 KiB
C++
Raw Blame History

#include "Arene.h"
#include "Compteur.h"
Arene::Arene()
{
combattants = new Combattant**[2];
combattants[EQUIPE_A] = new Combattant*[NOMBRE_XBOT];
combattants[EQUIPE_B] = new Combattant * [NOMBRE_XBOT];
for (int x = 0; x < NOMBRE_XBOT; x++)
{
combattants[EQUIPE_A][x] = nullptr;
combattants[EQUIPE_B][x] = nullptr;
}
Compteur::ajouterConstructeur();
}
Arene::~Arene()
{
for (int e = 0; e < 2; e++)
{
for (int x = 0; x < NOMBRE_XBOT; x++)
{
delete combattants[e][x]->xbot;
delete combattants[e][x];
}
delete combattants[e];
}
delete combattants;
Compteur::ajouterDestructeur();
}
bool Arene::minimumFonctionnel(Combattant** equipe) const
{
for (int x = 0; x < NOMBRE_XBOT; x++)
if (equipe[x]->xbot->estFonctionnel())
return true;
return false;
}
void Arene::setEquipes(XBOT** equipeA, XBOT** equipeB)
{
int x = -1;
int y = -1;
char idA = 'a';
char idB = 'A';
for (int xb = 0; xb < NOMBRE_XBOT; xb++)
{
setCoordonneesAleatoire(x, y);
combattants[EQUIPE_A][xb] = new Combattant(equipeA[xb], x, y, (char)(idA + xb));
setCoordonneesAleatoire(x, y);
combattants[EQUIPE_B][xb] = new Combattant(equipeB[xb], x, y, (char)(idB + xb));
}
}
void Arene::setCoordonneesAleatoire(int& x, int& y)
{
do
{
x = hasard.recupererValeurAleatoire(0, TAILLE-1);
y = hasard.recupererValeurAleatoire(0, TAILLE-1);
}
while (!verifierDisponibiliteCoordonnees(x,y));
}
bool Arene::verifierDisponibiliteCoordonnees(int x, int y) const
{
for (int e = 0; e < 2; e++)
for (int xb = 0; xb < NOMBRE_XBOT; xb++)
if (combattants[e][xb] != nullptr)
if (combattants[e][xb]->x == x && combattants[e][xb]->x == y)
return false;
return true;
}
void Arene::afficherCombattants() const
{
cout << "Les combattants" << endl;
for (int e = 0; e < 2; e++)
for (int xb = 0; xb < NOMBRE_XBOT; xb++)
cout << ">> " << *combattants[e][xb] << endl;
}
void Arene::debuterCombat()
{
// Tant qu'au moins un XBOT est fonctionnel dans chaque <20>quipe
int tour = 0;
cout << "----- DEBUT -----" << endl;
afficherCombattants();
cout <<"Affichage fini"<<endl;
while (minimumFonctionnel(combattants[EQUIPE_A]) && minimumFonctionnel(combattants[EQUIPE_B]))
{
cout << "TOUR #" << tour++ << endl;
cout << *this << endl;
cout << "----- EQUIPE A -----" << endl;
tourCombat(combattants[EQUIPE_A], combattants[EQUIPE_B]);
cout << *this << endl;
cout << "----- EQUIPE B -----" << endl;
tourCombat(combattants[EQUIPE_B], combattants[EQUIPE_A]);
}
cout << "----- FIN -----" << endl;
cout << *this << endl;
}
void Arene::tourCombat(Combattant** attaquants, Combattant** defenseurs)
{
for (int x = 0; x < NOMBRE_XBOT; x++)
{
if (attaquants[x]->xbot->estFonctionnel())
{
Combattant* ami = attaquants[getVivant(attaquants, x)];
Combattant* ennemi = defenseurs[getVivant(defenseurs, -1)];
cout << "Attaquant : " << *attaquants[x] << endl;
cout << " > Ami : " << *ami << endl;
cout << " > Ennemi : " << *ennemi << endl;
attaquants[x]->xbot->bouger(ami->x, ami->y, attaquants[x]->x, attaquants[x]->y, ennemi->x, ennemi->y);
ennemi->xbot->defendre(attaquants[x]->xbot->attaquer(attaquants[x]->x, attaquants[x]->y, ennemi->x, ennemi->y));
}
}
}
int Arene::getVivant(Combattant** equipe, int moi) const
{
for (int x = 0; x < NOMBRE_XBOT; x++)
if (x != moi && equipe[x]->xbot->estFonctionnel())
return x;
return 0; // our <20>viter que <20>a plante, on choisi un XBOT non fonctionnel
}
ostream& operator<<(ostream& os, const Arene& arene)
{
char grille[Arene::TAILLE][Arene::TAILLE];
for (int x = 0; x < Arene::TAILLE; x++)
for (int y = 0; y < Arene::TAILLE; y++)
grille[x][y] = ' ';
for (int xb = 0; xb < Arene::NOMBRE_XBOT; xb++)
{
if (arene.combattants[Arene::EQUIPE_A][xb]->xbot->estFonctionnel())
grille[arene.combattants[Arene::EQUIPE_A][xb]->x][arene.combattants[Arene::EQUIPE_A][xb]->y] = arene.combattants[Arene::EQUIPE_A][xb]->id;
else
grille[arene.combattants[Arene::EQUIPE_A][xb]->x][arene.combattants[Arene::EQUIPE_A][xb]->y] = 'X';
if (arene.combattants[Arene::EQUIPE_B][xb]->xbot->estFonctionnel())
grille[arene.combattants[Arene::EQUIPE_B][xb]->x][arene.combattants[Arene::EQUIPE_B][xb]->y] = arene.combattants[Arene::EQUIPE_B][xb]->id;
else
grille[arene.combattants[Arene::EQUIPE_B][xb]->x][arene.combattants[Arene::EQUIPE_B][xb]->y] = 'X';
}
for (int x = 0; x < Arene::TAILLE; x++)
{
os << " ";
for (int y = 0; y < Arene::TAILLE; y++)
os << grille[x][y] << "-";
os << endl;
}
return os;
}