ARENE | EXPLICATIONS | OPTIONS DE COMBAT | mECHaNIx EN ZIP (35 KO)
SOURCES (JAVA) | PROGRAMMER UN ROBOT | mECHaNIx.JAVA-FAN.COM

Voici une suite de petits exemples de robots de complexité croissante. Après avoir étudié ces exemples tu sera capable de programmer un robot convenable. Tu peux trouver d'autres exemples sur la page des sources. Ensuite si tu veux plonger dans la mécanique intime du jeu tu peux étudier les sources du jeu pour en comprendre les moindres détails.

Si tu veux participer à la programmation de la prochaine version de MechAniX, contacte-moi à mechanix@java-fan.com. Tous les robots actuels seront compatibles avec les futures versions.
 
Voici le Robot le plus simple qui puisse être écrit. Ces 5 lignes doivent être placées dans un fichier texte qui sera nommé MonRobot.java . Les 3 fonctions sont appelées par l'Arène à des moments précis du jeu:
  • init() est appelée lors du début du jeu
  • nouveauRound() est appelée lors du début de chaque round du jeu
  • top() est appelée à intervalle réguliers quelques dizaines de fois par seconde
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){}
}

A chaque top, ce robot tourne de 0.05 radians. Donc lors du combat, ce robot tourne continuellement. Il ne fait rien d'autre.
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){
		tourneRobot(0.05);
	}
}

Ajoutons au robot précédent une ligne pour tirer. Il n'est pas possible de tirer plus d'une fois par top.
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){
		tourneRobot(0.05);
		tire();
	}
}

Ajoutons au robot précédent une ligne pour avancer. Il n'est pas possible d'avancer plus d'une fois par top. La constante avance_max est l'avancement maximal autorisé. Désormais notre robot fonce en tournant et en tirant tout le temps. C'est une technique quelquefois efficace mais il épuise trop rapidement sa réserve de balles et son déplacement n'est pas très réfléchi.
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){
		tourneRobot(0.05);
		tire();
		avance(avance_max);
	}
}

Les robots recoivent à chaque top un objet appelé imageRadar qui contient les informations du radar. Le robot precedent perdait trop de balles, modifions-le pour qu'il ne tire que lorsqu'un ennemi se trouve en face du radar:
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){
		tourneRobot(0.05);

		if(imageRadar.signal){
			tire();
		}

		avance(avance_max);
	}
}

Plus un ennemi est loin moins les chances de le toucher sont grandes. Modifions le robot précédent pour qu'il ne tire que lorsqu'un ennemi se trouve en face du radar et que cet ennemi n'est pas trop loin:
public class MonRobot extends Robot{
	void init(){}
	void nouveauRound(){}
	void top(){
		tourneRobot(0.05);

		if( imageRadar.signal && (imageRadar.distance < 100) ){
			tire();
		}

		avance(avance_max);
	}
}

Chaque robot peut connaitre son état, son angle, l'angle de son canon et de son radar, sa position et le nombre de balles dont il dispose, et d'autres informations définies dans Robot.java. Enlevons la ligne qui fait avancer le robot en permanence. Nous allons maintenant ajouter au robot un mécanisme de détection de dégats: Si entre 2 tops l'état du robot n'est plus le même c'est qu'il se fait tirer dessus ! Il faut alors partir à vitesse maximale:
public class MonRobot extends Robot{
	
	int etat_precedent;  // déclaration de la variable
	
	void init(){}

	void nouveauRound(){
		etat_precedent = etat; // initialisation
	}

	void top(){
		tourneRobot(0.05);

		if( imageRadar.signal && (imageRadar.distance < 100) ){
			tire();
		}

		if( etat != etat_precedent ){   // comparaison
			avance(avance_max);
		}
		etat_precedent = etat; // sauvegarde de l'état pour le prochain top
	}
}

Tu peux trouver d'autres exemples sur la page des sources.


©   2000-2001 Nicolas Raoul - mechanix@java-fan.com - copyright   ®