Un concours organisé par les établissements du GROUPE ESIEA
Esiea  Intech
 
Mon espace candidat
Nom d'Utilisateur
Mot de passe

Mot de Passe oublié ?
 
Pas encore
candidat ?

 
A gagner avec Wingineer

1er prix
100% des frais de 5 ans de
scolarité !


2ème prix
Une bourse couvrant 50% des frais !


3ème prix
Une bourse couvrant 25% des frais !

Programmer les missiles

Tout d'abord notez bien que le programme des missiles ne se met pas au même endroit que celui du robot, et que la fonction move n'a aucun effet (le missile avance tout seul), ainsi que fire (c'est le robot qui tire, non le missile), et pour finir, le mot myself fait alors référence au missile que vous êtes en train de piloter (et non au robot).

Faisons un missile à « tête chercheuse » :

let r min-one-of robots [distance myself]
if r != nobody [ face r ]

Note : ici le « mysef » fait référence au missile et non au robot.

Ce code est à insérer dans la fonction robotJobM, comme ceci :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Il faut bien sûr que vous ayez un code de comportement de robot qui décide de tirer pour que vous puissiez voir comment les missiles se dirigent automatiquement. Dans le code de robot ci-dessus, si un missile se rapproche à moins de 5 cases de notre robot, alors notre programme décide de tirer sur le missile.

 

 

 

C'est catastrophique, le missile retourne vers l'envoyeur ! C'est logique c'est bien lui le tank le plus proche du missile au moment du lancement....

 

Une solution est de dire au missile de ne s'occuper que des agents qui sont devant lui, grâce à l'instruction in-cone,le premier paramètre est la longueur (5 cases) du cône et le second l'angle (90°).

let r one-of robots in-cone 5 90
if r != nobody [ face r ]

 

Sur cette image, la zone considérée est colorée en rouge pour bien la visualiser, c'est un cône de 90° d'angle sur 5 cases de long juste devant le missile.


 


Voici la taille d'une case (voir le petit carré devant et a droite du tank sur cette image) :



 

 

Notez qu'il peut être intéressant de modifier les paramètres du cône de surveillance du missile, ainsi que d'ajouter un deuxième critère comme par exemple choisir de viser le tank qui a le score le plus élevé...

let r robots in-cone 10 90 ; on utilise ici un cône de surveillance plus long
let x max-one-of r [score] ; parmi les tanks sélectionnés prendre celui qui a le plus haut score
if x != nobody [ face x ]


 

Il peut aussi être judicieux de choisir plutôt le tank qui a le moins d'énergie (donc qui a le plus de chance d'exploser lors de l'impact)... Dans ce cas modifiez le code de la deuxième ligne comme ceci :

let x min-one-of r [energy]


Vous voyez que cela peu devenir très stratégique...

 

Attention : ce genre de sélection de robots peut être assez dangereuse, car il se peut que votre propre robot soit sélectionné par un de vos missiles! Dans le contexte de code de missile l'instruction other ne se réfère qu'au missile lui même, elle peut donc exclure que le missile d'une sélection mais pas votre tank... Pour cela nous avons créer une fonction qui marche dans tous les cas (code de missile ou de robot) elle s'appelle mine?. Le résultat de cette fonction vaut « false » si l'élément selectionné ne vous appartient pas (robot ou missile), et vaut « true » dans le cas contraîre. Elle peut s'utiliser dans tous les types de sélection d'agent, voici un exemple :

let danger missiles in-radius 5 with [ mine? = false ]

La variable danger contient la liste de tous les missiles dans un rayon de 5 cases, mais en exclut les vôtres. Ce principe peut être utilisé dans le code du robot ou des missiles. Notez l'utilisation du mot clé false il permet de sélectionner les missiles qui ne sont pas les nôtres, pour leur tirer dessus par exemple. Si on voulait sélectionner nos propres missiles dans ce cas on l'aurait remplacé par true.

 

 

La suite : 

Stratégies...