# coord.cpp
```cpp
Coord creeCoord(int lig, int col){
Coord c;
c.x = lig;
c.y = col;
return c;
}
void afficheCoord(Coord c){
cout << "(" << c.x << "," << c.y << ")" << endl;
}
int getX(Coord c){
return c.x;
}
int getY(Coord c){
return c.y;
}
bool egalCoord(Coord c1, Coord c2) {
return (c1.x==c2.x and c1.y==c2.y);
}
void afficheDirection(Direction d){
if (d==0) cout << "nord-ouest" << endl;
if (d==1) cout << "nord" << endl;
if (d==2) cout << "nord-est" << endl;
if (d==3) cout << "est" << endl;
if (d==4) cout << "sud-est" << endl;
if (d==5) cout << "sud" << endl;
if (d==6) cout << "sud-ouest" << endl;
if (d==7) cout << "ouest" << endl;
}
Direction aGauche(Direction d){
if (d>=1 and d<=7){
return Direction(d-1);
}
if (d==0) {
return Direction(7);
}else{
cout << "ERROR : Direction doit être entre 0 et 7" << endl;
}
return d;
}
Direction aDroite(Direction d){
if (d>=0 and d<=6){
return Direction(d+1);
}
if (d==7) {
return Direction(0);
}else{
cout << "ERROR : Direction doit être entre 0 et 7" << endl;
}
return d;
}
Coord devantCoord(Coord c, Direction d){
switch(d){
case N : c.y--; break;
case S : c.y++; break;
case E : c.x++; break;
case O : c.x--; break;
case SE: c.x++; c.y++; break;
case NO: c.x--; c.y--; break;
case NE: c.x++; c.y--; break;
case SO: c.x--; c.y++; break;
}
return c;
}
char afficheDirectionT(Direction d){
switch(d){
case nordOuest :
case sudEst : return '\\'; break;
case nord :
case sud : return '|'; break;
case nordEst :
case sudOuest : return '/'; break;
case est :
case ouest : return '-'; break;
}
cout << d; //pour savoir directement qu'il y a un problème.
return '?';
}
```
# grille.cpp
```cpp
void initialiseGrilleVide(Grille &g){
for (int j=0; j<Y; j++){
for (int i=0; i<X; i++){
g.tab[i][j].brindille = 0;
g.tab[i][j].idT = -1;
}
}
}
bool estVide(Grille g, Coord c){
return (!g.tab[c.x][c.y].brindille) and (g.tab[c.x][c.y].idT == -1);
}
bool dansGrille(Grille g, Coord c){
return (c.x < X) and (c.y < Y) and (c.x >= 0) and (c.y >= 0);
}
bool contientBrindille(Grille g, Coord c){
return g.tab[c.x][c.y].brindille;
}
int numeroTermite(Grille g, Coord c){
return g.tab[c.x][c.y].idT;
}
void poseBrindille(Grille &g, Coord c){
if (estVide(g, c))
g.tab[c.x][c.y].brindille = 1;
}
void enleveBrindille(Grille &g, Coord c){
if (g.tab[c.x][c.y].brindille==1)
g.tab[c.x][c.y].brindille = 0;
}
void poseTermite(Grille &g, Coord c, short idT){
if (estVide(g, c))
g.tab[c.x][c.y].idT = idT;
}
void enleveTermite(Grille &g, Coord c){
g.tab[c.x][c.y].idT = -1;
}
```
# termite.cpp
```cpp
Direction directionTermite(Termite t){
return t.d;
}
Coord devantTermite(Termite t){
return devantCoord(t.c, t.d);
}
bool porteBrindille(Termite t){
return t.brin;
}
void tourneADroite(Termite &t){
t.d = aDroite(t.d);
}
void tourneAGauche(Termite &t){
t.d = aGauche(t.d);
}
void tourneAleat(Termite &t){
short n = rand()%2;
if (n==0){
tourneAGauche(t);
} else {
tourneADroite(t);
}
}
bool laVoieEstLibre(Grille g, Termite t){
return (dansGrille(g, devantTermite(t))) and (estVide(g, devantTermite(t)));
}
bool brindilleEnFace(Grille g, Termite t){
return (dansGrille(g, devantTermite(t))) and (contientBrindille(g, devantTermite(t)));
}
bool pasEnferme(Grille g, Termite t){
int vide = 0;
for(short i = 0; i < 8; i++){
if (dansGrille(g, devantCoord(t.c, Direction(i))) and estVide(g, devantCoord(t.c, Direction(i)))){
vide++; //compte le nombre de cases vides
}
}
return vide >= 2;
}
void avanceTermite(Grille &g, Termite &t){
if (laVoieEstLibre(g, t)){
enleveTermite(g, t.c);
t.c = devantTermite(t);
poseTermite(g, t.c, t.idT);
}
}
bool pretADecharger(Grille g, Termite t){
return (brindilleEnFace(g, t)) and (t.sablier <= 0) and (t.brin);
}
bool dechargePossible(Grille g, Termite t){
return (laVoieEstLibre(g, t) and (t.sablier <= 0) and (t.brin) and (t.tourneSurPlace) and (pasEnferme(g, t)));
}
bool chargePossible(Grille g, Termite t){
return (brindilleEnFace(g, t)) and (t.sablier <= 0) and (!t.brin);
}
void dechargeTermite(Grille &g, Termite &t){
poseBrindille(g, devantTermite(t));
t.brin = 0;
t.sablier = tempsVide;
}
void chargeTermite(Grille &g, Termite &t){
t.brin = 1;
enleveBrindille(g, devantTermite(t));
t.sablier = tempsVide;
}
void marcheAleatoire(Grille &g, Termite &t){
int proba = rand()%10;
if (laVoieEstLibre(g, t) and proba < 8){
avanceTermite(g, t);
} else if (laVoieEstLibre(g, t) and proba >= 8){
tourneAleat(t);
avanceTermite(g, t);
} else {
tourneAleat(t);
}
}
void initialiseTabIdVide(Termite (&tab)[tailleTabIdT]){
for(int i=0; i<tailleTabIdT; i++) //initialise les id des termites a 0
tab[i].idT=-1;
}
void afficheTermite(Termite tab[tailleTabIdT], short nT){
for(int i=0; i< tailleTabIdT; i++){
if(tab[i].idT==nT){
cout<<"id: "<<tab[i].idT<<endl;
cout<<"coord: ";afficheCoord(tab[i].c);
cout<<"sablier: "<<tab[i].sablier<<endl;
cout<<"brin: "<<tab[i].brin<<endl;
cout<<"direction: ";afficheDirection(tab[i].d);cout<<endl;
cout<<"tourne"<<tab[i].tourneSurPlace<<endl;
return;
}
}
}
void creeTermite(Coord c1, Termite (&tab)[tailleTabIdT], short id){
for(int i=0; i<tailleTabIdT; i++){
if(tab[i].idT==-1){
tab[i].idT=id;
tab[i].c=c1;
tab[i].sablier=0;
tab[i].brin=0;
tab[i].d=Direction(rand()%7);
tab[i].tourneSurPlace=0;
return;
}
}
}
```