Tankide Turniir
Tankide turniir on avalik võistlus, kus igaüks saab kirjutada tankiprogrammi. Tankid võitlevad omavahel ja parim saab võita auhinna. Siit saab alla laadida vajalikud materjalid: http://targotennisberg.com/tankid/
- Log.zip sisaldab viimase võistluse logisid.
- Turniir.zip sisaldab vajalikke programme:
- Tank1.exe - lihtne näidistank, mille vastu enda programmi võib testida.
- Turniir.exe - turniiri käivitamise mootor
- Visualizer.exe - logifailide visualiseerija
Programmide lähtekood on ka saadaval, et asja uurida või mõne teise platvormi jaoks kompileerida.
Kui keegi esitab uue programmi (või senine võistleja esitab uue versiooni oma programmist), jooksutatakse turniiri järgist etappi. Turniiril osalevad uus programm ja eelmise etapi 8 parimat - kokku 9 tanki. Pärast seda panen üles uue edetabeli ja logi, mille põhjal analüüsida, kuidas sinu tankil läks. Teiste tankide lähtekoodi näha ei saa, kõik järeldused tuleb teha logide põhjal. Logide visualiseerija joonistab ka graafilise pildi, kus on näha, mida tankid mingil hetkel tegid.
Küsimuste puhul kirjutage targot@gmail.com
Reeglid
Etapid koosnevad voorudest, mille käigus tankid võitlevad. Võitlusi on kaht liiki: sellised, kus tankid võitlevad üks ühe vastu, ja sellised, kus kõik tankid on korraga väljakul.
Üks voor kestab, kuni
- elus on kas üks tank või mitte ühtegi,
- või tehtud on tuhat (samaaegset) käiku
Igas etapis mängivad kõik osalised omavahel üks ühe vastu 100 vooru ning kõik kõigi vastu 1000 vooru. Kõigi voorude punktid liidetakse.
Väljak
Väljak on juhusliku suurusega ristkülik, mis koosneb ruutudest. Igal ruudul on kõrgus, mis on täisarv 4 kuni 7. Kõrgematelt ruutudelt saab tugevamini tulistada. Nurga- ja servaruudud on üldjuhul madalamad, see tasakaalustab asjaolu, et neid on kergem kaitsta.
Alguses paigutatakse tankid väljakule juhuslikesse asukohtadesse, aga kõik on näoga põhja suunas. Igal tankil on alguses 20 elu.
Käigud
Võitlus on simultaneous turn-based – igaüks ütleb oma käigu ja käigud tehakse korraga.
Võimalikud käigud on:
- Vaatamine mingis suunas.
- Liikumine üks ühik mingis suunas
- Tulistamine mingis suunas
Programmid peavad oma käigud väljastama standardväljundisse. Tähelepanu! Käigu lõppu tuleb panna reavahetus!
Võimalikud suunad on kaheksa ilmakaart – N=0, NE=1, E=2, SE=3, S=4, SW=5, W=6 ja NW=7. Käigud toimuvad järjekorras: kõik liikumised, kõik tulistamised, kõik vaatamised. See tähendab, et kui käigu alguses oli vastane sinu tulejoonel, võib ta sealt enne sinu tulistamist ära sõita ja vaatamise tulemus on käigu lõpu seisuga.
Käigu tegemiseks on aega 0,1 sekundit. Kui selle ajaga käiku ei tehta, siis loetakse sinu tank surnuks ja programmi töö lõpetatakse.
Liikumine
Tank võib liikuda ühe sammu igas kaheksast suunast. Väljakult välja liikuda proovimine jätab tanki paigale. Kui tankid põrkavad kokku, kaotavad mõlemad 3 elu. Kui kokku põrkavad rohkem kui 2 tanki korraga, kaotavad nad ka vastavalt rohkem elusid. Kokkupõrge toimub, kui
- Tank liigub ruudule, kus asub teine tank, kes ei liigu eest ära.
- Kaks tanki püüavad liikuda samale ruudule.
Kokkupõrke järel jäävad tankid oma esialgsele ruudule.
Tulistamine
Tank võib tulistada igas kaheksast suunast. Lasu maksimaalne kaugus on tulistaja kõrgus miinus üks. Korraga võib pihta saada ainult ühele (lähimale) vastasele. Iga pihtasaadud lask vähendab vastase elusid vastavalt lasu kaugusele ja tulistaja kõrgusele. Pihta läinud lask võtab ära <tulistaja kõrgus>-<lasu kaugus> elu. Surnud tanke väljakult ei eemaldata.
Vaatamine
Vaatamine toimub 90-kraadiste sektorite kaupa. Kui vaatad näiteks N suunas, siis näed kõiki tanke, mis asuvad suundades NW kuni NE (diagonaalid kaasa arvatud). Kui vaatad SE suunas, siis näed kõiki tanke, mis asuvad suundades E kuni S jne. Vaatamise kaugus ei ole piiratud.
Punktid
Iga tank saab punkte vastavalt sellele, kui palju ta teisi tanke kahjustada suutis, kas siis tulistamise või kokkupõrgetega.
Kui vooru lõpuks jääb ellu täpselt üks tank, saab ta lisapunkte – üks ühe vastu võitluse eest 10 ja kõik kõigi vastu võitluse eest 20. Voorude punktid liidetakse.
Programmid
Programmid kasutavad standardsisendit ja standardväljundit.
Sisendi esimesel real on 5 tühikutega eraldatud täisarvu:
- Väljaku laius 5<=M<=20
- Väljaku pikkus 5<=N<=20
- Sinu tanki asukoha koordinaadid 1<=X<=M ja 1<=Y<=N. Koordinaadid algavad vasakult alt, väljaku SW nurgas asuv ruut on koordinaatidega 1;1.
- Teiste tankide arv T
Järgmistel N real on igaühel M tühikutega eraldatud täisarvu, mis tähistavad väljaku ruutude kõrgusi. Esimesena on toodud rida nr 1.
Edasi tuleb väljundisse kirjutada üks string, mis tähistab sinu käiku. Vaatamiseks kirjuta väljundisse L<suund>, liikumiseks M<suund> ja tulistamiseks F<suund>, näiteks L0, M5 või F7. Vigast väljundit ignoreeritakse ja sa kaotad oma käigu.
Järgmiseks loe sisendist käigu tulemus. Tulemuseks on ühel real hulk tühikutega eraldatud täisarve. Esimeseks tuleb täisarv, mis näitab sinu allesolevaid elusid. Järgmiseks tulevad T täisarvu, mis tähistavad vastaste alles olevaid elusid. Kui mõni vastane on surnud, on seal 0. Vastaste info on alati samas järjekorras.
- Kui sinu eelmine käik oli vaatamine, tuleb järgmiseks arv P, mis tähistab seda, mitut tanki sa nägid. Edasi tuleb iga nähtud tanki kohta 6 arvu:
- Tanki järjenumber (1 kuni T), mis on nähtud tanki indeks esialgses vastaste nimistus.
- X-koordinaat (1 kuni M),
- Y-koordinaat, (1 kuni N),
- roomikute suund (0 kuni 7), mis näitab kuhu vastane viimati liikus,
- kahuri suund (0 kuni 7), mis näitab, kuhu vastane viimati tulistas.
- periskoobi suund (0 kuni 7), mis näitab, kuhu vastane viimati vaatas.
- Kui sinu eelmine käik oli liikumine, tulevad järgmiseks 2 täisarvu, mis tähistavad sinu asukoha uusi koordinaate 1<=X=M ja 1<=Y<=N.
- Kui sinu eelmine käik oli tulistamine, tuleb järgmiseks 1 täisarv, mis on 0, kui sa kellelegi pihta ei saanud, või arv 1 kuni T, mis tähistab vastase järjenumbrit, kellele sa pihta said.
Kui tank on surnud või voor lõppeb, siis programmi töö lõpetatakse automaatselt.
Testimine
Testimiseks võib kasutada programmi Turniir.exe. Sellele tuleb argumentidena ette anda voorude arv ning kõigi tankiprogrammide nimed. Sama programmi võib ette anda ka mitu korda. Kui tahad katsetada pythoni programmiga, anna turniir.exe-le argumendina ette "python minuprogramm.py" - jutumärgid tuleb ka panna! Turniiriprogramm kirjutab oma tulemuse logifailidesse, mida saab siis uurida. Samuti on logide visualiseerimiseks programm Visualizer.exe, millele saab ette anda logifaili nime, ning mis loob seejärel rea gif-faile, mis võitluse seisu näitavad.
Täiendavad reeglid
Kasutada tohib enda kirjutatud koodi nagu olümpiaadilgi. Mitme koodifaili kasutamine on lubatud, kui tulemust saab mõistlikult kompileerida. Muudest enda loodud (nt teksti) failidest andmete lugemine on lubatud. Teistest failidest lugemine ei ole lubatud.
Failidesse kirjutamine või muul viisil keskkonna muutmine ei ole lubatud.
Programmide esitamine
Saada oma programmi lähtekood targot@gmail.com. Siis ma jooksutan turniiri uuesti, uuendan turniiritabelit ja panen välja viimased logifailid.
Edetabel
Viimase etapi tulemused:
Andres | Daniil | Kalle | Oliver | Rao | Taavet | Targo (näidis) | Toomas | Tähvend | 1:1 kokku | 1:1 korrigeeritud | Kõik kõigi vastu | TOTAL | |
Andres | X | 1457 | 2012 | 2010 | 2618 | 1853 | 2689 | 1911 | 2876 | 17426 | 24977 | 16736 | 41713 |
Daniil | 1153 | X | 645 | 1056 | 1095 | 1963 | 1325 | 1577 | 1806 | 10620 | 15222 | 18313 | 33535 |
Kalle | 532 | 1119 | X | 1125 | 921 | 349 | 821 | 449 | 1480 | 6796 | 9741 | 10411 | 20152 |
Oliver | 1111 | 1986 | 1901 | X | 1735 | 1245 | 2094 | 1475 | 2911 | 14458 | 20723 | 14753 | 35476 |
Rao | 1280 | 2938 | 2607 | 2243 | X | 1084 | 2367 | 1308 | 2958 | 16785 | 24058 | 21317 | 45375 |
Taavet | 2332 | 2145 | 2976 | 2695 | 2674 | X | 2961 | 2423 | 2969 | 21175 | 30351 | 38714 | 69065 |
Targo (näidis) | 1268 | 2844 | 2743 | 2213 | 1795 | 803 | X | 970 | 2916 | 15552 | 22291 | 20028 | 42319 |
Toomas | 2295 | 2369 | 2934 | 2353 | 2635 | 1887 | 2944 | X | 3000 | 20417 | 29264 | 33912 | 63176 |
Tähvend | 317 | 2116 | 1684 | 509 | 485 | 282 | 468 | 244 | X | 6105 | 8750 | 11193 | 19943 |
1:1 voorude summat korrigeeritakse nii, et kokkuvõttes oleks 1:1 ja kõik kõigi vastu voorud võrdse punktisummaga.
Hetkel juhib Taavet.