Aller au contenu
Français

Communication

Votre programme communique avec le jeu grâce à deux composants que tous les robots possèdent :

  • L’émetteur (emitter) envoie des messages au jeu. Il n’a pas besoin d’être activé.
  • Le récepteur (receiver) reçoit les messages du jeu. Activez-le comme un capteur.

Chaque section ci-dessous est un programme complet pour le robot de départ. Tous les messages sont listés dans la Référence des messages.

Pour marquer les points d’une victime lettre (letter victim) ou d’une cible cognitive (cognitive target), le robot doit :

  1. S’arrêter plus d’une seconde près du marqueur. Erebus ignore le signalement si le robot a bougé au cours de la dernière seconde.
  2. Envoyer la position et le type du marqueur : X et Z en centimètres, et le type sous forme d’une lettre.
Marqueur mural Type
Victime lettre Φ (blessée, harmed) H
Victime lettre Ψ (stable) S
Victime lettre Ω (indemne, unharmed) U
Cible cognitive, somme 0 (Gaz inflammable, Flammable Gas) F
Cible cognitive, somme 1 (Toxique, Poison) P
Cible cognitive, somme 2 (Corrosif, Corrosive) C
Cible cognitive, somme 3 (Peroxyde organique, Organic Peroxide) O

Les types sont des lettres, même si les victimes affichent des symboles depuis 2026. Le GPS donne des mètres : multipliez donc par 100.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter") # Always on the robot. It does not need to be enabled.
gps = robot.getDevice("gps")
gps.enable(timeStep)
leftWheel = robot.getDevice("left wheel motor")
rightWheel = robot.getDevice("right wheel motor")
leftWheel.setPosition(float("inf"))
rightWheel.setPosition(float("inf"))
def wait(seconds):
start = robot.getTime()
while robot.step(timeStep) != -1:
if robot.getTime() - start >= seconds:
break
def report(tokenType):
# 1. Stop for more than 1 second
leftWheel.setVelocity(0)
rightWheel.setVelocity(0)
wait(1.2)
# 2. Send the position in centimeters, and the type as one letter
x, _, z = gps.getValues()
message = struct.pack("i i c", int(x * 100), int(z * 100), tokenType.encode())
emitter.send(message)
robot.step(timeStep)
report("H") # Reports a harmed victim (Φ) where the robot is
print("Reported")

Le robot doit être du même côté du mur que le marqueur, et le robot comme la position envoyée doivent en être proches. Les règles exigent au plus une demi-case : visez cela. Erebus v26.1 vérifie une distance de 9 cm.

Exécutez ce programme au départ de world1.wbt : il n’y a pas de marqueur à cet endroit, donc l’historique de la fenêtre de contrôle affiche Misidentification of Victim -5. Un mauvais signalement, y compris le signalement d’un leurre, coûte 5 points, et chaque marqueur ne rapporte des points qu’une seule fois.

L’historique de la fenêtre de contrôle après un mauvais signalement et la soumission d’une carte

Quand le robot est bloqué, une absence de progression (Lack of Progress) le ramène au dernier point de contrôle et coûte 5 points. Elle se produit automatiquement au bout de 20 secondes sans mouvement, et votre programme peut aussi la déclencher en envoyant L. À chaque fois, le jeu envoie L au robot, pour que votre programme sache que sa position a changé.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
receiver = robot.getDevice("receiver")
receiver.enable(timeStep) # The receiver must be enabled
askedAt = None
while robot.step(timeStep) != -1:
# Call a lack of progress once, after 2 seconds
if askedAt is None and robot.getTime() > 2:
emitter.send(struct.pack("c", b"L"))
askedAt = robot.getTime()
# Listen for messages from the game
while receiver.getQueueLength() > 0:
data = receiver.getBytes()
if len(data) == 1 and data == b"L":
print("Lack of progress! The robot is back at the last checkpoint.")
receiver.nextPacket()

Le récepteur peut recevoir différents messages : vérifiez donc la longueur de chacun avant de le lire, comme dans l’exemple.

Envoyez G pour obtenir le score et le temps restant. Le jeu répond par un message de 16 octets : la lettre G, le score, le temps de jeu restant et le temps réel restant, en secondes.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
receiver = robot.getDevice("receiver")
receiver.enable(timeStep)
lastAsked = 0
while robot.step(timeStep) != -1:
# Ask for the game information once a second
if robot.getTime() - lastAsked > 1:
emitter.send(struct.pack("c", b"G"))
lastAsked = robot.getTime()
while receiver.getQueueLength() > 0:
data = receiver.getBytes()
if len(data) == 16: # The game information is 16 bytes long
_, score, timeLeft, realTimeLeft = struct.unpack("c f i i", data)
print("Score:", round(score, 2), "Time left:", timeLeft, "s", "Real time left:", realTimeLeft, "s")
receiver.nextPacket()

Le temps de jeu s’écoule plus vite dans les marécages, et la partie se termine dès que l’un des deux temps est écoulé. Utilisez les deux pour savoir quand revenir au départ.

Envoyez E pour terminer la partie. Si le robot est sur la case de départ et a identifié au moins un marqueur mural, il obtient le bonus de sortie (exit bonus) de 10 %.

from controller import Robot
import struct
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
emitter = robot.getDevice("emitter")
robot.step(timeStep)
print("Ending the game")
# Ends the game. Send it on the starting tile, after identifying a token, to get the exit bonus.
# The game stops your program right after this message.
emitter.send(struct.pack("c", b"E"))
robot.step(timeStep)

Ensuite, apprenez à distinguer les marqueurs dans Marqueurs muraux.