IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: OOP úkol z lekce 4: Procházení (středně pokročilý příklad)

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Václav Pešek:31.10.2021 23:51

Úlohu jsem naprogramoval. Neříkám, že by nesnesl optimalizaci ... Veškeré testy mnou provedené mi vycházejí dobře, ale automatická kontrola mi neprochází. Neprošel mi žádný ze tří testů. Např. hlásí, že již na prvním řádku očekává slovo "Dům", já tam dům mám, ale kontrolní program tam vidí jiný text ... Zdrojáky:

package cz.itnetwork.prochazeni;

/**
 * @author va057280
 */
public class Prochazeni {
    public static void main(String[] args) {

        // Iniciace lokalit
        Lokace lokalita1 = new Lokace("Hrad");
        Lokace lokalita2 = new Lokace("Les");
        Lokace lokalita3 = new Lokace("Lesní rozcestí");
        Lokace lokalita4 = new Lokace("Les");
        Lokace lokalita5 = new Lokace("Rybník");
        Lokace lokalita6 = new Lokace("Les");
        Lokace lokalita7 = new Lokace("Dům");

        // Vazby
        lokalita1.lokaceVychod = lokalita2;
        lokalita2.lokaceZapad = lokalita1;
        lokalita2.lokaceVychod = lokalita3;
        lokalita3.lokaceZapad = lokalita2;
        lokalita3.lokaceVychod = lokalita4;
        lokalita3.lokaceJih = lokalita6;
        lokalita4.lokaceZapad = lokalita3;
        lokalita4.lokaceVychod = lokalita5;
        lokalita5.lokaceZapad = lokalita4;
        lokalita6.lokaceSever = lokalita3;
        lokalita6.lokaceVychod = lokalita7;
        lokalita7.lokaceZapad = lokalita6;

        // Iniciace pomocných proměnných
        boolean konec = false;

        // Výchozí lokalita
        Hra hra = new Hra (lokalita7);

        // Cyklus hry
        do {
            // Výpis aktuální lokality
            hra.vypisAktualniLokalitu();
            // Zadej příkaz
            hra.zadejPrikaz();
            if (hra.pozadovanaLokalita == null) {
                konec = true;
            } else {
                hra.aktualniLokalita = hra.pozadovanaLokalita;
            }
        } while (!konec);
    }
}

------ LOKACE.JAVA

package cz.itnetwork.prochazeni;

/**
 * @author va057280
 */
public class Lokace {
    //public int cisloLokality;
    public String nazev;
    public String popis;
    public Lokace lokaceSever;
    public Lokace lokaceJih;
    public Lokace lokaceZapad;
    public Lokace lokaceVychod;

    public Lokace (String aNazev) {

        this.nazev = aNazev;
        this.lokaceSever = null;
        this.lokaceJih = null;
        this.lokaceZapad = null;
        this.lokaceVychod = null;

        switch (aNazev) {
            case "Hrad":
                this.popis = "Stojíš před okovanou branou gotického hradu, která je zřejmě jediným vchodem do pevnosti. Klíčová dírka je pokryta pavučinami, což vzbuzuje dojem, že je budova opuštěná.";
                break;
            case "Les":
                this.popis = "Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího slunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků.";
                break;
            case "Lesní rozcestí":
                this.popis = "Nacházíš se na lesním rozcestí.";
                break;
            case "Rybník":
                this.popis = "Došel jsi ke břehu malého rybníka. Hladina je v bezvětří jako zrcadlo. Kousek od tebe je dřevěná plošina se stavidlem.";
                break;
            case "Dům":
                this.popis = "Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line z hromady vedle vstupních dveří.";
                break;
        }
    }

    @Override
    public String toString() {
        String smery = "";
        if (this.lokaceSever != null) {
            smery = "sever ";
        }
        if (this.lokaceJih != null) {
            smery = smery + "jih ";
        }
        if (this.lokaceZapad != null) {
            smery = smery + "západ ";
        }
        if (this.lokaceVychod != null) {
            smery = smery + "východ";
        }
        return String.format("%s\n%s\n\nMůžeš jít na %s\n\nZadej příkaz:", this.nazev, this.popis, smery);
    }
}

------ HRA.JAVA

package cz.itnetwork.prochazeni;
import java.util.Scanner;
/**
 * @author va057280
 */
public class Hra {
    Lokace aktualniLokalita;
    String pozadovanySmer;
    Lokace pozadovanaLokalita;

    public Hra (Lokace aAktualniLokalita) {
        this.aktualniLokalita = aAktualniLokalita;
    }

    public void vypisAktualniLokalitu () {
        System.out.println(this.aktualniLokalita);
    }

    public Lokace zadejPrikaz () {
        boolean platnyPrikaz = false;
        boolean spravnySmer = false;
        boolean konec = false;
        this.pozadovanySmer = "";
        this.pozadovanaLokalita = null;
        Scanner sc = new Scanner(System.in, "Windows-1250");
        do {
            //System.out.println("Zadej příkaz:");
            String​ vstup = sc.nextLine();
            if (vstup.equals​("jdi na sever")) {
                platnyPrikaz = true;
                this.pozadovanySmer = "sever";
                if (aktualniLokalita.lokaceSever != null) {
                    pozadovanaLokalita = aktualniLokalita.lokaceSever;
                    spravnySmer = true;
                }
            } else if (vstup.equals​("jdi na jih")) {
                platnyPrikaz = true;
                this.pozadovanySmer = "jih";
                if (aktualniLokalita.lokaceJih != null) {
                    pozadovanaLokalita = aktualniLokalita.lokaceJih;
                    spravnySmer = true;
                }
            } else if (vstup.equals​("jdi na západ")) {
                platnyPrikaz = true;
                this.pozadovanySmer = "západ";
                if (aktualniLokalita.lokaceZapad != null) {
                    pozadovanaLokalita = aktualniLokalita.lokaceZapad;
                    spravnySmer = true;
                }
            } else if (vstup.equals​("jdi na východ")) {
                platnyPrikaz = true;
                this.pozadovanySmer = "východ";
                if (aktualniLokalita.lokaceVychod != null) {
                    pozadovanaLokalita = aktualniLokalita.lokaceVychod;
                    spravnySmer = true;
                }
            } else if (vstup.equals​("konec")) {
                platnyPrikaz = true;
                //this.pozadovanySmer = "konec";
                konec = true;
            } else {
                System.out.println("Můj vstupní slovník neobsahuje tento příkaz.");
                platnyPrikaz = false;
                spravnySmer = false;
                konec = false;
            }

            if ((!spravnySmer) && (!konec) && (platnyPrikaz)) {
                System.out.println("Tímto směrem nelze jít.");
            }

        } while (((!platnyPrikaz) || (!spravnySmer)) && (!konec))  ;

        if (konec) {
            pozadovanaLokalita = null;
        }
        return pozadovanaLokalita;
    }
}

Zkusil jsem: Při svém testování jsem "prošel" všechny lokality. Program v mám prostředí reaguje správně na správné i nesprávné pokyny,

Chci docílit: Zjistit, kde dělám chybu (pokud ji dělám). Zjistit, co mám udělat, aby kontrola prošla úspěšně.

 
Odpovědět
31.10.2021 23:51
Avatar
Odpovídá na Václav Pešek
Matúš Olejník:1.11.2021 10:55

Ahoj, bolo by fajn keby pošleš aj znenie zadania

Nahoru Odpovědět
1.11.2021 10:55
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Václav Pešek:1.11.2021 11:01

Zadání je uvedeno na odkazu: https://www.itnetwork.cz/…op-reference
Jde o druhý (středně pokročilý) příklad.
děkuji za zájem.
Václav

 
Nahoru Odpovědět
1.11.2021 11:01
Avatar
Odpovídá na Václav Pešek
Matúš Olejník:1.11.2021 11:04

Nie je za čo, ale ja 5 rokov robím v Jave takže nemám kúpené prémium Java články tuto na stránke a nevidím dané zadanie.

Nahoru Odpovědět
1.11.2021 11:04
/* I am not sure why this works but it fixes the problem */
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.11.2021 11:04

Muzes pridat link na tu lekci? (ve tvem kodu neni zadny test, takze tezko odpovedet na otazku, proc ten test hlasi, ze prvni musi byt dum)

A proc nepouzijes pro seznam lokaci pole, list?
Proc zacinas cislovani jednickou? lokace1 misto lokace0

nasel jsem jiny dotaz, asi na stejny ukol...
https://www.itnetwork.cz/…f3caf6c73371
https://www.itnetwork.cz/…ge-collector

 
Nahoru Odpovědět
1.11.2021 11:04
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.11.2021 11:06

Matúš Olejník - take na te strance vidim prd, bez zakoupeni.

 
Nahoru Odpovědět
1.11.2021 11:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.11.2021 11:09

Mne tak napada, kdyz zada vychozi lokalitu dum, co a kde nastavujes do aktualniLokalita jako vychozi lokaci?

public class Hra {
    Lokace aktualniLokalita;

Edit: Ha, slepej, uz to vidim. Ted je jen otazka, zda se to take vypise na obrazovku.

// Výchozí lokalita
Hra hra = new Hra (lokalita7);
Editováno 1.11.2021 11:10
 
Nahoru Odpovědět
1.11.2021 11:09
Avatar
Odpovídá na Matúš Olejník
Václav Pešek:1.11.2021 21:30

Ještě jednou vám děkuji za zájem. Níže zasílám zadání. Přiznám se, že jsem očekával, že se ozve někdo, kdo disponuje (provozuje, spravuje - Unicornu) ten testovací program, který mi tvrdí, že mé řešení je nesprávné...
ZADÁNÍ:
Naprogramujte jednoduchou textovou hru, která obsahuje následujících 7 propojených lokací:

obrázek je v příloze;

Cvičení k Java OOP – Mapa k textové hře
Každá lokace má název a textový popis, tato data budou následovat dále. Každá lokace má také referenci na 4 okolní lokace (tedy na lokaci na severu, jihu, západě a východě). Vytvořte herní svět z takto propojených lokací podle obrázku výše. Následně aplikaci naučte přijímat v cyklu příkazy od uživatele. Příkazy jsou:

jdi na [strana], např. "jdi na východ" - Jde na určitou světovou stranu
konec - Ukončí aplikaci

Použijte následující názvy lokací a jejich popisy včetně zachování odřádkování. Odpovídají lokacím v obrázku (zleva doprava, shora dolů):

Název Popis
Hrad Stojíš před okovanou branou gotického hradu, která je zřejmě jediným vchodem do pevnosti.
Klíčová dírka je pokryta pavučinami, což vzbuzuje dojem, že je budova opuštěná.
Les Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího
slunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků.
Lesní rozcestí Nacházíš se na lesním rozcestí.
Les Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího
slunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků.
Rybník Došel jsi ke břehu malého rybníka. Hladina je v bezvětří jako zrcadlo. Kousek
od tebe je dřevěná plošina se stavidlem.
Les **Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího
slunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků.
**Dům
Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line
z hromady vedle vstupních dveří.

Počáteční lokace je lokace Dům.

Při pokusu o přechod na neplatnou lokaci program vypíše "Tímto směrem nelze jít."

Při zadání neplatného příkazu program vypíše "Můj vstupní slovník neobsahuje tento příkaz."

 
Nahoru Odpovědět
1.11.2021 21:30
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Václav Pešek
Alesh:1.11.2021 21:57

Problém je v tom, že pokud zadáš chybný příkaz nebo směr, tak tobě to v tu chvíli nevypisuje kde jsi a kam můžeš jít.

Tvoje řešení:

Dům
Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line z hromady vedle vstupních dveří.

Můžeš jít na západ

Zadej příkaz:
test
Můj vstupní slovník neobsahuje tento příkaz.

Správné řešení:

Dům
Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line
z hromady vedle vstupních dveří.

Můžeš jít na západ

Zadej příkaz:
test
Můj vstupní slovník neobsahuje tento příkaz.
Dům
Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line
z hromady vedle vstupních dveří.

Můžeš jít na západ
 
Nahoru Odpovědět
1.11.2021 21:57
Avatar
Odpovídá na Alesh
Václav Pešek:2.11.2021 21:24

Alesh, děkuji za nápovědu. Nikde jsem sice v zadání nenašel pokyn, že by se měla aktuální lokalita vypsat znovu, ale budiž. Doplnil jsem tedy příkaz pro vypsání aktuální lokality:

} else {
                System.out.println("Můj vstupní slovník neobsahuje tento příkaz.");
                platnyPrikaz = false;
                spravnySmer = false;
                konec = false;
                this.vypisAktualniLokalitu();
            }

            if ((!spravnySmer) && (!konec) && (platnyPrikaz)) {
                System.out.println("Tímto směrem nelze jít.");
                this.vypisAktualniLokalitu();
            }

... ale test opět neprošel. Test oznámil:

*Testy, které neprošly:

  1. Test: "Zkus projít všechny lokace podle zadání"

Řádek: 1
Očekáváno: Dům
Nalezeno: ----------
Řádek: 4
Očekáváno: Můžeš jít na západ
Nalezeno: ^^^^^^^*

Závěr: :-(
S pozdravem Václav

 
Nahoru Odpovědět
2.11.2021 21:24
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Václav Pešek
Alesh:2.11.2021 23:05

No, a zkusils to? ;-)
Nechce se mi to zase zkoušet, ale už aspoň část testů prošla?

 
Nahoru Odpovědět
2.11.2021 23:05
Avatar
Václav Pešek:4.11.2021 17:26

No jasně, že jsem to zkusil. Výsledek stejně negativní. Hele, v pohodě. Nech to být. Škoda času. Mě program funguje, vypisuje co chci, a to že mi to automat vyhodnotí špatně, mě sice mrzí (nevím proč), ale důležité to (aspoň v tuto chvíli) zase tak není. Horší by bylo, kdyby se to opakovalo u jiných příkladů.
Václav

 
Nahoru Odpovědět
4.11.2021 17:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.11.2021 7:51

Ono jde o to, ze v zamestnani takove podobne testy na program budou a tam by bylo dobre, aby to vyhovelo, pokud je to nejaky rozumny test :) Muze se stat, ze test je zbytecne prisny. To pak je o tom, co schvali vedouci projektu.

Jestli spravne chapu tu napovedu, tak je mozne, ze se nejaky smer spatne vyhodnoti. Nejaka lokace treba neni dostupna z nejakeho smeru nebo nevypise, ze se tam neda jit. Proste bych zkusil z lokace vsechny smery, zda to vypise, ze se tam neda jit nebo nic nebo to crashne. Kdyz byl prvni problem, ze to nevypsalo ten DUM.

 
Nahoru Odpovědět
5.11.2021 7:51
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Václav Pešek
Alesh:8.11.2021 13:25

Tak jsem to našel v čem je problém. V těch popisech musí být zalalování řádků, tedy např. místo:

"Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího slunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků."

musí být:

"Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího\ns­lunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků."

switch (aNazev) {
    case "Hrad":
        this.popis = "Stojíš před okovanou branou gotického hradu, která je zřejmě jediným vchodem do pevnosti.\nKlíčová dírka je pokryta pavučinami, což vzbuzuje dojem, že je budova opuštěná.";
        break;
    case "Les":
        this.popis = "Jsi na lesní cestě, která se klikatí až za obzor, kde mizí v siluetě zapadajícího\nslunce. Ticho podvečerního lesa občas přeruší zpěv posledních ptáků.";
        break;
    case "Lesní rozcestí":
        this.popis = "Nacházíš se na lesním rozcestí.";
        break;
    case "Rybník":
        this.popis = "Došel jsi ke břehu malého rybníka. Hladina je v bezvětří jako zrcadlo. Kousek\nod tebe je dřevěná plošina se stavidlem.";
        break;
    case "Dům":
        this.popis = "Stojíš před svým rodným domem, cítíš vůni čerstvě nasekaného dřeva, která se line\nz hromady vedle vstupních dveří.";
        break;
}
 
Nahoru Odpovědět
8.11.2021 13:25
Avatar
Odpovídá na Alesh
Václav Pešek:14.11.2021 21:38

Moc děkuji za hledání "chyby". Pokud si vzpomínám, kopíroval jsem ten předmětný text ze zadání. Nezkoumal jsem blíže tyto stringy ... po kompilaci mi to hlásilo chybu, tak jsem řetězec "vyčistil" od netisknutelných znaků. To možná byla chyba, pravděpodobně tenkrát kompilátor hlásil asi jinou chybu ....
Ještě jednou díky.
Václav

 
Nahoru Odpovědět
14.11.2021 21:38
Avatar
Alesh
Tvůrce
Avatar
Odpovídá na Václav Pešek
Alesh:14.11.2021 21:47

No, tohle je prostě taková chyba "nechyba", prostě hledáš, co se validátoru nelíbí, beru to jako takovej kvíz. :-) Tohle šlo docela vyčíst z toho, co nalezl/očekával.
Jinak pokud bereš problém jako vyřešený, je dobré vlákno uzavřít.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
14.11.2021 21:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.