---
# System prepended metadata

title: coord.cpp

---

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

```