Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Cvičení k 12.-13. lekci OOP v C# .NET

C# .NET Objektově orientované programování Cvičení k 12.-13. lekci OOP v C# .NET American English version English version

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti programování v C# .NET z minulých lekcí. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulých tutoriálů a pokuste se na to přijít.

Jednoduchý příklad

Vytvořte program, kterému zadáváte stále dokola jednotlivá slova, dokud nezadáte slovo "konec". Program následně vypíše malými písmeny jaká unikátní slova jste zadali. K ukládání slov využijte kolekci List.

Ukázka obrazovky programu:

Konzolová aplikace
Zadej slovo: Na
Zadej slovo: Měsíci
Zadej slovo: neexistuje
Zadej slovo: minulost
Zadej slovo: po
Zadej slovo: které
Zadej slovo: by
Zadej slovo: někdo
Zadej slovo: toužil
Zadej slovo: nebo
Zadej slovo: o
Zadej slovo: které
Zadej slovo: by
Zadej slovo: snil
Zadej slovo: konec
Zadal jsi tato slova: na, měsíci, neexistuje, minulost, po, které, by, někdo, toužil, nebo, o, snil

Středně pokročilý příklad

Vytvořte program pro evidenci automobilů v autobazaru. Autobazar sídlí na určité adrese, má určité peníze v pokladně a obsahuje automobily. Automobil má spz, značku (např. Škoda) a cenu. Autobazar poskytuje metodu pro přidání (odkoupení) automobilu, která odečte jeho cenu z pokladny autobazaru, jelikož byla vyplacena původnímu majiteli automobilu. Dále poskytuje metodu pro prodání (auto z autobazaru zmizí a jeho cena se přičte do pokladny). Poslední metodou v autobazaru je metoda ke zjištění celkové ceny všech automobilů. V autobazaru se vyskytují osobní automobily a nákladní automobily, které mají oproti osobním automobilům navíc ještě vlastnost Nosnost.

Na pokladnu autobazaru vložte 5 000 000 Kč a do autobazaru přidejte pomocí zmíněné přidávací metody následující automobily:

  • Škoda 120, SPZ: 123ABC, Cena: 10 000 Kč
  • Škoda Fabia, SPZ: 456DEF, Cena: 100 000 Kč
  • Ferrari FF, SPZ: 789GHI, Cena: 3 000 000 Kč
  • Tatra 811, SPZ: 534NGS, Nosnost: 20 tun, Cena: 50 000 Kč
  • Renault Midliner, SPZ: 489GSR, Nosnost: 30 tun, Cena: 100 000 Kč

Ukázka obrazovky programu:

Konzolová aplikace
V bazaru je 5 automobilů
Na pokladně je 1740000 Kč
Celková cena automobilů je 3260000 Kč

    class Auto
    {
    }
    class Autobazar
    {
    }
    class NakladniAuto: Auto
    {
    }

Pokročilý příklad

Všichni jistě znáte jednoduchou hru had, populární zejména v éře telefonů Nokia. Had se pohybuje po herní ploše a začíná o délce typicky několika málo dílků. Na ploše se generuje na náhodnou pozici jídlo, které když had sní vstoupením na políčko s jídlem, prodlouží se mu tělo o 1 dílek a jídlo se vygeneruje na novou pozici (mimo tělo hada). Tělo hada je tedy realizováno několika dílky, hlava se vždy posune nějakým směrem a dílky hada se posunou postupně za ní (had se nikdy nezastaví). Hra končí ve chvíli, kdy had vyjede mimo obrazovku nebo kdy narazí do svého těla.

K vytvoření hry budete potřebovat znát několik triků, které jsme si ještě neukazovali. Pojďme to napravit.

Hry fungují obvykle ve smyčce, někdy zvané jako game-loop. Jedná se o cyklus, který neustále provádí 5 operací:

  1. Vymazání obrazovky
  2. Vykreslení scény
  3. Posun objektů
  4. Čekání (aby nebyla hra moc rychlá)
  5. Reakce na stisknuté klávesy

U vaší hry můžete využít následujícího kusu kódu, který se bude nalézat nejpravděpodobněji v Program.cs:

Had had = new Had(); // Instance hada
while (had.Zivy) // Herní smyčka
{
    Console.BackgroundColor = ConsoleColor.Green; // Nastavení zeleného pozadí
    Console.Clear(); // Vymazání konzole
    had.Vykresli(); // Vykreslení hada
    had.Lez(); // Posun hada
    Thread.Sleep(50); // Čekáme 50 milisekund
    // Pokud je stisknuta nějaká klávesa
    if (Console.KeyAvailable)
    {
        ConsoleKeyInfo klavesa = Console.ReadKey(); // Načtení klávesy
        // Reakce na jednotlivé klávesy
        if (klavesa.Key == ConsoleKey.RightArrow)
            had.Smer = 0;
        if (klavesa.Key == ConsoleKey.LeftArrow)
            had.Smer = 180;
        if (klavesa.Key == ConsoleKey.DownArrow)
            had.Smer = 270;
        if (klavesa.Key == ConsoleKey.UpArrow)
            had.Smer = 90;
    }
}

Kód je okomentovaný a měl by být srozumitelný. Pro použití třídy Thread musíme na začátek souboru dodat using System.Threading; V programu nemůžeme použít Console.ReadLine(), jelikož by se vždy čekalo až klávesu odenterujeme, proto zde využíváme vlastnosti KeyAvailable (vrátí zda je možné načíst klávesu). Klávesu poté načteme pomocí Console.ReadKey() do proměnné typu ConsoleKeyInfo.

Tipy

Konzole má standardně velikost 80x25 znaků. Jelikož jsou znaky obdélníkové, je lepší bloky vykreslovat jako 2 obdélníky za sebou, což následně vypadá jako čtverec. K vykreslení obdélníku do konzole na určitou pozici (danou proměnnými X a Y) použijete následující kód:

Console.CursorLeft = X * 2; // Kostku kreslíme jako 2 znaky za sebou, vejde se jich do konzole tedy vodorovně 2x méně
Console.CursorTop = Y;
Console.ForegroundColor = Barva;
Console.Write("██");

Barvám se samozřejmě můžete úplně vyhnout. Pokud je budete chtít používat, mají datový typ ConsoleColor a nabývají hodnot např. ConsoleColor.Yellow.

Co se týká pohybu hada, nejjednodušší je reprezentovat ho jako kolekci kostiček a při každém pohybu mu přidat novou hlavu ve směru jakým leze a smazat ocas. To ve výsledku vypadá jako by se všechny články posunuly.

U všech kolizí stačí kontrolovat zda nenarazila hlava hada.

Začněte tím, že vykreslíte hada do konzole, poté přidejte pohyb.

Ukázka obrazovky programu:

Had v C# .NET

Hru momentálně nelze z důvodu překreslování obrazovky a dynamických vstupů testovat automatickými testy. Vyzkoušejte ji hraním ve svém IDE :)


 

Stáhnout

Staženo 233x (135.01 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
8 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Předchozí článek
Diář s databází v C#
Miniatura
Následující článek
Rozhraní (interface)
Aktivity (12)

 

 

Komentáře
Zobrazit starší komentáře (4)

Avatar
BluPri
Člen
Avatar
BluPri:18.4.2017 20:46

Díky, za odpověď, jen mi vrtá hlavou, proč u mého řešení to bylo potřeba a u zdrojového ne? :-)

 
Odpovědět 18.4.2017 20:46
Avatar
gcx11
Redaktor
Avatar
Odpovídá na BluPri
gcx11:18.4.2017 22:07

Protože máš verzi .NET menší jak 4.0, kde String.Join ještě neumí brát jako parametr IEnumerable<Strin­g>.

 
Odpovědět 18.4.2017 22:07
Avatar
Honza Rada
Člen
Avatar
Honza Rada:4.5.2017 6:14

Další super vymyšlené cvičení ,díky kterému si výborně procvičím učivo z minulïch lekcí hlavně ten had.

Odpovědět 4.5.2017 6:14
#c#
Avatar
Marek
Člen
Avatar
Marek:5.6.2017 20:22

Ahoj, ve chvíli, kdy chci hada zpomalit, tak had téměř nikdy nenačte klávesu (šipku), nevíte, co s tím ?

 
Odpovědět 5.6.2017 20:22
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marek
David Čápka:5.6.2017 20:59

Nesmíš ho zpomalit tak, že tam dáš vteřinové čekání, ale tak, že tam dáš třeba 10 čekání po 100 MS a během toho cyklu co je spouští budeš kontrolovat klávesy :P

Odpovědět  +1 5.6.2017 20:59
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Marek
Člen
Avatar
Odpovídá na David Čápka
Marek:5.6.2017 21:20

Díky za rychlou odpověď!

Může být takto ? Kód funguje, ale nějak se mi nelíbí :-)

for (int i = 0; i <= 4; i++)
                {
                    Thread.Sleep(50);

                    if (Console.KeyAvailable)
                    {
                        klavesa = Console.ReadKey();
                    }
                }
                    if (klavesa.Key == ConsoleKey.RightArrow)
                        had.Smer = 0;
                    if (klavesa.Key == ConsoleKey.LeftArrow)
                        had.Smer = 180;
                    if (klavesa.Key == ConsoleKey.DownArrow)
                        had.Smer = 270;
                    if (klavesa.Key == ConsoleKey.UpArrow)
                        had.Smer = 90;
 
Odpovědět 5.6.2017 21:20
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marek
David Čápka:5.6.2017 23:13

Jo, myslím, že tohle je ok :)

Odpovědět 5.6.2017 23:13
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Marek
Člen
Avatar
Marek:11.6.2017 22:40

Tak ukázkový kód ke třetímu cvičení je opět lepší, než můj. Takže děkuji za inspiraci do budoucna! Jedine co mi přijde, že jsem možná napsal lépe je metoda UmistitJidlo(). V mém případě viz kód níže.

public void VygenerujPotravu()
        {
            Console.Beep(900, 50);
            potrava.X = random.Next(0, 39);
            potrava.Y = random.Next(0, 24);

            foreach (ClanekHada clanek in Telo)
            {
                if (clanek.X == potrava.X && clanek.Y == potrava.Y)
                    VygenerujPotravu();
            }
        }
 
Odpovědět 11.6.2017 22:40
Avatar
Karel Chaloupský:16.10.2017 16:34

Tak koukám že jsem na to zase šel uplně jinak:D Namísto mazání a zapisování si pozic hada jsem proste vytvarel "kostky" dle pohybu a dal jim zivotnost dle délky hada.Takže když had byl dlouhý 5 políček tak po 5 krokách poslední kostce došla životnost a změnila se na prázdne pole.. Navíc jsem nevěděl že to jde vykreslovat do "2d" pole z jedoho pole.. takze jsem mel 2d list.. Overall to fungovalo, ale bylo na tom cítit že dělám až moc operaci na celý cyklus.

 
Odpovědět 16.10.2017 16:34
Avatar
Odpovídá na Karel Chaloupský
Ondřej Čech:18.11.2017 19:44

V klidu, já zas přepisoval souřadnice kostek hada a tím ho tak celého posouval. A obarvil jsem si hlavu aspoň :D
Rozhodně to cvičení bylo výborné a docela mě dalo zabrat ;-)

 
Odpovědět 18.11.2017 19:44
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 10 zpráv z 14. Zobrazit vše