Abstraktní třídy a výjimky v C#

Abstraktvní třídy narozdíl od normálních tříd nevytváří žádné instance. Obsahují abstraktní metody, ale také normální metody. V abstraktní třídě se nedefinuje obsah. Slouží tedy hlavně pro to, aby se od nich dalo dědit.

Definice Abstraktní třídy

public abstract class AbstaktniTrida{...}

Dědit od abstraktní třídy můžeme pak takto:
public class OdvozenaTrida : AbstraktniTrida {...}
Pomocí příkazu override můžeme metodu, kterou jsme definovali v abstraktní třídě přepsat.

Vyjímky

Vyjímka odchytává chyby, které se stali v našem kódu. Můžeme chytat vyjímky pomocí bloku try and catch. Do try {} se dá část kódu, v které může být problém, když se nesplní spustí se blok s catch{}. Existuje také blok finally{}, který se stane vždy ať už se spustil blok catch či ne. Blok finally slouží hlavně k tomu, aby jsme po sobě uklidili (např. uvolnění paměti).

Dědičnost v Javě

Kdyby Vás zas zajímalo, co zas blbnu s tou fotkou, tak je to motorka Jawa pérák 250 (taky se mu říkalo Pelák) v lince Strakonické fabryky odkud poprvé v roce 1954 vyjela. Přišlo mě to vtipnější než screen kódu v jazyku java… Mimochodem pěkná motorka.

Extends a super

Pomocí extends příkazu podědíme v nové třídě vlastnosti předka. Nová třída nezdědí soukromé a statické metody předka. Pro zavolání konstruktoru předka slouží metoda super();.

 

Abstraktní třída

Abstraktní třída může mít některá data a poskytovat metody, které jsou odvozeným třídám společné. (Příklad abstraktní třída je Obrazec, využívají jej pak třídy obdélník a čtverec.)

 

Polymorfismus

Polymorfismus umožňuje přepsat metodu předka.

Úvod do programovacího jazyka C++

C++ je jazyk vycházející z jazyka c a c+, je to jeho objektová nadstavba. C++ je jazyk, který se používá kvůli tomu, že je rychlý a především, protože má přímý přístup do paměti.

Forma hlavního programu: soubor má koncovku .cpp, musí mít funkci main. int main()-{}, return se v mainu psát nemusí, ale je lepší ho mít a je možné ho upravit – důvod je, aby byla kontrola, zda proběhla cela funkce.

Vypsaní na obrazovku: datové proudy souží k tomu, aby se do nich např. přidal text. K použití proudu je potřeba knihovna geostream (přidáni do programu #include <iostream>)

Direktiva preprocesoru: provádí se předtím než se zaceň kód kompilovat. jmenný prostor std::cout << “ahoj”;  (standart :: znamená, že je to jmenný prostor, který má cout)

Pozn.: Pokud používáme visio studio, je potřeba otevřít systém (“pause”); aby zůstalo okno a čekalo na příkaz zavření.

Odřádkovaní výpisu: iniciace standart std::cout<< std::endl;

Pozn.: Pro to aby se nemuselo psát pořád std, se použije using namespace std; – potr píšeme bez cout::  btw. je objekt.

Příklad použití datového produ:  << pr.: cout<<“ahoj”<<endl

 

Načítaní z klávesnice: slouží “cin” příklad: int a = 8; cin >> a;

Hra piškvorky

Dostal jsem zadání, udělat jednoduché zpracování hry piškvorky pro dva hráče v konzolovém rozhraní.

Zachycení události stisku CTRL+C

Tato metoda funguje tak, že se nastaví ovladač na zachytávání stisku klávesy pomocí funkce Console.CancelKeyPress a následně se vyhodnotí pomocí ConsoleCancelEventArgs, která klávesa byla stisknuta.

Přepínání hráčů

V proměnných hrac1 a hrac2 jsou uloženy jména hráčů, která byla zadána na začátku hry. Zadané jména se navíc různě kontrolují. Defaultně, pokud není nic zadáno, jsou jména hráčů nastaveny na hodnoty hrac1 a hrac2, tím jsou zajištěna jedinečná jména hráčů. To je pak využito v další části kódu pro jejich porovnávání.

Je využívána proměnná aktivnihrac, která střídavě mění hodnotu z hrac1 na hrac2. Jako první vždy začíná hráč 1 (tedy kolečko), tedy první hodnota proměnné ativnihrac je nastavena na hodnotu proměnné hrac2. V cyklu podmíněném podmínkou, že hodnotaGameOver je rovná false (tedy hra pokračuje), se po porovnání aktuální hodnoty proměnnéaktivnihrac a obsahu proměnné hrac2 nastavuje hodnota proměnné aktivnihrac na hodnotu proměnné hrac1, v případě shody hodnot proměnných nebo na hodnotu proměnné hrac2, v případě rozdílu hodnot.

Proč je potřeba kontrolovat délku tahu hráče

Po celou hru jsou zachytávány stisky kláves, které hráči zmáčkli. Z toho důvodu jsem upřednostnil metodu Console.ReadKey, která čte každý jednotlivý stisk klávesy. Ten se vyhodnocuje ve vlastní metodě HandleInput(tah hráče), která vrací v případě v úspěšných kontrol v ní obsažených, řetězec s hodnotou stisknuté klávesy.

Z principu hry hráč nemůže zadat delší tah, než jsou dva znaky. Prvním znakem je X-ová souřadnice a druhým Y-ová souřadnice. Hráč může zadat také jeden znak, např. “?” a vyvolat tím vestavěnou nápovědu.

Při prvním průchodu cyklu se vstupní podmínkou, podle které tah hráče musí být menší než dva znaky, se tvoří řetězec input, který je na začátku deklarován jako prázdny (string.Empty). Proměnná input obsahuje vrácenou hodnotu z HandleInput(tah hráče), pokud délka hodnoty input není 0, přičte se k řetězcové proměnné hractah, který tak změní svou délku z nuly na jeden znak. Následující stisk klávesy, který je zase úspěšně vyhodnocen, změní délku proměnné hractah na dva znaky a vyhodnotí se hráčův tah metodou vyhodnoceni(). Posledním krokem v cyklu je nastavení proměnné hractahna string.Empty. Tím je zabezpečeno opakování cyklu.

Možnosti uložení dlouhých řetězců

Programovací jazyk C# má i jiné možnosti, jak ukládat dlouhé řetězce.

  • Externí txt soubor – můžete založit externí txt soubor a v něm třeba definovat nějaké proměnné, na které se budete z programu odkazovat. Špatné ale je, že program musí mít dobrý přístup k txt souboru a tak musíte dávat pozor, kam si svůj txt soubor uložíte.
  • .resources – je to externí soubor, do který můžete používat v programu, můžete v něm na rozdíl od txt souboru definovat: binární data a data objektu.
  • .dll – soubor .dll je knihovna, kterou si můžete sami vytvořit a dát do nic klidně celé funkce a pak je jen volat z programu, takto se tam dá vložit i dlouhý řetězec

Nejjednodušším způsob manipulace s řetězci, je jejich uložení do proměnné. Tento způsobem jsem zvolil i já, protože počet takových řetězců je minimální, nezohlednil jsem tedy velikost výsledného kódu.

Příklad dlouhého řetězce použitého ve hře piškvorky

Pole řetězců

S polem řetězců se dá zacházet jako s jedním řetězcem. Každý prvek je očíslován a dá se s ním dále pracovat.

Způsob deklarace

string[], hranaté závorky říkají, že definujeme pole, ne jednoduchou proměnnou. Za deklarací typu proměnných v poli se definuje jméno pole řetězců.

Proč jsem použil pole řetězců v mém programu?

Na začátku vývoje hry jsem řešil, jakým způsobem označit jednotlivá políčka hry, jak vyhodnotit výhru hráče, atp. Chtěl jsem také umožnit variabilní velikost pole, s dodržením všech předešlých podmínek.

Souřadnice X a Y hracího pole jsem uložil jako jednotlivé hodnoty pole, dalším možným řešením mohl být např. dlouhý řetězec. Ve hře piškvorky se pole řetězců používá jako legenda, která se zobrazuje na okraji pole. Nejen pro lepší orientaci, ale také pro určení pozic symbolů vložených do pole.

Generování hracího pole z textové grafiky

Nastavil jsem řetězcové konstanty, pomocí kterých definuji ASCII grafiku. Celá tabulka je tvořena jako řetězec formattedString obsahující ASCII grafiku a znaky pro ukončení řádku. Po zadání velikosti hracího pole na začátku hry a podle velikosti okna konzoly je řetězec formattedString tvořen tak, aby byl vypsán horizontálně na střed okna konzoly.

Konvertovací funkce

 

  • Convert.ToInt32(str) – konvertuje řetězec (string) do numerické proměnné (int)
  • ToString() – přemění znak na řetězec
  • ToUpper() – přemění v řetězci malá písmena na velké

Funkce pole IndexOf()

Index of() vyhledá objekt v poli a vrátí první hodnotu výskytu objektu. Vstupní parametry jsou jméno pole a hodnota, kterou chceme hledat. V případě neúspěchu vrátí hodnotu -1.

Tato metoda se používá pro určení souřadnic vkládaného symbolu.

Kontrola tahu hráče (jedna z nich)

Metoda IsValidLetter(string key, string hractah), kdy key je řetězec hráčova aktuálního stisku klávesy a hractah je řetězec, obsahující aktuální hráčův tah. Nejdříve se kontroluje výskyt hráčova stisku klávesy v poli souřadnic hracího pole legenda (jen platné znaky). Zároveň se vyhodnocuje pozice stisknuté klávesy v poli a protože rozměry hracího pole můžou být různé, kontroluje se zároveň, jestli se zadaná hodnota nachází v poli.

Metoda vrací hodnoty true nebo false, podle výsledku kontroly.

Vlákna

Vlákno vytvoří představu toho, že program dělá více věcí v jednom času. V programu piškvorky se takto při výhře spouští melodie a přitom běží program dále. Další příklad použití vlákna by mohl být třeba odpočet času v rohu obrazovky.

Beep

Je funkce, která “pípá”, zahraje zvuk, který můžete slyšet ve hře piškvorky třeba, když hráč vloží správné souřadnice a ukončí tak svůj tah. Defaultně je nastaveno 800 herc a trvání pípnutí 200 milisekund. Toto nastavení ale můžete změnit Console.Beep(herc, trvání pípnutí)

Rozměry pole

Hrací pole ve hře piškvorky má dva rozměry zadané při začátku hry. Stejné rozměry má i dvourozměrné pole, využité jako zrcadlo hracího pole. Rozměry tohoto pole se zpětně získají pomocí mirrortable.GetLength(0), kde je obsažena velikost prvního rozměru pole, tedy šířka a mirrortable.GetLength(1), které obsahuje velikost druhého rozměru pole, tedy výšku.

Čtení a nastavení hodnot pole

Hodnoty v mirrortable jsou nastaveny na “0”. Podle principu: 0 = prázdné pole, 1 = kolečko, 2 = křížek, se do mirrortable zadávají hodnoty 1 nebo 2 na pozice stanovené souřadnicemi X a Y.

Hodnoty pole se čtou podle zadaných indexů. Prvním indexem je 0.

Operátor %

Modulo (%) je typ operátoru, kterým zjišťuje zbytek po celočíselném dělení.

Literatura k programování v C#

 

Zde můžete nalézt seznam literatury, kterou jsem si koupil k tomu, abych se naučil programovat v C#.

Obr.Jan Ružička

-V této knížce naleznete hotová řešení, ale hlavně příklady, které jsou tam moc dobře vysvětlené.

Amedeo Mareš: 1001 tipů a triků pro C# 2010

Obr.Jan Ružička

Tato kniha se mě asi nejvíce líbí. Je napsaná ve stylu kraťoučkých textů, které řeší téměř cokoli v C#. Každý tento text má maximálně půl stránky a zabývá se jen jednou věcí. Je to rozdělené na úrovně, takže si můžete dát pozor, aby jste se hned ze začátku nevrhli do něčeho extrémně těžkého.