Textový projekt 2

V predchádzajúcej kapitole sme vytvorili nový projekt, definovali sme základné stavy a zabezpečili ich výstup. Teraz postúpme o krok ďalej. Oživme kostru hry. Na to, aby hra dokázala reagovať na podnety hráča, musí prijímať vstupy. Na zabezpečenie vstupu použijeme funkcionalitu naprogramovanú v triede Vstup. V konštruktore deklarujeme reťazec príkaz, do ktorého budeme pomocou metódy načítajReťazec načítavať príkazy hráča:

String príkaz;
príkaz = načítajReťazec("Príkaz");

Táto dvojica riadkov spôsobí, že sa na obrazovke objaví nasledujúci automatický výpis výzvy pre hráča:

Príkaz (reťazec): 

Po nej program čaká na zadanie textu a jeho potvrdenie klávesom Enter. Teraz potrebujeme rozpoznať „príkazy“ zadávané hráčom. Najjednoduchšie pre hráča by bolo, keby zadal a potvrdil jednoducho tú postavu, ktorá sa má previezť na druhý breh (vlk, koza, kapusta). Tomu prispôsobíme aj výzvu a namiesto textu „Príkaz“ sa hráča spýtame: „Čo má prievozník previezť?“. (So skloňovaním odpovede: vlka, kozu, kapustu, sa nebudeme zaoberať.)

Dobrým zvykom je definovať na každý celistvý a dostatočne elementárny úkon samostatnú metódu. V súlade s tým vytvoríme samostatnú metódu na analýzu odpovede na otázku „Čo má prievozník previezť?“ Metódu naprogramujeme tak, aby zároveň spolu s analýzou vykonala aj odozvu (bude to komplexná metóda). Prijme reťazec zadaný používateľom, ktorý bude považovať za objekt určený na prevezenie na druhú stranu. Bude sa riadiť aktuálnou polohou prievozníka. Základná kostra metódy teda bude vyzerať takto:

private void prevez(String čo)
{
    if (prievozníkJeNaPravomBrehu)
    {
 
    }
    else
    {
 
    }
}

Keď je prievozník na pravom brehu, budeme vyhľadávať zadaný objekt v poli pravýBreh, v opačnom prípade v poli ľavýBreh. Úkon vyhľadávania je tiež dostatočne elementárny, takže je vhodné umiestniť ho do samostatnej metódy prijímajúcej reťazec a vracajúcej index prvku zhodného so zadaným reťazcom:

private int nájdiNaPravomBrehu(String čo)
{
    for (int = 0; < pravýBreh.length; ++i)
    {
        if (čo.equalsIgnoreCase(pravýBreh[i])) return i;
    }
 
    return -1;
}

Metóda v cykle prehľadá pole (pre pravý breh je to pravýBreh), na hľadanie použije metódu equalsIgnoreCase triedy String, ktorá porovnáva reťazce ignorujúc veľkosť písmen. Keď zadaný reťazec v poli nenájde, vráti hodnotu -1, čo signalizuje stav „nenájdené“. Inak získame index prvku, kde bol reťazec nájdený. Podobne definujeme aj metódu nájdiNaĽavomBrehu.

Obidve metódy potom využijeme v rámci metódy prevez, konkrétne v štruktúre jednoduchého vetvenia if-else. Keď je prievozník na pravom brehu, hľadáme zadaný objekt na pravom brehu a na ľavom brehu budeme hľadať prázdne miesto ("nič"):

int = nájdiNaPravomBrehu(čo);
int = nájdiNaĽavomBrehu("nič");

Na základe hodnôt, ktoré získame volaním metód nájdiNaPravomBrehunájdiNaĽavomBrehu, vykonáme výmenu prvkov medzi poľami ľavýBrehpravýBreh a presunieme prievozníka na opačnú stranu rieky (zmeníme hodnotu premennej prievozníkJeNaPravomBrehu). Musíme však najskôr vyriešiť prípady, keď niektorá z hľadaných hodnôt nebola nájdená (to znamená, že buď sa na pravom brehu nenachádza objekt, ktorý zadal hráč a ktorý máme uložený v argumente čo, alebo na ľavom brehu už nie je voľné miesto "nič"):

if (== -1)
{
    System.out.println("Na ľavom brehu nie je " + čo + ".");
}
else if (== -1)
{
    System.out.println("Na pravom brehu nie je voľné miesto.");
}
else
{
    ľavýBreh[j] = pravýBreh[i];
    pravýBreh[i] = "nič";
    prievozníkJeNaPravomBrehu = !prievozníkJeNaPravomBrehu;
}

Celú túto viacnásobnú podmienku spolu s hľadaním objektov na brehoch (pozri dva riadky kódu vyššie) musíme umiestniť do hlavnej vetvy metódy prevez (na mieste, ktoré zvýrazňuje komentár):

private void prevez(String čo)
{
    if (prievozníkJeNaPravomBrehu)
    {
        /*# SEM! */
        // int i = …
        // …
        // if (i == -1…
    }
    else
    {
 
    }
}

Do vedľajšej vetvy (else) naprogramujeme protipól celého bloku. Získame kompletnú metódu prevez, ktorú môžeme využiť v konštruktore:

private VlkKozaKapusta()
{
    String príkaz;
 
    vypíšStav();
    príkaz = načítajReťazec("Čo má prievozník previezť?");
    prevez(príkaz);
    vypíšStav();
}

Ak teraz po spustení hry zadáme a potvrdíme reťazec „koza“, dostaneme takýto výstup:

 
Na ľavom brehu je:
Na pravom brehu je: [prievozník] vlk koza kapusta
Čo má prievozník previezť? (reťazec): koza
 
Na ľavom brehu je:  [prievozník] koza
Na pravom brehu je: vlk kapusta

Opäť, ak by ste mali problém so skompletizovaním príkladu, nájdete ho v prílohe.

Príloha 4 – druhá fáza textového projektu

Zobraziť | Prevziať