4. tréningové zadanie - skúška z 19.1.2018 - Indiana Jones

V niekoľkých počítačových hrách je hlavnou postavou dobrodruh Indiana Jones. Aj v tejto hre sa Indiana pohybuje v jaskynnom bludisku (štvorcovej sieti) pomocou šípok, zbiera zlaté mince, pričom v jaskyni môžu byť chodby alebo celé úseky, ktoré ho automaticky presúvajú ďalej (niečo ako bežiace pásy, výťahy, vodopády). Cieľom je odsledovať, kam sa Indiana po zadanej postupnosti šípok dostane, koľko pritom prejde krokov a koľko pritom zozbiera zlatých mincí.

Textový súbor popisuje hraciu plochu (jaskyňu) ako štvorcovú sieť (všetky riadky sú rovnako dlhé). Prvý riadok súboru obsahuje dve celé čísla: rozmery hracej plochy (počet riadkov a počet stĺpcov). Nasledovný počet riadkov obsahuje samotný popis jaskyne , pričom znaky v súbore majú tento význam:

  • '.' voľné

  • 'x' stena

  • '>', 'v', '<', '^' políčka s automatickým posunom: vpravo, dole, vľavo, hore

Nasledovný riadok obsahuje pozíciu Indiana Jonesa ako poradové číslo riadka a stĺpca (číslujeme od 0). Tento sa bude v priebehu hry zobrazovať znakom 'i'. Na začiatku hry stojí indiana na voľnom políčku (znak '.'). Za týmto riadkom až do konca súboru nasledujú dvojice celých čísel, ktoré označujú pozície zlatých mincí. Tieto sa budú počas hry zobrazovať znakom 'o'. Mince sa na začiatku hry môžu nachádzať na ľubovoľných políčkach (okrem štartovej pozície Indiana), t.j. aj na posúvacích políčkach aj na políčkach so stenou (tie sa zrejme nebudú dať zozbierať).

Vašou úlohou je prečítať textový súbor s popisom jaskyne a odsimulovať zadanú postupnosť stláčaných šípok ('l' vľavo, 'r' vpravo, 'u' hore, 'd' dole). Samotný pohyb hráča sa bude riadiť podľa týchto pravidiel:

  • šípka na voľné políčko (prípadne s mincou) presunie hráča (a zdvihne mincu)

  • šípka smerom k stene, resp. za okraj plochy, sa ignoruje (Indiana stojí na mieste)

  • šípka na políčko s posunom (jedno z '>', 'v', '<', '^') spôsobí automatický presun na ďalšie políčko daným smerom, ak je týmto smerom opäť políčko s posunom, znovu sa to opakuje; ak je týmto smerom stena alebo okraj plochy, hráč zastane na tomto políčku; ak sa na niektorých z týchto políčok nachádzali mince, tie sa počas pohybu zdvihnú.

Riešenie zapíšte do triedy IndianaJones s týmito metódami:

class IndianaJones:
    def __init__(self, meno_suboru):
        ...

    def __repr__(self):
        return ''

    def rob(self, postupnost):
        return 0, 0

    def pocet_minci(self):
        return 0

kde

  • metóda __repr__() vráti znakový reťazec, ktorý reprezentuje momentálny stav plochy aj s pozíciou hráča (znak 'i'); s pozíciami všetkých mincí (znak 'o'), pričom medzi riadkami je znak '\n'

  • metóda rob(postupnost) kde parameter postupnost je znakový reťazec s postupnosťou stláčaných šípok (znaky 'l', 'r', 'u', 'd') – hráč sa v ploche pohybuje podľa týchto zadaných príkazov; ak sa daným smerom nemôže pohnúť (okraj plochy, stena), tento konkrétny príkaz sa ignoruje, ak prechádza cez políčko s posunom, tak zrealizuje automatický pohyb; metóda vracia dvojicu čísel: (počet prejdených krokov, počet zdvihnutých mincí); každé volanie tejto metódy vráti len tie počty krokov a mincí, ktoré sa prešli a pozbierali počas tohto volania

  • metóda pocet_minci() vráti momentálny počet mincí, ktoré ešte ostali v hracej ploche.

Napr. pre súbor

5 7
xxxxxxx
xxx.xxx
x.....x
xxx.xxx
xxxxxxx
2 3
2 5
1 3
3 3
2 1

takýto test:

if __name__ == '__main__':
    p = IndianaJones('subor1.txt')
    print(p)
    print(p.rob('udrr'))
    print(p.rob('lldull'))
    print(p.rob('lluudd'))
    print(p)

vypíše:

xxxxxxx
xxxoxxx
xo.i.ox
xxxoxxx
xxxxxxx
(4, 2)
(6, 2)
(0, 0)
xxxxxxx
xxx.xxx
xi....x
xxx.xxx
xxxxxxx

Alebo pre súbor

3 9
....>>>>v
........v
.....<<<v
0 0
0 5

takýto test:

if __name__ == '__main__':
    p = IndianaJones('subor2.txt')
    print(p)
    print('pocet minci =', p.pocet_minci())
    print(p.rob('rrrr'))
    print(p)
    print(p.rob('lr'))
    print(p)
    print('pocet minci =', p.pocet_minci())

vypíše:

i...>o>>v
........v
.....<<<v
pocet minci = 1
(10, 1)
....>>>>v
........v
.....<<<i
(6, 0)
....>>>>v
........v
....i<<<v
pocet minci = 0

Z úlohového servera L.I.S.T. si stiahnite kostru programu skuska.py. Pozrite si testovacie dáta v súboroch 'subor1.txt', 'subor2.txt', 'subor3.txt', …, ktoré bude používať testovač.

Aby ste mohli spúšťať skúškové testy, program uložte do súboru skuska.py. Riešenie (bez dátových súborov) odovzdajte na úlohový server https://list.fmph.uniba.sk/.

Praktická časť končí o 11:00 a skúška pokračuje od 12:00 vyhodnotením v kancelárii m162.