La începutul fiecărui joc, fiecărui bot îi sunt transmişi parametrii generali, care încep cu transmiterea liniei turn 0
. Fiecare parametru este de forma
type value
Tipul valorii este determinat de tipul parametrului. Toate valorile sunt întregi cu semn pe 32 biţi (mai puţin player_seed
a cărui valoare este un întreg cu semn pe 64 biţi).
: în milisecunde, timpul în care botul trebuie să răspundă după ce i-a fost trimis
ready (timpul maxim de pornire al botului)
*'turntime
: în milisecunde, timpul în care botul trebuie să răspundă pentru fiecare tur (timpul maxim de gândire al botului) : numărul de rânduri ale hărţii
*'cols
: numărul de coloane ale hărţii : numărul maxim de tururi ale jocului
*'viewradius2
: raza de vizibilitate la pătrat : raza de atac la pătrat
*'spawnradius2
: raza pentru colectarea mâncării la pătrat : seedul pentru generarea numerelor aleatoare
După ce toţi parametrii au fost transmişi, se transmite
ready pe o linie separată. După acest punct, botul este liber să se pregăteasca maxim
loadtime milisecunde.
==== Tururi ====
Fiecare tur începe cu una din următoarele linii:
<code>turn turnNo
end</code>
end indică faptul că jocul s-a încheiat iar câştigătorul va primi informaţii legate de ultima stare, în cazul în care doreşte să facă o testare locală.
Dacă jocul s-a încheiat, jucătorii vor primi informaţii legate de numărul de jucători şi scorurile obţinute în următorul format:
<code>players noPlayers
score p1Score … pnScore</code>
Dacă nu s-a încheiat jocul, se vor transmite informaţii referitoare la căsuţele vizibile în următorul format:
<code>
w row col # apă
f row col # mâncare
h row col owner # muşuroi
a row col owner # furnică în viaţă
d row col owner # furnică moartă
</code>
Sfârşitul unui tur este indicat de trimiterea unui
go.
Întotdeauna informaţiile se transmit ca şi când tu eşti jucătorul 0. Primul adversar văzut este jucătorul 1, al doilea este jucătorul 2 ş.a.m.d. Acest lucru asigură faptul că fiecare jucător nu ştie câţi adversari are.
Informaţia despre o căsuţă cu apă va fi transmisă doar prima oara când este vizibilă de către o furnică (pentru a se reduce cantitatea de date transferată).
Fiecare bot va primi informaţii referitoare la furnicile în viaţi, mâncare şi muşuroaie la fiecare tur, în cazul în care căsuţele respective se află în raza vizuală a unei furnici proprii aflată în viaţă. Mâncarea şi muşuroaiele nu se mută, iar informaţiile referitoare la ele vor fi transmise la fiecare tur. Dacă o bucată de mâncare este culeasă sau un muşuroi este distrus, iar acestea se întâmplă în afara razei vizuale a unui jucător, acel jucător nu va fi notificat de cele întâmplate. Când acel jucător va avea din nou vizibilitate asupra acelor căsuţe, nu va mai primi niciun fel de informaţie referitoare la mâncarea ce a fost colectată sau muşuroiul ce a fost distrus.
Se oferă informaţii legate de furnicile ce au murit din cauza unor coliziuni sau unei bătălii la turul anterior doar dacă furnicile respective se află pe o căsuţă vizibilă. Întotdeauna se oferă informaţii referitoare la furnicile proprii care au murit chiar dacă nu se mai află in raza de vizibilitate.
Exemple găsiţi aici: http://aichallenge.org/specification.php#Bot-Input
==== Fog of war ====
Fiecărui bot îi este transmis un parametru la începutul fiecărui joc, parametru ce indică pătratul vizibilităţii fiecărei furnici (cât de mult poate să vadă o furnică împrejurul ei).
La fiecare tur, fiecare bot va primi informaţii pentru căsuţele ce sunt văzute la momentul respectiv de furnicile proprii aflate în viaţă.
==== Distanţa ====
Distanţele sunt folosite pentru vizibilitate, atac şi colectare mâncare. Este oferită raza la pătrat pentru a se evita calculul cu numerele reale.
Distanţele sunt calculate folosindu-se metrica Euclidiană. Pentru două puncte,
a şi
b, distanţa se calculează astfel:
dr = min(abs(a.row - b.row), rows - abs(a.row - b.row))
dc = min(abs(a.col - b.col), cols - abs(a.col - b.col))
distance = sqrt(pow(dr, 2), pow(dc, 2))
Două căsuţe
a şi
b se află la o distanţă
b dacă
distance(a, b) <= r.
===== Formatul de ieşire =====
După ce botul a primit parametrii de la începutul jocului şi a terminat să se pregătească, el indică acest lucru engine-ului prin afişarea
go.
Fiecare bot poate să-şi mute un număr din furniciile proprii într-una din direcţiile nord, sud, est sau vest (dacă destinaţia nu este o căsuţă cu apă). Fiecare mutare se scrie pe o linie separată în următorul format:
<code>row col direction</code>
Numerotarea liniile şi coloanelor începe de la 0, iar direcţiile sunt una din literele
N,
E,
S or
W. La sfârşitul fiecărui tur, botul trebuie să afişeze
go pentru ca engine-ul să ştie că s-a încheiat trimiterea mutărilor.
Exemple găsiţi aici: http://aichallenge.org/specification.php#Bot-Output
==== Blocarea ====
Numai mutarea furnicilor este blocată de apă. Furnicile pot să vadă şi se pot ataca peste apă. Dacă un bot mută o furnică peste o căsuţă cu apă, acea mutare este considerată invalidă si va fi ignorată.
De asemenea şi mâncarea va bloca mutarea furnicilor. Aceasta se întâmplă dacă mâncarea apare lângă o furnică. Dacă furnica nu va fi mutată, atunci acea bucată de mâncare va fi colectată la următorul tur.
==== Coliziunile ====
Se pot muta două furnici proprii în aceeaşi căsuţă. Însă dacă se întamplă acest lucru, ambele furnici vor muri. Dacă o furnică este trimisă către o căsuţă, iar un adversar îşi trimite o furnică către aceeaşi căsuţă, ambele furnici vor muri înainte de a se considera atacul. Acest lucru se poate întâmpla dacă o furnică se naşte lângă un adversar.
===== Formatul hărţii =====
O hartă este reprezentată sub forma unui grid dreptunghiular. Fiecare căsuţă poate conţine pământ, apă, mâncare, o singură furnică aflată în viaţă, mai multe furnici moarte sau un muşuroi. Furnicile se pot afla de asemenea pe muşuroi. Gridul este unul toroidal, adică dacă o furnică se deplasează în sus de pe primul rând al hărţii, ea va apărea pe ultimul rând; analog, se întâmplă pentru toate cele 4 direcţii.
Fişierul ce conţine o hartă este un fişier text obişnuit, doar că are extensia
.map. Fişierul are următorul format:
<code>
rows noRows
cols noCols
players noPlayers
score s1 s2 …
hive h1 h2 …
m [.%*!?a-jA-J0-9]
</code>
Simbolurile au următoarea semnificaţie:
. : pământ
% : apă
* : mâncare
! : furnici moarte
? : teritoriu nevizitat
a-j : furnică
A-J : furnică aflată pe un muşuroi propriu
0-9'' : muşuroi
Hărţile pot să descrie începutul fiecărui tur, excepţie făcând faptul că nu se ştie dacă sunt una sau mai multe furnici moarte pe o căsuţă anume, sau jucătorul ce deţine furnicile.
Pentru jocuri aflate în desfăşurare, hărţile generate sunt folosite pentru a descrie începutul jocului şi folosesc un subset al întregii hărţi. Mâncarea, furnicile şi furnicile moarte nu sunt incluse. Nicio căsuţă nu trebuie sa fie nevăzută. Scorurile şi numărul de jucători nu trebuie sa fie incluse. Hărţile trebuie sa fie simetrice.
Exemple găsiţi aici: http://aichallenge.org/specification.php#Map-Format