diff --git a/ia04-mason-cours/src/tutorial/Tools.java b/ia04-mason-cours/src/tutorial/Tools.java index c81a9ce8b83f29337a8cab4d4817648087e5220b..5c118f36eccd136e456fb6d3e3331df84f8bee4e 100644 --- a/ia04-mason-cours/src/tutorial/Tools.java +++ b/ia04-mason-cours/src/tutorial/Tools.java @@ -8,6 +8,7 @@ import tutorial.model.Planete; import tutorial.model.environnement.Ressource; import java.util.ArrayList; +import java.util.Iterator; import java.util.Random; public class Tools { @@ -83,7 +84,7 @@ public class Tools { /** * Calcule la distance entre deux cases sans compter - * les déplacements en diagonal + * les déplacements en diagonale * @param aX coordonnée X première case * @param aY coordonnée Y première case * @param bX coordonnée X deuxième case @@ -91,6 +92,7 @@ public class Tools { * @return distance entre les deux cases */ public static int distance(int aX, int aY, int bX, int bY) { + // TODO Changer ça, prendre en compte l'aspect toroïdal de la map ! int dX = Math.abs(aX - bX); int dY = Math.abs(aY - bY); return dX + dY; @@ -115,4 +117,5 @@ public class Tools { } return retour; } + } diff --git a/ia04-mason-cours/src/tutorial/model/Constants.java b/ia04-mason-cours/src/tutorial/model/Constants.java index 3ca1161ee9740acc90acb8dd9357493a9ec77d59..f9f7f31e7503aa9d7c1ecd8876064b677c40ead4 100644 --- a/ia04-mason-cours/src/tutorial/model/Constants.java +++ b/ia04-mason-cours/src/tutorial/model/Constants.java @@ -45,6 +45,7 @@ public class Constants { public final static int ETAT_ARBRE = 3; public final static int NB_FRUITS_MIN = 2; public final static int NB_FRUITS_MAX = 4; + public final static int NUTRITION_FRUIT = 1; public final static int QUANTITE_EAU_MAX = 15; public final static int DURETE_MINERAI_MAX = 3; diff --git a/ia04-mason-cours/src/tutorial/model/balise/Balise.java b/ia04-mason-cours/src/tutorial/model/balise/Balise.java index 300a3a8419db04500d055153416756e5e4589511..61fb900e50ba24367bbc0a74a731f4135056b57a 100644 --- a/ia04-mason-cours/src/tutorial/model/balise/Balise.java +++ b/ia04-mason-cours/src/tutorial/model/balise/Balise.java @@ -4,6 +4,7 @@ import sim.engine.SimState; import sim.engine.Steppable; import sim.engine.Stoppable; import tutorial.model.Constants; +import tutorial.model.Planete; /** * Une balise se comporte comme une trace. @@ -16,13 +17,16 @@ public class Balise implements Steppable { public Balise(TypeBalise t) { this.type = t; - this.intensite = Constants.BALISE_INTENSITE_MAX; + this.intensite = Constants.BALISE_INTENSITE_MAX; // TODO Plus une planète est grande, plus les balises restent longtemps } @Override public void step(SimState simState) { + Planete p = (Planete)simState; this.intensite -= 1; if(this.intensite <= 0) { + System.out.println("KILL"); + p.yard.remove(this); this.stoppable.stop(); } } @@ -30,4 +34,10 @@ public class Balise implements Steppable { public TypeBalise getType() { return type; } + + @Override + public String toString() { + return "[" + this.getClass().getSimpleName() + "] " + + "t=" + this.intensite; + } } diff --git a/ia04-mason-cours/src/tutorial/model/crocosmaute/Crocosmaute.java b/ia04-mason-cours/src/tutorial/model/crocosmaute/Crocosmaute.java index 16db238c6c2c9e2b7f7e39ccee91a81e5c9083f7..c05a296f04041527d0da2b07c3390e87514be66b 100644 --- a/ia04-mason-cours/src/tutorial/model/crocosmaute/Crocosmaute.java +++ b/ia04-mason-cours/src/tutorial/model/crocosmaute/Crocosmaute.java @@ -285,7 +285,7 @@ public abstract class Crocosmaute implements Steppable { */ private void manger() { this.chargeFruits -= 1; - this.faim += 1; + this.faim += Constants.NUTRITION_FRUIT; if(this.faim > Constants.SATIETE) { this.faim = Constants.SATIETE; } diff --git a/ia04-mason-cours/src/tutorial/model/crocosmaute/Eclaireur.java b/ia04-mason-cours/src/tutorial/model/crocosmaute/Eclaireur.java index ef2efe3d245c23fc96bd31eb5aaf54d8194063da..27638326e8832ab399ededb73be41800e24d5ab3 100644 --- a/ia04-mason-cours/src/tutorial/model/crocosmaute/Eclaireur.java +++ b/ia04-mason-cours/src/tutorial/model/crocosmaute/Eclaireur.java @@ -1,8 +1,17 @@ package tutorial.model.crocosmaute; +import sim.engine.Stoppable; +import sim.util.Bag; +import tutorial.Tools; +import tutorial.model.Location; +import tutorial.model.alien.Alien; import tutorial.model.balise.Balise; import tutorial.model.Planete; import tutorial.model.balise.TypeBalise; +import tutorial.model.environnement.Eau; +import tutorial.model.environnement.Minerai; + +import java.util.ArrayList; public class Eclaireur extends Crocosmaute { private TypeBalise balise; @@ -14,14 +23,35 @@ public class Eclaireur extends Crocosmaute { balise = null; } - - /** - * Si il est à la fusée, il se déplace aléatoirement - * @param p planète - */ @Override protected void strategie(Planete p) { - if(this.x == p.getPosVaisseau().getX() && this.y == p.getPosVaisseau().getY()) + Bag b = p.getYard().getObjectsAtLocation(this.x,this.y); + boolean alien = false; + boolean eau = false; + boolean minerai = false; + if(b != null) + { + for (Object o : b) { + if(o instanceof Alien) + { + alien = true; + } + else if(o instanceof Eau) + { + eau = true; + } + else if(o instanceof Minerai) + { + minerai = true; + } + } + } + /* Si on se trouve sur un alien, l'attaquer */ + if(alien) + { + //this.attaquer(p); TODO + } + else if(this.x == p.getPosVaisseau().getX() && this.y == p.getPosVaisseau().getY()) { this.setRetourFusee(false); this.moveInRandomDirection(p); @@ -34,21 +64,62 @@ public class Eclaireur extends Crocosmaute { this.avancerDeUnPasVers(p, p.getVaisseau().getX(),p.getVaisseau().getY()); } } + /* Si on se trouve sur du minerai, activer le retour fusée, + changer le type de balise et commencer à revenir à la fusée + */ + else if(minerai) + { + this.setRetourFusee(true); + this.setBalise(TypeBalise.MINERAI); + this.poserBalise(this.getBalise(),p); + this.avancerDeUnPasVers(p,p.getVaisseau().getX(),p.getVaisseau().getY()); + } + /* Si on se trouve sur de l'eau, activer le retour fusée, + changer le type de balise et commencer à revenir à la fusée + */ + else if(eau) + { + this.setRetourFusee(true); + this.setBalise(TypeBalise.EAU); + this.poserBalise(this.getBalise(),p); + this.avancerDeUnPasVers(p,p.getVaisseau().getX(),p.getVaisseau().getY()); + } else { - moveInRandomDirection(p); // TODO KOMALIS + ArrayList<Location> mineraiEnVue = this.ressourceEnVue(p, Minerai.class); + ArrayList<Location> eauEnVue = this.ressourceEnVue(p, Eau.class); + /* Si du minerai est en vue, y aller */ + if(!mineraiEnVue.isEmpty()) + { + Location there = Tools.plusProche(new Location(this.x,this.y),mineraiEnVue); + this.avancerVers(p,there.getX(),there.getY()); + } + /* Si de l'eau est en vue, y aller */ + else if(!eauEnVue.isEmpty()) + { + Location there = Tools.plusProche(new Location(this.x,this.y),eauEnVue); + this.avancerVers(p,there.getX(),there.getY()); + } + /* When all else fails */ + else + { + moveInRandomDirection(p); + } } + } /** * Pose une balise à l'emplacement du crocosmaute * @param t type de la balise posée - * @param planete + * @param p planète */ - public void poserBalise(TypeBalise t, Planete planete) { + public void poserBalise(TypeBalise t, Planete p) { Balise b = new Balise(t); - planete.yard.setObjectLocation(b,this.x,this.y); + p.getYard().setObjectLocation(b,this.x,this.y); + Stoppable stoppable = p.schedule.scheduleRepeating(b); + b.stoppable = stoppable; } public TypeBalise getBalise() { diff --git a/ia04-mason-cours/src/tutorial/model/crocosmaute/Jardinier.java b/ia04-mason-cours/src/tutorial/model/crocosmaute/Jardinier.java index 02a9ae763a80f1308be5c051662a215725ebaa62..b612987acf0a3ba303239a65668a6187545cbc51 100644 --- a/ia04-mason-cours/src/tutorial/model/crocosmaute/Jardinier.java +++ b/ia04-mason-cours/src/tutorial/model/crocosmaute/Jardinier.java @@ -122,9 +122,9 @@ public class Jardinier extends Crocosmaute { else if(!balisesEnVue.isEmpty()) { //System.out.println("[Gardener] Water flag in sight !"); - + // TODO aller vers la balise à la plus faible trace Location here = new Location(this.x,this.y); - Location there = Tools.plusProche(here,eauEnVue); + Location there = Tools.plusProche(here,balisesEnVue); this.avancerVers(p,there.getX(),there.getY()); } else @@ -168,7 +168,7 @@ public class Jardinier extends Crocosmaute { /* Si un arbre fruitier ou un fruit non arrosé est à proximité, s'y rendre */ if(!fruitsEnVue.isEmpty()) { - //System.out.println("[Gardener] Fruits in sight"); + //System.out.println("[Gardener] Fruit in sight"); Location loc = Tools.plusProche(new Location(this.x,this.y), fruitsEnVue); this.avancerVers(p, loc.getX(), loc.getY()); diff --git a/ia04-mason-cours/src/tutorial/model/crocosmaute/Mineur.java b/ia04-mason-cours/src/tutorial/model/crocosmaute/Mineur.java index 9f6fa714667d8d0a03126cbb87788e0eed955e95..ad8b9b176e005a96167beb7b5074651f99a546c9 100644 --- a/ia04-mason-cours/src/tutorial/model/crocosmaute/Mineur.java +++ b/ia04-mason-cours/src/tutorial/model/crocosmaute/Mineur.java @@ -71,6 +71,7 @@ public class Mineur extends Crocosmaute { /* Si une balise minerai est à proximité, s'y rendre */ else if(!balisesEnVue.isEmpty()) { + // TODO aller vers la balise à la plus faible trace Location loc = balisesEnVue.get(0); this.avancerVers(p, loc.getX(), loc.getY()); } diff --git a/ia04-mason-cours/src/tutorial/model/environnement/Fruit.java b/ia04-mason-cours/src/tutorial/model/environnement/Fruit.java index 23b6f20a69fcd6b7300e3b80720d8ae212dcfb00..d7370583856445f6a362f8f54eebe9944fc356e4 100644 --- a/ia04-mason-cours/src/tutorial/model/environnement/Fruit.java +++ b/ia04-mason-cours/src/tutorial/model/environnement/Fruit.java @@ -33,8 +33,8 @@ public class Fruit extends Ressource { } else { - /** - * Machine à états correspondant à la croissance de la plante + /* + Machine à états correspondant à la croissance de la plante */ switch (this.clock) {