Tutorials - AI examples
[Defensive - Easy] Shield activation
WARNING: this video is obsolete and uses deprecated API. The source code to use is pasted after the video.
- An AI example with Eclipse: shield activation
package foo.me.ai;
import galaxiia.jeu.intelligence.Intelligence;
import galaxiia.jeu.terrain.InformateurTerrain;
import galaxiia.jeu.unite.ControleurUnite;
import galaxiia.jeu.unite.InformateurUnite;
public class Test2 implements Intelligence {
public void initialisation(InformateurUnite unite, InformateurTerrain terrain) {
// Nothing to initialize
}
public void nouveauTour(ControleurUnite unite, InformateurTerrain terrain) {
// The shield is activated at each turn.
unite.activationBouclier();
}
}
[Neutral - Easy] Moving a spaceship
[Agressive - Normal] Burst of "fox missiles"
/**
* Les packages permettent de ranger les fichiers de vos programme.
*
* Ici pour que ce programme compile, il faut que ce fichier soit situé dans un
* pakage nommé votrenom. Pour ajouter un package sur Eclipse, il suffit de
* faire Fichier -> Nouveau -> Package.
*/
package foo.me.ai;
import galaxiia.configuration.Identification;
import galaxiia.jeu.intelligence.Intelligence;
import galaxiia.jeu.terrain.InformateurTerrain;
import galaxiia.jeu.unite.ClasseurUnite;
import galaxiia.jeu.unite.ConstantesUnite;
import galaxiia.jeu.unite.ControleurUnite;
import galaxiia.jeu.unite.InformateurUnite;
@Identification(nom = "Fox burst", auteur = "2CIA", version = 1)
public class FoxBurst implements Intelligence {
/*
* Définition des constantes.
*/
/**
* Le nombre de missiles dans une rafale de fox.
*/
private static final int NOMBRE_MISSILE_RAFALE = 12;
/**
* Récupération du coût énergétique de lancement d'un missile fox.
*/
private static final double COUT_ENERGETIQUE_LANCEMENT_FOX = ClasseurUnite
.creationUniteAbstraite(ConstantesUnite.MISSILE_FOX)
.coutEnergetiqueCreation();
/*
* Définition des variables globales.
*/
/**
* Si cette variable vaut <code>true</code>, c'est que l'unité est en train de
* lancer une rafale de fox.
*/
private boolean lancementRafaleEnCours;
/**
* Le nombre de missile déjà lancés pour la rafale en cours.
*/
private int nombreMissilesLances;
/**
* L'unite ciblée par la rafale en cours.
*/
private InformateurUnite uniteCible;
/**
* L'initialisation de l'intelligence.
*/
public void initialisation(InformateurUnite unite, InformateurTerrain terrain) {
if (!unite.peutCreer(ClasseurUnite.MISSILE_FOX)) {
// Si notre unité ne peut pas lancer de missile fox on refuse le combat et
// on abandonne.
throw new IllegalStateException("Notre unité ne peut pas lancer de fox.");
} else {
// Sinon, on initialise les variables.
lancementRafaleEnCours = false;
nombreMissilesLances = 0;
uniteCible = null;
}
}
/**
* Continue de lancer la raffale de fox.
*
* @param monUnite
* L'unité que l'on contrôle.
*/
public void lancementRafale(ControleurUnite monUnite) {
// On tire le missile.
monUnite.lancementProjectileVersPoint(ControleurUnite.MISSILE_FOX,
pointCible(uniteCible));
// On ajoute un au nombre de missiles lancés.
nombreMissilesLances++;
if (nombreMissilesLances == NOMBRE_MISSILE_RAFALE) {
// Si on a lancé le bon nombre de missiles, on réinitiale les variables.
lancementRafaleEnCours = false;
nombreMissilesLances = 0;
uniteCible = null;
}
}
/**
* Donne une unité cible.
*
* @param monUnite
* L'unité que l'on contrôle.
* @param terrain
* Le terrain sur lequel on joue.
*
* @return L'unité cible ou null si aucune unité ne peut être une cible.
*/
public InformateurUnite uniteCible(InformateurUnite monUnite,
InformateurTerrain terrain) {
// On parcourt toutes les unités du terrain.
for (InformateurUnite unite : terrain.tableauUnites()) {
if ((unite.equipe() != monUnite.equipe())
&& (unite.equipe() != ConstantesUnite.EQUIPE_MISSILE)) {
// Si l'unité n'est ni de mon équipe, ni un missile, on choisie cette
// unité.
return unite;
}
}
// On a pas trouvé d'unité ennemi. On retourne null.
return null;
}
/**
* Donne le point vers lequel il faut lancer le missile pour toucher l'unité.
*
* @param uniteCible
* L'unite cible.
*
* @return Le point où il faut lancer le missile pour toucher la cible.
*/
public double[] pointCible(InformateurUnite uniteCible) {
// On donne la position de l'unité cible.
return uniteCible.position();
}
/**
* Les choix de l'intelligence.
*/
public void nouveauTour(ControleurUnite monUnite, InformateurTerrain terrain) {
if (lancementRafaleEnCours) {
// Si notre unite est en train de tirer une rafale, on continue.
lancementRafale(monUnite);
} else {
if (COUT_ENERGETIQUE_LANCEMENT_FOX * NOMBRE_MISSILE_RAFALE <= monUnite
.energie()) {
// Si notre unite à suffisamment d'énergie pour lancer tous les missiles
// fox à la suite.
// Recherche d'un cible potentielle.
uniteCible = uniteCible(monUnite, terrain);
if (uniteCible != null) {
// Si on a bien une cible, on commence à lancer la rafale de fox.
lancementRafaleEnCours = true;
lancementRafale(monUnite);
} else {
// Sinon on ne fait rien, on a pas de cible.
}
} else {
// Si notre unite n'a pas suffisamment d'énergie, on attent un tour de
// plus (on fait rien).
}
}
}
}