FerryBoat (Delegáty)
FerryBoat (Delegáty)
Naprogramujte hru na "převozníka".
Zvolte libovolnou dotnetovou technologii:
- Windows Forms
- WPF
- Konzolová appka
- Webová appka (ASP.NET MVC)
- Xamarin (?)
Pokud jde o architekturu, rozdělte hru minimálně na 3 moduly (třídy):
- Modul Game zapouzdří celou aplikační logiku hry, může obsahovat i GUI, anebo může být GUI mimo tento modul a používat pouze jeho API.
- Modul GameEngine, tedy jeho instance bude "podobjektem" objektu Game a implementuje jádro celé hry, tj. to, o co v ní vlastně jde. Viz dále.
- Modul Referee bude opět součástí modulu Game a implementuje "rozhodovací část" hry, tj. GameEngine se přes API modulu Referee pomocí delegátů bude dotazovat, zda nový stav hry je "možný" (validní, legální). Viz dále.
Nejprve ukázka, jak jedna z implementací takové hry může vypadat:
- Stáhněte si na lokální počítač soubor puzzle.swf.
- Hra je napsaná v technologii Adobe Flash, která se ovšem nyní už nesmí používat kvůli bezpečnostním rizikům.
- Otevřete si v prohlížeči tuto stránku: https://ruffle.rs/demo/
- Nahoře máte tlačítko "Browse...", které otevře dialog pro výběr SWF souboru, který se má spustit.
- Vyberte soubor puzzle.swf, který jste si předtím stáhli.
- Popis hry je v čínštině, ale stačí kliknout na největší modré tlačítko (kulaté).
- Objeví se skupinka lidí na břehu řeky a vor. Vor se ovládá páčkami s červenou hlavou.
- Vaším úkolem je přepravit všechny lidi na druhý břeh řeky. A minimalizovat počet "přejezdů" řeky.
-
Postavy hry (lidé):
- tatínek
- dva chlapečci
- maminka
- dvě holčičky
- policista
- nezletilý darebák neurčitého pohlaví
-
Je to logická hra. Má svá pravidla:
- Na vor se vejdou maximálně dva lidé. Přepravit je na druhý břeh vám hra dovolí pouze v případě, že aspoň jeden z posádky je dospělý.
- Darebák nemůže být na břehu s jinými lidmi, pokud ho nehlídá policista.
- Tatínek se na břehu vrhne na holčičku, pokud s ní není maminka.
- Maminka zbije chlapečka, který je na břehu bez tatínka.
Až budete programovat svoji verzi Převozníka, zkuste ho udělat obecně:
- Bude možné definovat různé typy lidí a jejich počet pro počáteční stav hry.
- Modul GameEngine definuje jádro celé hry, tj. bude držet stav hry, řeší přesouvání lidí mezi břehem a vorem, pohyb voru na druhý břeh, kontrolu, zda jsme dosáhli cíle hry, apod.
- Modul GameEngine bude používat API modulu Referee přes delegáty.
-
V aplikaci budou definovány tyto delegáty (signatury pro "call-back" metody):
- Metoda, která posoudí, zda zadaná skupina lidí může být na břehu.
- Metoda, která posoudí, zda zadaná skupina lidí může být v lodi (na voru).
- Metoda, která posoudí, zda zadaná skupina lidí se může na lodi (voru) přepravit na druhý břeh.
- Modul Referee implementuje metody, které signaturou odpovídají delegátům.
- Moduly GameEngine a Referee budou naprosto nezávislé.
- Jediné propojení obou modulů bude přes delegáty na "rozhodovací" metody. V modulu GameEngine nikde nebude reference na Referee. V modulu Referee nikde nebude reference na GameEngine.
- Modul GameEngine bude držet všechny delegáty jako public vlastnosti.
- "Rozhodovací" metody modulu Referee budou rovněž public.
- Odkazy na metody modulu Referee "injektuje" (nasetuje) do modulu GameEngine jako delegáty hlavní modul Game.
Poznámka:
Delegáty jsou mimo jiné prostředkem, jak lze nahradit používání interface-ů pro "loose coupling" částí naší appky.
Tím, že dodržíte výše zmíněné požadavky, naprogramujete vlastně "generickou" hru na převozníka.
Hra bude totiž jen skořápkou spousty možných her. Skořápku definuje modul GameEngine.
Konkrétní hra vznikne tím, že implementujete pravidla hry v modulu Referee.
Oba moduly spolu propojí modul Game. Tento "hlavní" modul může (ale nemusí) obsahovat i GUI/CUI celé aplikace.
Hodně štěstí! Happy coding!