Webterv Nyomorékság

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 5

Web tervezés 2024 - 6.

házi feladat
Általános tudnivalók
Az elkészített php fájlt vagy fájlokat tömörítve, zip formátumban kell feltölteni. A zip csak az elkészített PHP
fájlokat tartalmazza, más egyebet ne.
A feladat beadható a bíró által jelzett határidőig, legfeljebb a bíró által jelzett alkalommal.
Amennyiben egy részfeladat tesztelése közben végzetes hiba keletkezik, akkor az adott részfeladat további
tesztjei nem futtathatóak. Az esetleges hibaüzenetek az errors.txt fájlban megtekinthetőek.
A szintaktikai hibás program garantáltan 0 pontot ér.
A feltöltések közül a legmagasabb pontszámú számít.
A bíró által adott pontszám felülbírálására utólag nincs lehetőség.
A program outputja az stdout.txt-ben megtekinthető, míg a hibaüzenetek az errors.txt fájlban találhatók.
A kiértékelés eredménye a riport.txt-ben megtekinthető, ahol látható, hogy melyik részfeladaton hány
pontot sikerült elérni.
A bírón 7.4.33-as verziójú PHP verzió fut.

Pontszámítás
A házi feladatra legfeljebb 4 pont szerezhető, amelyet úgy számítunk, hogy a Bíró által adott pontot elosztjuk 150-
nel.

A Bíró a programot 10 tesztesetre futtatja, amelyekre egyenként legfeljebb 100 pontot ad (összesen 1000), így a
maximális 4 pont megszerzéséhez 600 pontot kell elérni. Aki ennél több pontot ér el, annak a 600 ponton felüli részt
extra pluszpont ként (lásd: követelmények) számoljuk el. Ez azt jelenti, hogy ha a bíró 900 pontot ad, akkor az a
házi feladatra 4 pontot ér, és ezen kívül jár 2 extra pluszpont.

Részpont szerezhető.
Álomhurok
STORY
A lángfű-erdő egy mágikus hely, ahol számos élőlény él, köztük a fénykavarók. A lángfű-erdőben teremnek a
lángfüvek, amelyek minden évben virágzáskor lángokba borítják az erdőt. A fénykavarók a föld közelében élnek,
nem tudnak fára mászni sem, így ki vannak téve minden évben a lángfüvek virágzásának, amiben sajnos a 90%-uk
elpusztul. A fénykavarók a kihalás szélén állnak, évről évre egyre kevesebben vannak.

Egyetlen reményük, hogy túljutnak az álomhurok veszedelmességén, és megszerzik az időszakító kristályt. Az


álomhurok egy veszedelmes labirintus, amelyben található az időszakító kristály. Az időszakító kristály segítségével
ki tudják magukat szakítani a térből arra az időre, amíg a lángfüvek virágzása tart, így az nem tesz kárt sem
bennük, sem az otthonaikban.

STORY
Azonban az álomhurok egy veszedelmes hely. Amint belép valaki, mögötte a bejárat azonnal lezárul, és már csak
úgy tud kijutni, ha megtalálja a kijáratot, ami már önmagában is nehéz feladat. Emellett viszont az időszakító
kristályt is meg kell találni a labirintus végtelen falai között. Az idő azonban fogy, mert az álomhurok védői, az
álommanók amint észreveszik a betolakodókat, beindítják a csapdákat, amelyek a földből emelkednek fel és
megölik a bátor vállalkozót, bárhol is legyen az álomhurokban. Szóval sietni kell.

Tudsz segíteni a fénykavaróknak, hogy túljussanak az álomhurok veszedelmességein és megtalálják az időszakító


kristályt, és még időben kijussanak a hurokból, mielőtt az álommanók megölik őket?
Cél
Célunk, hogy kijuttassuk a fénykavarót az álomhurok labirintusából. A labirintus olyan magas, hogy nem látjuk az
egészet (így a méretét sem tudjuk), csak onnan tudunk szétnézni a 4 irányba, ahol éppen állunk. Mind a 4 irányban
meg tudjuk állapítani, hogy milyen messze látunk el, a célunk, hogy ez alapján tájékozódjunk a labirintusban, és
megtaláljuk a kijáratot. Minden lépés alkalmával 1 mezőnyi távolságot kell megtennünk, majd utána újra szétnézünk.

További célunk, hogy megtaláljuk az időszakító kristályt, amelyet szintén minden lépés után megvizsgáljuk, hogy
látjuk-e.

A labirintusban az alábbi mezők fordulhatnak elő:

Fal: a falakon nem látunk át, és nem is lehet a falra lépni. A labirintus falakkal van körülvéve.
Fű: ezek azok a mezők, amelyeken mozoghatunk, ide szabadon léphetünk
Item: az a füves terület, amely az időszakító kristályt tartalmazza. Amint rálépünk erre a mezőre,
hagyományos füves területté változik, a kristályt pedig onnantól kezdve cipeljük magunkkal.
Bejárat: a labirintus bejárata, ahonnan indulunk. Ez biztos a labirintusnak valamelyik szélén található. Amint
ellépünk róla, a növények belepik, tehát "fal" lesz onnantól kezdve a helyén, többször már nem tudunk oda
visszamenni.
Kijárat: a labirintus kijárata, célunk, hogy ide elérjük. Ha a kijárat felé nézünk, akkor akármilyen messze
ellátunk, innen tudjuk, hogy kijutottunk (viszont az első lépésnél a bejárat esetében ugyanez igaz).
Fénykavaró osztály
A Fenykavaro osztály egy fénykavarót reprezentál, aki elég bátor volt ahhoz, hogy bemenjen az álomhurokba. Az
osztálynak két metódusa van, az init és a step . Az osztályt természetesen tetszőleges (nem statikus)
adattagokkal és metódusokkal bővíthetjük.

init() metódus
Amikor a fénykavaró a labirintusba lép, akkor ez a metódus fog meghívódni. Itt végezhetünk el mindenféle
inicializációt, amire szükségünk van. A metódus 2 paramétert vár: min és max .

min: ha optimálisan haladunk, akkor ennyi lépéssel tudunk kijutni a labirintusból úgy, hogy az időszakító
kristályt is felszedjük. Elképzelhető, hogy hamarabb is ki lehet jutni, de csak akkor, ha az időszakító kristályt
nem vesszük fel, tehát a labirintusban hagyjuk.
max: legfeljebb ennyi lépés áll rendelkezésünkre, különben meghalunk.

step() metódus
Ez a metódus minden lépésben meghívódik, amíg el nem jönnek az álommanók (azaz elérjük a maximális
lépésszámot) vagy ki nem juttattuk a fénykavarót. Paraméterként egy asszociatív tömböt kap, amely leírja, hogy a
fénykavaró melyik irányban mit lát. A metódusnak egy szöveget kell visszaadnia, ami megmondja, hogy a következő
lépésben melyik irányba szeretnénk 1 mezőnyit elmozdulni.

State tömb

A step metódus paraméterben egy asszociatív tömböt kap, aminek az alábbi kulcsai vannak: up , down ,
left , right és item . Az első négy (up, down, left, right) megmondja, hogy az adott irányba hány mező
távolságig látunk el (pl. ha 3 mező távol van egy fal, akkor 2 mezőt látunk magunk előtt). Az item egy további
asszociatív tömb, amely azt mondja meg, hogy hol található az időszakító kristály. Ennek két kulcsa van
( direction (melyik irány: UP, DOWN, LEFT, RIGHT), illetve distance (hány mező távolságnyira található az
adott irányban)). Amennyiben nem látjuk a jelenlegi pozíciónkból a kristályt, akkor az item kulcshoz tartozó érték
NULL lesz.

PÉLDA STATE TÖMB


['up' => 6, 'down': INF, 'left': 0, 'right': 0, item: ['direction': 'UP',
'distance': 3]
Ez a játék kezdetén fordulhat elő. Itt felfelé 6 mezőnyi távolságra látunk, míg lefelé a végtelenségig (mert most
lépünk be a labirintusba), balra és jobbra mellettünk falak vannak. A kristály előttünk van, 3 mezőnyi távolságra.

PÉLDA STATE TÖMB


['up': 0, 'down': 2, 'left': 1, 'right': 1, 'item': NULL]
Ebben a példában előttünk fal van, míg mögöttünk 2 üres mező, balra és jobbra pedig 1-1 üres mező. A kristály az
aktuális mezőről nem látható.

Visszatérési érték

A step metódusnak 4 féle visszatérési értéke lehet: UP , DOWN , LEFT vagy RIGHT , attól függően, hogy
merre szeretnénk mozogni. Hibás visszatérési érték (vagy érvénytelen lépés) esetén ugyanazon a pozíción maradunk,
ahol a megelőző körben voltunk, továbbá büntetőpontot kapunk.
Pontozás
Összesen 10-féle lehetséges labirintus létezik, amelyben a fénykavarók az időszakító kristályt keresik. Mindegyik
labarintusban legfeljebb 100 pont érhető el, az alábbiak szerint:

Sikeres kijutás: 50 pont.


Időszakító kristály megtalálása: 25 pont sikeres kijutás esetén, 10 pont sikertelen kijutás esetén.
Idő bónusz: 25 pont (25 pont jár a lehetséges leggyorsabb (vagy annál gyorsabb (kristály nélküli)) kijutásért,
0 pont a maximális idő kihasználásáért, a kettő között lineárisan interpolálva).
Büntetés: érvénytelen lépésenként -1 pont.

Az adott labirintusra kapott pontszám ezeknek az összege lesz. A kapott pontszám 0 alá nem csökkenhet.

PÉLDA L ABIRINTUS

A lila jelöli a kezdő pozíciót, a kék a célt, a piros a kristályt, a sárga a füves területeket, míg a fekete a falakat. Ebben
a labirintusban a helyes útvonal: 'UP', 'UP', 'UP', 'DOWN', 'DOWN', 'LEFT', 'LEFT', 'LEFT',
'UP', 'UP', 'LEFT', 'UP', 'UP', 'LEFT', 'LEFT', 'UP', 'LEFT', 'UP', 'UP', 'RIGHT',
'RIGHT', 'RIGHT', 'RIGHT', "RIGHT", "RIGHT", "RIGHT", 'UP' .

MINTA.ZIP
A minta.zip-ben található 3 fájl.

A feladat.php tartalmazza a kiegészítendő osztályt, ezt lehet bővíteni és feltölteni bíróra.


A pelda.php segítségével lehetőség van lokális tesztelésre. A fájl elején lévő startGame
függvényben van a játék inicializálva, ez szabadon átírható ( min, max, map ), hogy másik tesztesetet
kapjunk. A Fenykavaro osztály a fájl 210. sorában található (amelyet bővítenünk kell). Ezt a fájlt is
nyugodtan feltölthetjük bíróra.
Az input.txt tartalmazza a fenti térképet (amely a példákban és a pelda.php fájlban is szerepel),
akár ezt is használhatjuk tesztelésre, vagy új térképek létrehozására.

Sok sikert, a fénykavarók számítanak rád! 🥺

You might also like