# 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; } } } ```