Našli ste masívnu dieru v trhu Stredozeme! Všetci tu stále len chodia a chodia a chodia, ale to by nemuseli keby tu existovala pošta. A to treba využiť!. Bohužiaľ ale nie ste jediní, ktorých toto napadlo.
Ste majiteľom poštovnej služby v Stredozemi. Vašou úlohou je samozrejme doručovať listy a zarobiť tak čo najviac peňazí. Stredozem vyzerá ako obdĺžnikový grid, kde niektoré políčka sú nepriechodné, pretože sa tam zakempili škrati. Na začiatku hry máte $200 000$ peňazí a nič iné.
Hra pozostáva z $600$ kôl, v každom viete robiť $3$ typy akcií: - V každom kole vám príde niekoľko objednávok - listov ktoré by obyvatelia Stredozeme potrebovali doručiť. - Vy na každý z nich môžete ponúknuť cenu, za ktorú by ste ho doručili a termín doručenia. - Keď list doručíte, dostanete ponúknutú cenu. - Za meškanie pri doručení platíte každé kolo pokutu. - No ale na doručovanie listov sú potrebné kone. Tie si tiež viete kupovať. - V obchode ponúkajú niekoľko koní, ktoré majú rôzne vlastnosti a ceny. - Rovnakého koňa môžete kúpiť viackrát za kolo. - Kúpený kôň sa budúce kolo objaví na vašom spawnpointe. - A ešte viete robiť akcie koňmi - každý kôň môže každé kolo vykonať maximálne jednu akciu z nasledujúcich: - Pohnúť sa na iné políčko. - To, kam sa vie pohnúť je obmedzené jeho rýchlosťou a plnosťou. - Pri pohybe kôň hladne. - Najesť sa. - Dá sa vykonať iba na stanici a stojí peniaze podľa parametrov stanice a množstva jedla. - Nabrať list. - Ak sa nachádza na políčku s listom, môže ho zobrať. - Vyhodiť list. - Ak má list, môže ho hodiť na zem. - Ak je toto políčko cieľové políčko listu, list je doručený a dostanete zaň peniaze.
Posledných $100$ kôl hry sa už neobjavujú nové objednávky, ale ešte sa môžu doručiť tie, ktoré už boli. Ak budete niekedy mať menej ako $0$ peňazí, zbankrotujete a prehrávate. (to môže spôsobiť jedine pokuta)
Mapa je obdĺžnikový grid. Niektoré jej políčka sú nepriechodné. Priechodné políčka majú rôzne vlastnosti: - Stanica - Na políčku sa môže nachádzať stanica - miesto, kde sa dajú nakŕmiť kone. - Je parametrizovaná jednotkovou cenou jedla. - Populácia - Určuje očakávaný počet objednávok v každom kole, ktoré začínajú alebo končia na tomto políčku. - Spawnpoint - Každý hráč má svoj spawnpoint, kde sa objavujú jeho nové kone.
Vzdialenosti na mape sa počítajú ako Manhattanovská vzdialenosť na priechodných políčkach.
Na začiatku každého kola sa objaví niekoľko objednávok, na ktoré viete dávať ponuky. Každá objednávka má: - Štartovacie políčko - Políčko, odkiaľ list odosielajú. - Cieľové políčko - Políčko, kam treba list doručiť. - Dôraz na cenu - Dôraz na termín
Hráči potom môžu na každú objednávku podať ponuku, ktorá obsahuje: - Cena - Koľko peňazí chcete za doručenie. - Termín - Dokedy list doručíte.
Objednávateľ si pre každý list vyberie na doručenie hráča, ktorý minimalizuje
cena * dôraz na cenu + termín * dôraz na termín
. Ak sa táto hodnota rovná
viac hráčom, vyberie sa náhodne. Ak nikto nepodá ponuku, objednávka sa
nevykoná.
Po tom, ako je hráčova ponuka vybraná, objaví sa mu list na doručenie. List má: - Polohu - Polohu, kde sa list nachádza. Na začiatku je to štartovacie políčko objednávky. - Cieľovú polohu - Polohu, kam treba list doručiť. - Cenu - Koľko peňazí dostanete za doručenie. - Termín - Kedy treba list doručiť. Ak sa to dovtedy nepodarí, každé kolo ste pokutovaní stratou peňazí. - Špecificky, ak je $k$ dní po deadline, stratíte $50 \cdot k^2$ peňazí. Túto sumu strácate každé kolo, kým list nedoručíte.
Kone slúžia na doručovanie listov. Jeden kôň môže v jednom momente niesť nanajvýš jeden list.
Sú parametrizované týmito vlastnosťami: - Rýchlosť - Maximálna vzdialenosť, ktorú môže prejsť za kolo. - Spotreba sena - Koľko jedla potrebuje na jeden krok (teda ak sa pohne v jednom kole o viac políčok, táto hodnota sa násobí vzdialenosťou). - Kapacita - Koľko sena sa mu zmestí do žalúdka.
Okrem toho má v jednom momente kôň aktívne tieto premenné:
- Pozícia - Poloha na mape.
- Plnosť - Koľko jedla má v žalúdku.
- List - List, ktorý nesie, prípadne None
ak žiadny nenesie.
O svojich koňoch poznáte všetky tieto hodnoty. Nepoznáte ale plnosť a listy ostatných hráčov.
Na spustenie treba:
- runner: Dostanete vo Foyer
- server: Dostanete vo Foyer alebo skompilujete pomocou cargo build --release
- bota
- config.json
a games.json
Hra sa spúšťa príkazom ./runner config.json games.json
. Týmto sa začne
simulácia ťahov a v priečinku hra
sa objaví záznam z hry. V priečinky
hra/logs
sa nachádzajú logy botov (to čo vypíšete na stderr) a servera.
Súbor observer.gz
slúži na prehranie hry na observeri.
V oboch jazykoch treba implementovať triedu Bot
, ktorá má jednu funkciu
take_turn
. To sa bude diať v súboroch player.cpp
a player.py
. Iné
súbory neodporúčame prepisovať, môže sa vám všetko rozbiť.
Metóda take_turn
vracia objekt Turn
, do ktorého viete pridávať akcie
volaním jeho metód, viď header. K dispozícií
máte tiež nejaké informácie o hre v štruktúre World
.
Pred spustením na serveri treba bota skompilovať. To sa robí jednoducho
príkazom make
v koreňovom priečinku vášho bota.
Týmto príkazom sa tiež vytvorí archív player.zip
, ktorý treba nahrať na
proboj web.
Metódia take_turn
taktiež vracia objekt Turn
, volaním jeho funkcií viete
vykonávať akcie. Informácie o hre sa nachádzajú v premennej world
typu
World
vo vašom botovi.
Keď chcete bota nahrať na proboj web, stačí spustiť v priečinku
players/python
príkaz make
, ktorý vytvorí archív player.zip
, ktorý treba
na web nahrať.
V oboch jazykoch sme si pre vás pripravili pomocné funkcie, ako napríklad BFS.
Ak vás zaujímajú presnejšie informácie, môžete ich nájsť v pričikoch
players/cpp/internal
alebo players/python/proboj
.