ITI0011:HW02 Droptris

Allikas: Kursused
Redaktsioon seisuga 7. märts 2016, kell 07:20 kasutajalt Ago (arutelu | kaastöö) (→‎Mängu tase)
Mine navigeerimisribale Mine otsikasti

Tagas ITI0011 lehele.

Info

Ülesande kaitsmised: 21. - 25. märts 2016
Kaust gitis: HW01

Ülesanne

Iga-aastane galaktikatevaheline festival "KnownFlyingObject 2016" leiab peagi aset. Osalejaid tuleb palju, erinevatest, khm, galaktikatest. Sulle on antud ülesanne korraldada külaliste sõiduvahendite parkimine. Toimumiskohas on väga piiratud ala: ühel teljel on parkimisala mõõt 10 universumimõõtühikut, teisel teljel 20 sedasamaühikut, kolmanda telje osas täpne info puudub. Sa teed natuke taustauuringut ja selgub, et külaliste liikumisvahendid on õnneks kõik ühel teljel piisavalt väikese mõõduga, mis sobituvad kindlasti parkimisala kolmanda mõõdu sisse ära. Kuna sõidukeid lähtuvalt galaktikatevahelistest nõuetest igal teljel teineteise vastu/otsa/külge ei tohi panna, teed sa järgmised eeldused oma probleemile:

  • parkimisala olulised mõõdud on kaks mõõtu: pikkus ja laius
  • sõidukite olulised mõõdud on samamoodi kaks mõõtu: pikkus ja laius
  • nii parkimisala kui ka sõidukite kolmas telg ei ole oluline, seega võib sõidukite paigutust teostada tasapinnal

Sõltuvalt oma ametiastmest, antakse sulle ka erinev vastutusala. Loe nendest täpsemalt edasi.

Põhiosa: Külalised Oomegalt (2p)

Sa alles alustad oma karjääri. Sinu hoolitseda jääb parkimis"plats" Oomega galaktika külalistele. Nende tehnoloogiaarengud on jõudnud niikaugele, et kõik nende liikumisvahendid on kandilised. Ehk siis sõiduki laius ja pikkus mõlemad on 2 universumis kasutatavat mõõteühikut.

Lisaosa: Külalised Ipad galaktikast (2p)

Sa ei saanudki täpselt aru, mis nende galaktika omadustest põhjustas selle, et neil kõik asjad on piklikud (aga see-eest hea disainiga). Igal juhul külaliste nimekirja lisanduvad sõidukid, mille üks mõõde on 4 ühikut, teine mõõde on 1 ühik.

Parkimine

Parkimisplats asub tähel, kus kehtivad (mõne jaoks) imelikud "füüsika"seadused. Nimelt toimub suurel osal tähe pinnal liikumine vaid sirgjooneliselt - keerata ei ole võimalik. Festivali raames loodi parkimisplatsi sisendalasse eraldi tsoon, milles on võimalik sõidukit keerata ja ümber paigutada. Selles alas tuleb sõiduk õigesti positsioneerida ning vajadusel ka keerata. Peale seda liigub sõiduk sirgjoones platsi teise serva, kuni kas platsi serv või mõni muu sõiduk selle peatab.

Tehniline info

Teil on kasutada Droptrise API, mis annab teile infot olukorra kohta. Teie eesmärk on kirjutada loogika, mis paigutaks API poolt etteantud kujundid võimalikult hästi platsile.

Kujundid

Kujundid tähistatakse ühe tähega. Igat kujundit saab keerata 90 kraadi. Rotatsioon märgitakse numbriga, mitu korda tehakse 90-kraadist pööret paremale. Allpool on toodud ära kõikide kujundite kõikvõimalikud rotatsioonid (rot) ja igaks juhuks kogu kujundi mõõtmed kõrgus x laius(millest osa ruute on tühjad).

O

rot:0
(2x2)
**
**

Kujund on igasuguse pööramise korral täpselt samasugune.

I

rot: 0  rot: 1
(4x1)   (1x4)
*       ****
*
*
*

Mõõtmed (kõrgus x laius): 4 x 1

J

rot: 0  rot: 1  rot: 2  rot: 3
(3x2)   (2x3)   (3x2)   (2x3)
 *      *       **      ***
 *      ***     *         *
**              *

L

rot: 0  rot: 1  rot: 2  rot: 3
(3x2)   (2x3)   (3x2)   (2x3)
*       ***     **        *
*       *        *      ***
**               *

T

rot: 0  rot: 1  rot: 2  rot: 3
(2x3)   (3x2)   (2x3)   (3x2)
 *      *       ***      *
***     **       *      **
        *                *

Z

rot: 0  rot: 1
(2x3)   (3x2)
**       *
 **     **
        *

S

rot: 0  rot: 1
(2x3)   (3x2)
 **     *
**      **
         *

Suhtlemine serveriga

Serveriga suhtlemiseks on kaks varianti: kasutada teile etteantud teeki (ei võimalda kõiki päringuid teha) või kirjutada ise socket-ühendus (lisaosa). Järgnevalt on kirjeldatud erinevad teated, mida on vaja serveriga suhtlemiseks.

Ühenduse loomine

Ühenduse loomiseks tuleb serverile saata uue mängu parameetrid.

Kasutades teeki

<source lang="java"> DroptrisConnection conn = new DroptrisConnection("uniid"); </source>

Kasutades socketit

Ühendus tuleb luua aadressil nisu.cs.ttu.ee kasutades porti 13131.

Mängu alustamiseks tuleb saata järgmine sõnum (json):

{
"uniid": "mati.gaal",
"seed": 12345678
"level": 1
"lookahead": 0 # 0 = can’t see what you get next, 1 = see 1 next block etc.
}

Server vastab näiteks:

{
"message": "Game is starting! Good luck!", # or whatever else message "Unknown message!"
"code": 200
}

Kujundiinfo

Kui ühendus on loodud, hakkab server teatud aja tagant saatma kujundite infot. Selleks peab teie programm lugema serverist infot.

Kasutades teeki

Eelnevalt loodud ühenduse puhul kasutada meetodit readLine(), mis tagastab tulemuse json kujul (vt socketi näidet).

Kasutades socketit

Server saadab info kujul:

{
"block": "I"
"next": ["J", "L", "O"] # nii mitu kui algselt lookaheadiga sai määratud
}

Sellele sõnumile vastama ei pea.

Käigutegemine

Käigu puhul tuleb saata serverile veeru indeks (näitab kujundi kõige vasakpoolsema serve veeru indeksit) ja rotatsioon (vt eelnevalt kujundite sektsiooni).

Kasutades teeki

Kasuta meetodit sendAction(json), kus json on samasugune jsoni String nagu socketi näites allpool.

Kasutades socketit

{
"column": 4
"rotation": 1
}

Mängu skoor

Aktiivse ühenduse puhul on teil võimalus küsida hetke punktiseisu.

Kasutades teeki

Kasutage meetodit readScoreData(), mis tagastab tulemuse json kujul (vt socketi näidet).

Kasutades socketit

Serverisse tuleb saata järgmine päring:

{
"parameter": "score"
}

Server tagastab:

{"value": 1200, "parameter": "score"}

Mänguseis

Teil on võimalus pärida, mis on antud hetkel mänguseis. Mänguseis tagastatakse 20x10 maatriksina.

{
"parameter": "state"
}

Server tagastab:

{"value": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 ..., 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
"parameter": "state"}

Mängu staatus

{
"parameter": "status"
}

Mängu tase

{
"parameter": "level"
}

Server tagastab:

{"value": "12",
"parameter": "level"}

Mängu näide

Programm saadab serverile (mängu näide ei vasta etteantud seed väärtusele):

{
"uniid": "mati.gaal",
"seed": 12345678
"level": 1
"lookahead": 0
}

Server vastab:

{"code": 200, "message": "Game is starting! Good luck!"}

Server saadab kujundi info.

{"block": "Z", "next": ["O"]}

Programm otsustab selle kujundi paigutada vasakule äärde ilma pööramata.

Programm saadab serverile:

{"column": 0, "rotation": 0}

Tekib järgmine seis:

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|11        |
| 11       |
--------------

Mäng jätkub, server saadab uue kujundi:

{"block": "O", "next": ["Z"]}

Programm otsustab selle panna eelmise kujundi kõrvale:

{"column": 3, "rotation": 0}

Tekib seis:

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|11 11     |
| 1111     |
--------------

Mäng jätkub, server saadab uue kujundi:

{"block": "Z", "next": ["I"]}

Programm otsustab selle panna eelmise kujundi kõrvale:

{"column": 5, "rotation": 0}

Tekib seis:

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|11 1111   |
| 1111 11  |
--------------

Mäng jätkub, server saadab uue kujundi:

{"block": "I", "next": ["T"]}

Programm otsustab selle panna eelmise kujundi kõrvale püstiselt (ehk tuleb pöörata)

{"column": 8, "rotation": 1}

Tekib seis:

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|        1 |
|        1 |
|11 1111 1 |
| 1111 111 |
--------------

jne