İçeriğe geç
Türkçe

İletişim

Programın, her robotta bulunan iki cihaz aracılığıyla oyunla konuşur:

  • Verici (emitter) oyuna mesaj gönderir. Etkinleştirilmesi gerekmez.
  • Alıcı (receiver) oyundan mesaj alır. Onu bir sensör gibi etkinleştir.

Aşağıdaki her bölüm, başlangıç robotu için eksiksiz bir programdır. Tüm mesajlar Mesaj başvurusu sayfasında listelenmiştir.

Bir harf kazazede ya da bilişsel hedeften puan almak için robot şunları yapmalıdır:

  1. İşaretin yakınında 1 saniyeden uzun süre durmak. Robot son bir saniye içinde hareket ettiyse Erebus bildirimi dikkate almaz.
  2. İşaretin konumunu ve türünü göndermek: X ve Z santimetre cinsinden, tür ise tek bir harf olarak gönderilir.
Duvar işareti Tür
Harf kazazede Φ (yaralı) H
Harf kazazede Ψ (stabil) S
Harf kazazede Ω (yarasız) U
Bilişsel hedef, toplam 0 (Yanıcı Gaz) F
Bilişsel hedef, toplam 1 (Zehir) P
Bilişsel hedef, toplam 2 (Aşındırıcı) C
Bilişsel hedef, toplam 3 (Organik Peroksit) O

Kazazedeler 2026’dan beri sembol gösterse de türler harftir. GPS metre verdiği için 100 ile çarp.

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")

Robot, işaretle duvarın aynı tarafında olmalı; hem robot hem de gönderdiğin konum işarete yakın olmalıdır. Kurallar en fazla yarım kare mesafe ister, bunu hedefle. Erebus v26.1, 9 cm’lik bir mesafeyi kontrol eder.

Bu programı world1.wbt’nin başında çalıştır: orada hiç işaret yoktur, bu yüzden kontrol penceresinin geçmişinde Misidentification of Victim -5 görünür. Sahte bir işareti bildirmek de dahil olmak üzere her yanlış bildirim 5 puana mal olur ve her işaretten yalnızca bir kez puan alınabilir.

Yanlış bir bildirim ve harita gönderiminden sonra kontrol penceresinin geçmişi

Robot sıkıştığında bir ilerleme eksikliği (lack of progress, LoP), robotu son kontrol noktasına geri götürür ve 5 puana mal olur. Robot 20 saniye hareketsiz kalınca bu otomatik olarak gerçekleşir; programın da L göndererek ilerleme eksikliği çağırabilir. Her seferinde oyun robota L gönderir; böylece programın, robotun konumunun değiştiğini anlar.

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()

Alıcı farklı mesajlar alabilir, bu yüzden örnekteki gibi her mesajı okumadan önce uzunluğunu kontrol et.

Puanı ve kalan süreyi öğrenmek için G gönder. Oyun 16 baytlık bir mesajla yanıt verir: G harfi, puan, kalan oyun süresi ve kalan gerçek zaman (saniye cinsinden).

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()

Oyun süresi bataklıklarda daha hızlı akar ve iki süreden biri dolduğunda oyun biter. Başlangıca ne zaman döneceğini bilmek için ikisini de kullan.

Oyunu bitirmek için E gönder. Robot başlangıç karesindeyse ve en az bir duvar işaretini tanımladıysa %10’luk çıkış bonusunu alır.

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)

Sırada, Duvar işaretleri sayfasında işaretleri birbirinden ayırt etmeyi öğrenmek var.