Java Challenge második forduló játékszabályai v1.2 Változások a v1.1-hez képest: elírás javítása az űrhajó sebességénél Változások a v1.0-hoz képest: sebességek megadása beadandó projekt követelményeinek pontosítása tesztszerver / éles futtatás lehetséges eltéréseinek pontosítása futtatási környezet pontosítása Környezet A második fordulóban egy bolygóközi csomagszállító űrhajót kell irányítanotok a játékszervernek küldött parancsok segítségével. A bolygók egy síkban vannak, így egy kétdimenziós térképen kell navigálni. A játék során bármikor lekérdezhetők a következő adatok: bolygók neve és pozíciója (x, y) melyik bolygón milyen csomag van hol van az űrhajó és éppen mit szállít Minden csapat ugyanolyan pályán és csomagkészlettel versenyzik, de egymást nem látják, nincsenek egymásra hatással. Időben a pálya nem változik, új csomagok nem keletkeznek, tehát a pálya adatokat elég a játék elején lekérdezni. Az űrhajó a következő alapvető műveletek elvégzésére képes: repülés egyik bolygóról a másikra o az űrhajó mindig légvonalban repül o az űrhajó sebessége állandó (nincs gyorsítás/lassítás), de a szállított csomagok számától függ. Minden plusz csomag ugyanolyan mértékben csökkenti a sebességet. (A tesztszerveren és az éles futtatáskor is használt sebességek: üresen 170 egység/sec, 1 csomaggal 150 egység/sec, 2 csomaggal 130 egység/sec, 3 csomaggal 110 egység/sec) o ha az űrhajó egyszer elindult a célállomás felé, ez a művelet már nem megszakítható, meg kell várni, míg odaér. Az űrhajó menet közben sehol sem áll meg, csak a célállomáson. csomag felvétele: o csak akkor lehetséges, ha van még hely a raktérben o a felvett csomag eltűnik a bolygóról, átkerül a hajó rakterébe o az űrhajó rakterében maximum 3 csomag fér el. csomag lerakása o csak akkor lehetséges, ha az űrhajó a célállomásánál vagy a csomag feladási helyénél van o ha a célállomáson rakjuk le, megkapjuk a szállítási díjat és a csomag eltűnik o ha a feladási helyen rakjuk le, nem kapunk pontot, a csomag visszakerül a bolygóra
A kliens által küldött parancsok, amennyiben megfelelnek a feltételeknek, azonnal végrehajtódnak. A kliens korlátlan számú kérést indíthat a szerver felé, de a kérések közt 500 ms időnek el kell telnie. A játék menete A kezdeti tesztidőszak alatt mindenki elkészítheti a kliensprogramját és kipróbálhatja azt a játékszerveren. A szerver 2 óránként új játékot indít, minden páros órában. Szerver karbantartás miatt előfordulhat, hogy egy-egy forduló kimarad. A tesztidőszak lezárulta után mindenki beadja az elkészített programját, amelyet egy, a tesztszerveren lévőkhöz hasonló pályán futtatunk, 60 perces időkorláttal. A csapatok sorrendjét a futtatás ideje alatt megszerzett pontok száma határozza meg. Holtverseny esetén az a csapat kerül előrébb, amelyik hamarabb érte el az adott pontszámot (hamarabb rakta le az utolsó csomagot). A tesztkörnyezet és az éles futtatás környezete a lehető legjobban hasonlít egymáshoz, de a bolygón lévő egyes csomagokat mindig véletlenszerűen generáljuk. Ha az éles futtatáskor nagyon szoros eredmények születnek, további paraméterek módosításával új futtatást végezhetünk, hogy valóban a jobb (új környezethez jobban alkalmazkodó) algoritmus győzzön. Ilyen esetekben az alábbi paraméterek változtatására lehet számítani: pálya mérete / bolygók pozíciója Az alábbi paraméterek teszten és élesben is megegyeznek: bolygók száma (80) csomagszám / bolygó (30) sebesség 500 ms-os kötelező időköz a kérések között játék időtartama (60 perc) űrhajó kapacitása (3 csomag)
A feladat beadása A feladat beadásakor egy zip fájlt várunk. A zip fájl a következő felépítésű legyen: (egyéb fájlokat/mappákat is tartalmazhat): \ \src\main\java\ \src\test\java\ \target \pom.xml forrásfájlok tesztek ide kerüljön fordítás után a futtatható jar fájl maven pom A zip fájlban lévő projektnek maven 3.1-gyel buildelhetőnek kell lennie, tehát az mvn clean package parancs hatására létre kell jönnie egy darab futtaható jarnak a target mappában. Más jar fájlok ne kerüljenek a target mappába. A lefordított állományokat nem szükséges a beadott zip-be beletenni. A projekteket jdk1.8.0_20-as fordítóval fordítjuk, a maven által használt settings.xml fájl a gyári alapértelmezett. A futtatható jar a következő paramétereket várja: játékszerver URL-je, pl.: https://javachallenge.dorsum.eu felhasználónév jelszó Példa a futtatásra: java -jar test.jar https://javachallenge.dorsum.eu felh felhjelszo A játék végén (503-as hibát kapott a kliens) a programnak le kell állnia. A futtató gép paraméterei: processzor: Intel Core i5 3.3 GHz (4 magos) 2 GB memória érhető majd el a kliens számára (-Xmx) 64 bites operációs rendszer
Java Challenge szerver REST API interfész specifikáció v1.3 Dokumentum célja Ez a dokumentum tartalmazza a második fordulóban használható REST API interfész leírását. Az interfész használata Az egyes API hívásokat kizárólag http(s) protokollon keresztül lehet elérni, POST és GET metódusok használatával. Ha a játék még nem indult el vagy már véget ért, a szerver minden kérésre 503-as hibával válaszol. A szerver túlterhelésének elkerülése érdekében minden kérés között (felhasználónként) legalább 500 ms időnek kell eltelnie. Ellenkező esetben az adott kérés 403-as hibát okoz. GET kérések esetén, kliens oldalon érdemes kikapcsolni a cache-elést az esetleges ebből adódó hibák elkerülése érdekében. Alapértelmezett karakterkódolás az UTF-8. Authentikáció A felhasználók azonosítását http basic authentication segítségével végezzük. Ennek megfelelően GET /JavaChallenge1/rest/ping HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: hu-hu,hu;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Authorization: Basic dhn0dxnlcjpqzwxzem8= Connection: keep-alive Cache-Control: max-age=0 minden kérés fejlécében szerepelnie kell az Authorization mezőnek. Pl.: Szolgáltatások Elérés: /JavaChallenge1/rest/ping Metódus: GET Leírás: Ezzel lehet ellenőrizni a szerver működését. Kérés paraméterek: - Válasz típusa: text Válasz leírása: Normál esetben a válasz: OK
Elérés: /JavaChallenge1/rest/getGalaxy Metódus: GET Leírás: Visszaadja a bolygókat és a bolygókon lévő csomagokat. Kérés paraméterek: - "planets": [<planets>] (List) <planet>: { "name":"amazonia", (String) "x":63.0, (double) "y":6.0, (double) "packages": [<packages>] (List) <package>: { packageid: 1370, (int) originalplanet: "Amazonia" (String) targetplanet: "Stumbos IV" (String) text: "atomreaktor" (String) actualplanet: "Amazonia" (String) fee: 29 (int) Válasz mezők jelentése: planets: az összes bolygót tartalmazó lista name: a bolygó neve (egyedi azonosítója) packages: az adott bolygón lévő csomagok listája packageid: csomagazonosító, később ennek segítségével hivatkozunk a konkrét csomagra originalplanet: a játék kezdetén a csomag ezen a bolygón volt targetplanet: a csomag célállomása actualplanet a csomag aktuális tartózkodási helye. Null, ha a csomagot felvette valaki. fee a csomag szállítási díja, amit akkor kap meg a versenyző, ha a célállomáson lerakja a csomagot Elérés: /JavaChallenge1/rest/go Metódus: POST Leírás: Elindítja a versenyző űrhajóját az adott célállomás felé. Kérés paraméterek: planetname=amazonia (String) A célállomás (bolygó) neve. status: "MOVING", (enum) arriveafterms: 46000, (Integer) destination: "Tarantulon 6" (String) Válasz mezők jelentése: status: a parancs eredményét adja meg. Értéke lehet: ALREADY_MOVING az űrhajó már most is mozgásban van, először meg kell várni az előző mozgás végét NOTHING_TO_DO az űrhajó már most is a megadott célállomáson van UNKNOWN_PLANET ismeretlen bolygónév
MOVING az űrhajó elindult a megadott cél felé arriveafterms: hány ms múlva ér a célhoz az űrhajó (csak akkor nem null, ha a status MOVING) destination: az űrhajó új célállomása (csak akkor nem null, ha a status MOVING) Elérés: /JavaChallenge1/rest/whereIs Metódus: GET Leírás: Megadja az űrhajó aktuális helyét, úti célját, szállított csomagjait. Kérés paraméterek: - username: "testuser", (String) planetname: "Amazonia", (String) targetplanetname: "Amazonia", (String) arriveafterms: null, (Integer) packages: [<packags>] (l. getgalaxy) Válasz mezők username: Felhasználónév. jelentése: planetname: Az a bolygó, ahol a hajó épp van. Ha az űrhajó mozgásban van, akkor null. targetplanetname: aktuális célállomás (ha mozgásban van) arriveafterms: packages: hány ms múlva ér a célhoz az űrhajó (ha mozgásban van) az űrhajón lévő csomagok Elérés: /JavaChallenge1/rest/pickPackage Metódus: POST Leírás: Felveszi a megadott csomagot az űrhajóra. Kérés paraméterek: packageid=995 (int) A felvenni kívánt csomag csomagazonosítója. status: "PACKAGE_PICKED" (enum) remainingcapacity: 2 (Integer) Válasz mezők jelentése: status: a parancs eredményét adja meg. Értéke lehet: PACKAGE_PICKED a csomagot sikeresen felvette NOT_FOUND a megadott csomag nem található LIMIT_EXCEEDED a csomag már nem fér be az űrhajóba (túl sok csomag van már rajta) USER_NOT_ON_THE_PLANET az űrhajó nem azon a bolygón van, ahol a csomag remainingcapacity: a csomag felvétele után még ennyi csomagnak van hely a hajón
Elérés: /JavaChallenge1/rest/dropPackage Metódus: POST Leírás: Lepakolja a csomagot a hajóról. Kérés paraméterek: packageid=995 (int) A letenni kívánt csomag csomagazonosítója. status: "PACKAGE_DROPPED" (enum) scoreincrease: 0 (int) Válasz mezők jelentése: status: a parancs eredményét adja meg. Értéke lehet: PACKAGE_DROPPED a csomagot sikeresen letette NOT_WITH_USER a megadott csomag nincs a versenyző hajóján NOT_AT_DESTINATION a megadott csomag nem a célállomáson van (a kiindulási állomáson is letehetjük a csomagot, de akkor nem jár érte pont) scoreincrease: hány pontot kapott a felhasználó a fuvarért