Ce chapitre décrit ce dont vous aurez besoin afin de construire vos propres robots. Le plus important à savoir est le langage de messages, qui est composé de 35 commandes utilisées pour communiquer avec le serveur. Il peut également être interresant d'étudier les exemples de robots livrés dans le repertoire
Robots/.
Au début de chaque séquence, les processus des robots sont lancés par le serveur et deux 'pipes' leur sont assignés (un pour les 'Entrees' et l'autre pour les 'Sortie'). Ces deux pipes sont connectés à stdin et stdout, de telle sorte que du point de vue du robot, la communication avec le serveur s'effectue via l'entrée et la sortie standards.
Cette approche vous laisse libre du langage de programmation. Toutefois, le robot doit savoir quand il reçoit un nouveau message. Il y a (au moins) trois méthodes pour y parvenir :
C'est la méthode la plus simple. En lisant l'entrée standard stdin, le programme est bloqué jusqu'à l'arrivée d'un nouveau message. Vous pouvez donc construire votre programme comme si il y avait toujours un mesage en attente. Le point noir est que vous ne pouvez faire aucun calcul pendant que le programme attend un nouveau message.
Pour choisir cette méthode, il faut envoyer l'option suivante dès que le programme est lancé
cout << "RobotOption " << USE_NON_BLOCKING << " " << 0 << endl;Ceci est un code C++. Si vous n'utilisez pas le C++, il suffit d'afficher l'information (comme si vous deviez afficher quelquechose à l'écran). endl est l'équivalent de 'fin de ligne'.
Utiliser la fonction select de libc permet au robot d'avoir un meilleur contrôle pour savoir quand regarder les nouveaux messages.
Il vous permet, par exemple, de lire tous les messages, faire quelques calculs, envoyer les commandes puis d'attendre de nouveaux messages. Pour en savoir plus à propos de select, lisez la documentation Unix
( e.g. man pages or emacs info ).
Pour choisir cette méthode, envoyer l'information suivante dès que le programme est lancé:
cout << "RobotOption " << USE_NON_BLOCKING << " " << 1 << endl;Il s'agit encore une fois d'un ligne de code C++
Si vous voulez, vous pouvez demander à RealTimeBattle d'envoyer un signal au robot quand une nouvelle serie de messages est envoyée. Cette méthode permet au robot d'être continuellement mis au courant des informations du serveur même lorsqu'il est occupé par des calculs. Si vous n'en savez pas assez sur les signaux, regarder la documentation Unix ou étudiez les autres robots pour en savoir plus.
Pour utiliser cette méthoed, envoyé l'option suivante au serveur dès le lancement du programme
cout << "RobotOption " << USE_NON_BLOCKING << " " << 1 << endl; cout << "RobotOption " << SIGNAL << " " << SIGUSR1 << endl;Toujours du C++.
Vous pouvez bien sûr utiliser n'importe quel signal à la place de SIGUSR1.
Pour vous aider à implanter ces méthodes, le robot rotate_and_fire
a été écrit de trois manières différentes, mais fonctionnent de la même façon.
Vous êtes libre de l'étudier et de le copier pour votre propre robot.
Ce n'est pas une bonne idée de faire du 'busy wait', i.e., de regarder répetitivement les messages jusqu'à en avoir un. Cela ralentit considérablement les choses et pire, en mode competition le robot sera vite au delà du CPU qui lui est accordé et mourrira.
Le fichier Messagetypes.h est une bonne source d'information sur le langage de communication. C'est un fichier d'inclusion C/C++, mais il est facile de le réécrire dans un autre langage de programmation. Vous pourrez y trouver la liste des messages, les types d'avertissement, les objets, les options de jeu et de robot.
Durant la progression de la bataille en temps réel, avec des processus réels, il est possible d'écrire des programme qui 'trichent' à un moment ou à un autre. Par exemple, en examinant les autres robots ou le serveur pour avoir plus d'informations, en utilisant d'importantes resources pour ralentir les autres robots et de bien d'autres façons encore. Ce n'est bien sur pas la méthode attendue pour vaincre l'adversaire, alors nous essayons de limiter ces actions autant que possible.
Dans le mode competition les robots ne sont pas autorisé à lancer des processus fils et l'utilisation du CPU est limitée. Ainsi, un robot ne peux pas utiliser tout le CPU.
Il n'est pas possible d'empecher toutes les façons de tricher dans RTB. Il est par exemple possible d'écrire ou de lire des fichiers, mais souvenez vous que les organisateurs de compétitions peuvent interdir cele s'il le souhaite. Limiter les droits d'acces du robot donne des résultats satisfaisants.
Il est toujours possible de trouver des moyens de contourner ces restrictions; si vous trouver un de ces moyens, s'il vous plait, envoyer nous un rapport de bug. Néanmoins, il est du bon plaisir de l'oganisateur du tournoi d'assurer le respect de ces règles.
C'est le premier message que le robot recevra. Si l'argument est 1, c'est la première sequence d'un tournoi et le robot doit se présenter en envoyant son Nom et sa Couleur au serveur, sinon il devra attendre les messages YourName et YourColour (voir plus loin). (En fait, je n'en suis pas trop sur...)
Le nom courant du robot, à ne pas changer sans avoir une bonne raison.
Couleur courante du robot, à changer si elle n'est pas à votre goût.
Au début de chaque jeu, le robot recevra un certain nombre de caractéristiques qui pourraient lui être utiles. Pour obtenir une liste complète de ces messages, regardez le fichier
Messagetypes.h
pour voir l'enumeration des game_option_type.
Dans le
chapitre des options vous obtiendrez des informations plus détaillées. Le
niveau de debuggage est aussi envoyé comme option, même s'il ne fait pas partie de la liste.
C'est le message envoyé pour signaler le début de la bataille (surpris?)
Ce message donne les informations venant du radar à chaque tour. Souvenez vous que l'angle du radar est relatif à l'avant du robot. Il est donné en radians.
Le message Info suit toujours le message Radar. Il donne des informations plus générales sur l'état du robot. Le temps est celui écoulé depuis le début du jeu. Ce n'est pas forcement le même que le temps réellement écoulé (à cause de l'échelle de temps et du plus petit écart de temps.
Vous donne la position courante du robot. Il est envoyé seulement si l'option est 1 ou 2. Si elle est 1 les coordonnées sont envoyés relativement à la position de départ (Le robot ne sait pas exactement où il a commencé, mais seulement de combien il s'est déplacé).
Si vous détecter un robot au radar, ce message suivra, donnant les informations sur ce robot. Le niveau d'énergie de l'adversaire sera donné de la même façon que votre propre énergie (voir plus bas). Le second argument concerne seulement le mode en équipe (qui n'est pas encore implanté), 1 signalant qu'il s'agit d'un membre de votre équipe et 0 un ennemi.
Quand l'option robot
SEND_ROTATION_REACHED est activée, ce message est envoyé quand une rotation (avec RotateTo ou RotateAmount) est terminée ou que la direction à changée (lors d'un balayage).
DL>
C'est la méthode la plus simple. En lisant l'entrée standard Pour choisir cette méthode, il faut envoyer l'option suivante
dès que le programme est lancé
Utiliser la fonction Pour choisir cette méthode, envoyer l'information suivante
dès que le programme est lancé:
Si vous voulez, vous pouvez demander à RealTimeBattle d'envoyer un signal au robot quand une nouvelle serie de messages est envoyée.
Cette méthode permet au robot d'être continuellement mis au courant des informations du serveur même lorsqu'il est occupé par des calculs. Si vous n'en savez pas assez sur les signaux, regarder la documentation Unix ou étudiez les autres robots pour en savoir plus.
Pour utiliser cette méthoed, envoyé l'option suivante au serveur dès le lancement du programme
Vous pouvez bien sûr utiliser n'importe quel signal à la place de
stdin, le programme est bloqué jusqu'à l'arrivée d'un nouveau message. Vous pouvez donc construire votre programme comme si il y avait toujours un mesage en attente. Le point noir est que vous ne pouvez faire aucun calcul pendant que le programme attend un nouveau message.
cout << "RobotOption " << USE_NON_BLOCKING << " " << 0 << endl;
Ceci est un code C++. Si vous n'utilisez pas le C++, il suffit d'afficher l'information (comme si vous deviez afficher quelquechose à l'écran). endl est l'équivalent de 'fin de ligne'.
select de libc permet au robot d'avoir un meilleur contrôle pour savoir quand regarder les nouveaux messages.
Il vous permet, par exemple, de lire tous les messages, faire quelques calculs, envoyer les commandes puis d'attendre de nouveaux messages. Pour en savoir plus à propos de select, lisez la documentation Unix
( e.g. man pages or emacs info ).
cout << "RobotOption " << USE_NON_BLOCKING << " " << 1 << endl;
Il s'agit encore une fois d'un ligne de code C++
cout << "RobotOption " << USE_NON_BLOCKING << " " << 1 << endl;
cout << "RobotOption " << SIGNAL << " " << SIGUSR1 << endl;
Toujours du C++.
SIGUSR1.
Pour vous aider à implanter ces méthodes, le robot rotate_and_fire
a été écrit de trois manières différentes, mais fonctionnent de la même façon.
Vous êtes libre de l'étudier et de le copier pour votre propre robot.
Ce n'est pas une bonne idée de faire du 'busy wait', i.e., de regarder répetitivement les messages jusqu'à en avoir un. Cela ralentit considérablement les choses et pire, en mode competition le robot sera vite au delà du CPU qui lui est accordé et mourrira.
Le fichier Messagetypes.h est une bonne source d'information sur le langage de communication. C'est un fichier d'inclusion C/C++, mais il est facile de le réécrire dans un autre langage de programmation. Vous pourrez y trouver la liste des messages, les types d'avertissement, les objets, les options de jeu et de robot.
Durant la progression de la bataille en temps réel, avec des processus réels, il est possible d'écrire des programme qui 'trichent' à un moment ou à un autre. Par exemple, en examinant les autres robots ou le serveur pour avoir plus d'informations, en utilisant d'importantes resources pour ralentir les autres robots et de bien d'autres façons encore. Ce n'est bien sur pas la méthode attendue pour vaincre l'adversaire, alors nous essayons de limiter ces actions autant que possible.
Dans le mode competition les robots ne sont pas autorisé à lancer des processus fils et l'utilisation du CPU est limitée. Ainsi, un robot ne peux pas utiliser tout le CPU.
Il n'est pas possible d'empecher toutes les façons de tricher dans RTB. Il est par exemple possible d'écrire ou de lire des fichiers, mais souvenez vous que les organisateurs de compétitions peuvent interdir cele s'il le souhaite. Limiter les droits d'acces du robot donne des résultats satisfaisants.
Il est toujours possible de trouver des moyens de contourner ces restrictions; si vous trouver un de ces moyens, s'il vous plait, envoyer nous un rapport de bug. Néanmoins, il est du bon plaisir de l'oganisateur du tournoi d'assurer le respect de ces règles.
C'est le premier message que le robot recevra. Si l'argument est 1, c'est la première sequence d'un tournoi et le robot doit se présenter en envoyant son Nom et sa Couleur au serveur, sinon il devra attendre les messages YourName et YourColour (voir plus loin). (En fait, je n'en suis pas trop sur...)
Le nom courant du robot, à ne pas changer sans avoir une bonne raison.
Couleur courante du robot, à changer si elle n'est pas à votre goût.
Au début de chaque jeu, le robot recevra un certain nombre de caractéristiques qui pourraient lui être utiles. Pour obtenir une liste complète de ces messages, regardez le fichier
Messagetypes.h
pour voir l'enumeration des game_option_type.
Dans le
chapitre des options vous obtiendrez des informations plus détaillées. Le
niveau de debuggage est aussi envoyé comme option, même s'il ne fait pas partie de la liste.
C'est le message envoyé pour signaler le début de la bataille (surpris?)
Ce message donne les informations venant du radar à chaque tour. Souvenez vous que l'angle du radar est relatif à l'avant du robot. Il est donné en radians.
Le message Info suit toujours le message Radar. Il donne des informations plus générales sur l'état du robot. Le temps est celui écoulé depuis le début du jeu. Ce n'est pas forcement le même que le temps réellement écoulé (à cause de l'échelle de temps et du plus petit écart de temps.
Vous donne la position courante du robot. Il est envoyé seulement si l'option est 1 ou 2. Si elle est 1 les coordonnées sont envoyés relativement à la position de départ (Le robot ne sait pas exactement où il a commencé, mais seulement de combien il s'est déplacé).
Si vous détecter un robot au radar, ce message suivra, donnant les informations sur ce robot. Le niveau d'énergie de l'adversaire sera donné de la même façon que votre propre énergie (voir plus bas). Le second argument concerne seulement le mode en équipe (qui n'est pas encore implanté), 1 signalant qu'il s'agit d'un membre de votre équipe et 0 un ennemi.
Quand l'option robot
SEND_ROTATION_REACHED est activée, ce message est envoyé quand une rotation (avec RotateTo ou RotateAmount) est terminée ou que la direction à changée (lors d'un balayage).
DL>
C'est la méthode la