Sokoban - transform!

Ciele

  1. Pracovať s knižnicou curses.
  2. Využiť predchádzajúce vedomosti pri implementácii riešenia.

Úvod

Na tomto cvičení budete pokračovať v práci s knižnicou curses. Tiež pretransformujete robota Karla na Sokobana.

Postup

Krok č. 1

V prvom kroku vykonáte všetky potrebné kroky, ktoré sú potrebné pre pretransformovanie aktuálnej verzie vašej implementácie robota Karla na Sokobana. Zmeny sa týkajú klávesových skratiek, ako aj nových prvkov, ktoré sa môžu v miestnosti zobraziť. Taktiež správanie niektorých existujúcich prvkov bude zmenené.

Úloha 1.1:

Na klávesy KEY_DOWN a KEY_RIGHT namapujte pohyb dolu a pohyb vpravo a premapujte klávesu KEY_LEFT na pohyb vľavo.

Sokoban sa bude pohybovať priamo o pozíciu vpred/vzad/vľavo/vpravo. Nebude teda potrebné mať samostatnú klávesovú skratku pre jeho otočenie vľavo alebo vpravo. Samozrejme ale na otočenie sokobana môžete použiť funkciu turnLeft() a následne volať funkciu movek().

Ak ste vo svojej implementácii počítali kroky, ktoré spravil robot Karel, aktualizujte taktiež svoj kód tak, aby rátal všetky kroky vpred/vzad/vľavo/vpravo, ale nerátal za krok otočenie sokobana vľavo.

Úloha 1.2:

Aktualizujte funkciu turnOn() tak, aby vedela rozpoznávať aj znaky '*', '.' a '$'.
Význam uvedených znakov je nasledovný:
  • znak '$' reprezentuje krabicu (box), ktorú má Sokoban presunúť na cieľové miesto
  • znak '.' reprezentuje miesto, kam má Sokoban dotlačiť krabicu (box)
  • znak '*' reprezentuje krabicu, ktorá sa nachádza na cieľovom mieste
Pre ich reprezentáciu môžete opäť vhodne využiť vlastné makrá.

Úloha 1.3:

Aktualizujte funkciu movek() tak, aby Sokoban vedel posúvať krabice, ktoré sa pred ním môžu nachádzať.
Ak sa pred Sokobanom bude nachádzať krabica, bude ju Sokoban vedieť posunúť o jednu pozíciu vpred.
Počiatočná situácia:
#####
#   #
# $ #
# ^ #
#####
Koncová situácia:
#####
# $ #
# ^ #
#   #
#####
Nezabudnite pri svojej implementácii taktiež na to, že krabica sa môže presunúť na cieľovú pozíciu alebo ju môžete presunúť z cieľovej pozície. V tomto prípade dôjde len k zmene jej zobrazenia vo funkcii draw()
Počiatočná situácia:
#####
# . #
# $ #
# ^ #
#####
Koncová situácia:
#####
# * #
# ^ #
#   #
#####
Sokoban vie naraz posunúť len jednu krabicu. Ak sa teda pred Sokobanom budú nachádzať dve krabice súčasne, nepohne ani s jednou z nich.
Počiatočná situácia:
#######
#     #
# $$< #
#######
Koncová situácia:
#######
#     #
# $$< #
#######

Úloha 1.4:

Otestujte správnosť svojej implementácie na nasledujúcej mape.
                        char* map = "---####|---#--#|---#--#|---#$.#|####--#|#-----#|#@$.--#|#######";
                    
Grafická reprezentácia uvedenej mapy je nasledujúca:
   ####
   #  #
   #  #
   #$.#
####  #
#     #
#>$.  #
#######

Krok č. 2

V tomto kroku aktualizujete stavový riadok a taktiež zareagujete na aktuálny stav hry.

Úloha 2.1:

Rozšírte stavový riadok o informáciu ohľadom celkového počtu krabíc, ktoré sa v miestnosti nachádzajú a taktiež o informáciu, koľko krabíc ešte zostáva presunúť alebo koľko ich už bolo presunutých na cieľové miesto.
Stavový riadok môže vyzerať nasledovne:
CORNER  FACING  DELIVER STEPS
(1,6)   East      0/2     0
čo v tomto prípade znamená, že na cieľovom mieste sa ešte nenachádza žiadna krabica.

Úloha 2.2:

Po presunutí všetkých krabíc na cieľové miesto vypíšte na obrazovku správu informujúcu o úspešnom ukončení hry a hru ukončite.
Počiatočná situácia:
CORNER  FACING  DELIVER STEPS
(1,6)   East    2/2     0
   ####
   #  #
   #  #
   #$.#
####  #
#     #
#>$.  #
#######
Koncová situácia:
CORNER  FACING  DELIVER STEPS
(2,6)   East    0/2     29
   ####
   #  #
   #  #
   # *#
####  #
#     #
# >*  #
#######
Well done

Doplňujúce úlohy

  1. Pridajte do hry rolujúci text (horizontálny, v smere zprava doľava), ktorý sa bude bežať počas celej hry v najspodnejšom riadku hry, poprípade rolujúci text môže bežať iba pri zobrazenom menu, ktoré budete implementovať budúce cvičenie.
  2. Po ukončení hry zobrazte na obrazovke záverečné kredity. Efekt zobrazovania si môžete zvoliť sami (napr. vo forme filmových tituliek zdola nahor alebo postupným zobrazovaním jednotlivých správ alebo ľubovoľný iný).
$Id$