Bomber, part II.

knižnica ncurses a práca s grafikou v konzole

Motivácia

Na minulom cvičení sme vygenerovali mesta a bombardér dokázal (v režime kosačka) úspešne pristáť. Dnes sa však pokúsime vyriešiť ostatné drobnosti, ktoré z aktuálnej verzie urobia reálnu hru. A obyvatelia mestečka sa začnú mať naozaj bombovo!

Ciele

  1. Pracovať s knižnicou curses.

Postup

Krok #1: Warmup

V prvom kroku si pripravíme prostredie na zvládnutie cvičenia. Ak ste náhodou minulý týždeň niečo nestihli, rovno si stiahnete pripravený projekt, ktorý obsahuje ukážkové riešenie minulého cvičenia. Okrem toho však zabezpečíte, aby sa hra skončila v prípade, že bombardér narazí do budovy.

Úloha 1.1

Z nasledovnej linky si stiahnite hotové zadanie.

V prostredí OS Linux môžete pre stiahnutie použiť príkaz wget v tvare:

wget http://it4kt.cnl.sk/c/pvjc/2015/resources/src/week.09/bomber.c

Úloha 1.2

Preložte program a overte jeho funkcionalitu.
Ak ste postupovali správne, bombárder preletí cez celú mapu (v režime kosačka) a po úspešnom pristátí sa na obrazovke vypíše správa "Well Done!":
+-------------------------------------------------+
|                                                 |
|                                                 |
|                                                 |
|                                                 |
|                                                 |
|                                                 |
|                   Well Done!                    |
|                                                 |
|                                                 |
|                                                 |
|                                                 |
|                                                 |
|                                             ^==-|
+-------------------------------------------------+

Úloha 1.3

Aktualizujte implementáciu hernej slučky tak, aby sa hra ukončila s výpisom reťazca "Game Over" do stredu obrazovky vtedy, keď bombardér narazí do budovy.

Tento fragment kódu umiestnite do hernej slučky.

// check collision with building
if (x > 0 && x < COLS-5 && y == LINES-world[x-1]) {
    mvprintw(LINES/2, COLS/2 - 5, "Game over!");
    mvprintw(y, x, " ****");
    refresh();
    getchar();
    endwin();
    return EXIT_SUCCESS;
}

Krok #2: Dropping the Bomb

Ovládanie z klávesnice

Ak ste postupovali správne, máte pred sebou hru, ktorá sa dá hrať, a ktorá sa dá aj vyhrať.

Úloha 2.1

Zabezpečte, aby sa hra ukončila vtedy, keď hráč stlačí kláves Q resp. q.

Načítavanie kláves v režime knižnice curses zabezpečíte volaním funkcie getch(). Funkcia vráti kód načítanej klávesy ako hodnotu typu int bez toho, aby program zastavila v jeho vykonávaní.

Keďže kláves Q nebude jediný, ktorý pre ovládanie hry budeme používať, pre obsluhu stlačených kláves použite priamo príkaz switch.

Zoznam funkčných kláves a ich reprezentáciu v jazyku C ako aj možnosti nastavenia správania načítavania kláves si môžete zobraziť v manuálovej stránke k funkcii.

Poznámka:  Ak vám chýbajú manuálové stránky pre knižnicu curses vo vašom virtuálnom stroji, môžete si ich doinštalovať príkazom:
sudo apt-get install ncurses-doc

Kód umiestnite do hernej slučky.

// handle user input
int input = getch();
switch(input){
    case 'q': case 'Q':{
        mvprintw(LINES/2, COLS/2 - 5, "Quit Game");
        refresh();
        getchar();
        endwin();
        return EXIT_SUCCESS;
        break;
    }
}

Úloha 2.2

Zabezpečte, aby pri stlačení kurzorovej šípky dolu bombardér vypustil bombu.

Pri lete bomby sa riaďte týmito pravidlami:

  • Bomba padá rovnakou rýchlosťou ako bombardér letí.
  • Bombardér vie naraz vypustiť len jednu bombu (na obrazovke sa nesmie nachádzať, resp. nesmie padať viac bômb ako jedna).
  • Pokiaľ pod bombou nie je žiadna budova, bomba letí dovtedy, kým nezmizne z obrazovky.
  • Pokiaľ pri padaní bomba natrafí na budovu, zničí max. 4 poschodia (každé v jednej iterácii cyklu hernej slučky - nie naraz)

Kód kurzorovej šípky dolu je v knižnici curses definovaný ako KEY_DOWN.

Pred hernou slučkou najprv inicializujte premenné týkajúce sa bomby:

// bomb initialization
bool is_bomb_dropped = false;
int bomb_x;
int bomb_y;
int bomb_counter;

Následne pri stlačení kurzorovej šípky dolu inicializujte vlastnosti bomby, ak už táto náhodou neletí:

case KEY_DOWN:{
    if(is_bomb_dropped == false){
        is_bomb_dropped = true;
        bomb_x = x + 1;
        bomb_y = y;
        bomb_counter = 4;
    }
    break;
}

Nakoniec aktualizujte hernú slučku tak, aby v prípade, že bomba je vypustená, táto postupne padala a ničila všetko, čo jej stojí v ceste (v zmysle uvedených pravidiel):

// update bomb
if(is_bomb_dropped == true){

}

Krok #3: Fire in the Hole!

V tomto kroku naprogramujete strieľanie.

Úloha 3.1

Dávka z predného guľometu, keď stlačí medzerník.
Hra sa zastaví. Dávku je možné vystreliť do vzdialenosti max 5 znakov od lietadla v smere letu. Dávkou je možné rozstrieľať všetky budovy do vzdialenosti 5 znakov.

Úloha 3.2

Overte správnosť svojej implementácie.

Krok #4: Game Info

V tomto kroku naprogramujete skóre a počet striel v guľomete.

Úloha 4.1

Vytvorte počítadlo skóre a počtu dávok do guľometu bombardéru a ich aktuálny stav vypíšte do stavového riadku hry.

Úloha 4.2

Za každé poschodie zasiahnuté bombou pripočítajte 5 bodov.

Úloha 4.3

Za každé poschodie zasiahnuté dávkou z guľometu pripočítajte 15 bodov.

Úloha 4.4

Overte správnosť svojej implementácie.

Doplnkové úlohy

  1. Pridajte do hry farby. Každá (celá) budova nech má inú náhodnú farbu. Lietadlo, guľomet a bomba nech majú svoje vlastné farby.
  2. Pridajte do hry možnosť prerušenia hry (Pause), ak hráč stlačí p/P.
  3. Pridajte do hry možnosť zobrazenia nápovedy (samostatná obrazovka), ak hráč stlačí h/H.
  4. Pridajte do hry úvodnú obrazovku s menu.
  5. Pridajte do hry rolujúci text (horizontálny, v smere sprava doľava), ktorý sa bude bežať počas celej hry v najspodnejšom alebo najvrchnejšom riadku hry.
  6. 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ý).

Diskusia

Upozornenie: Do svojich príspevkov nevkladajte správne riešenia úloh a ani ich od ostatných nežiadajte! Nepoužívajte sprosté slová! Takéto príspevky budú zmazané! Riaďte sa podľa pravidiel etického kódexu.