DOMÁCÍ ÚKOL 1 – PV178/01 A PV178/06 ROBOT KAREL Robot Karel žije ve svém městě, které se skládá z políček uspořádaných do obdélníkové šachovnice a Karel vždy stojí na jednom z políček natočen směrem k jedné ze světových stran. Výchozí pozice Karla je v jihozápadním rohu na souřadnicích [0,0] a natočením na východ. Robot Karel toho moc neumí: umí udělat krok dopředu, umí se otočit doleva a pozná zeď přímo před sebou (je totiž silně krátkozraký). Má sebou batoh s nekonečnou zásobou značek, umí je na políčka pokládat a poznat, jestli pod ním nějaká značka je. Značky se do sebe nijak neliší, jde jen o jejich počet. 0 0 1 1 2 2 3 3 4 4y x S J VÁŠ ÚKOL 1. Vytvořte konzolovou aplikaci v jazyce C#. 2. Vytvořte třídu pro robotovo město, která bude mít a. vlastnosti pro rozměry města udávané v počtu políček, b. vlastnost, která bude vracet počet políček ve městě, c. metodu, která zjistí, zda je políčko o zadaných souřadnicích neprázdné, d. metody, které přidají nebo odeberou značku s políčka, e. a také platí, že město má vždy alespoň jedno políčko. 3. Vytvořte strukturu Location, která: a. bude mít dvě vlastnosti reprezentující souřadnice ve městě, b. bude mít konstruktor s parametry pro nastavení souřadnic. 4. Vytvořte výčet Orientation reprezentující 4 světové strany, do kterých může být robot natočen. 5. Vytvořte třídu Robot, pro kterou bude platit následující. a. Má vlastnost udávající město, ve kterém se nachází. Při změně města na jiné, se robot přemístí do výchozí pozice [0,0] a otočí na východ. Robot vždy musí být v nějakém městě. b. Má vlastnosti typu Location a Orientation pro určení pozice a umístění robota. Tyto vlastnosti lze změnit pouze metodami třídy Robot nebo jejích potomků. c. Má vlastnost indikující, zda robot stojí před zdí. d. Ve třídě robot implementujte metodu, při které robot udělá krok, tj. posune se o jedno políčko ve směru svého natočení. Nikdy se ovšem nedostane mimo své město. e. Vytvořte metodu, která způsobí, že se robot otočí o 90 ° doleva. f. Dvě metody pro zvednutí a položení značky na políčko pod robotem. g. Robot bude mít vlastnost signalizující, zda na políčku kde stojí je položena nějaká značka. h. Instanci třídy Robot není možné vytvořit. 6. Vytvořte další třídy SmartRobot, StupidRobot a AngryRobot, které se chovají jako robot: a. Pokud chytrý robot udělá krok do zdi, tak si to v posledním okamžiku rozmyslí a místo toho se otočí vlevo. b. Hloupý robot do zdi narazí, což se projeví výpisem na konzoli. c. Rozzlobený robot se otočí o 180 ° a rozběhne se – udělá další 3 kroky. 7. Přepište metody ToString(), aby vracely smysluplné informace a u robotů i jejich názvy. 8. Použijte své znalosti OOP (zapouzdření, polymorfizmu a dědičnosti), abyste dosáhli co nejlepšího a nejkratšího kódu. 9. Chyby robota (náraz do zdi) řešte výpisem na konzoli, chyby při použití tříd v programu (např. špatné parametry) můžete řešit výjimkou. 10. Pro veřejnou část tříd napište jednoduchou dokumentaci. NÁPOVĚDA VLASTNOSTI VS. HODNOTOVÉ TYPY Pravděpodobně se pokusíte napsat následující kód. Kompilátor vám ale ohlásí chybu. public Location Position { get; protected set; } ... Position.X = Position.X - 1; Problém je ve vlastnosti Position na levé straně, vyřešit to můžete například takto: private Location position; public Location Position { get { return position; } } ... position.X = Position.X - 1; Výše uvedený kód nefunguje protože Position je vlastnost a její typ je hodnotový typ. Na levé straně se totiž vlastnost Position vrátí kopii hodnoty a na této kopii je nastavena nová hodnota pro X. Původní hodnota Position změněna není. To ale zcela jistě není to, co jste chtěli. VÝJIMKY V C# V úloze dost možná využijete tyto výjimky:  ArgumentNullException - pokud je hodnota parametru metody null,  ArgumentOutOfRangeException - pokud je hodnota parametru mimo očekávaný rozsah.