Amazing Maze – Logická hra v C#

Odkaz ke stažení:

http://www.uloz.to/xzVwLXf/install-amazing-maze-exe

Úvod

Dlouho jsem přemýšlel nad výběrem ročníkové práce. Ve třetím ročníku mě nejvíce bavilo 3D modelování a grafika samotná, ale bohužel, ročníková práce není jen o grafice. Snažil jsem se proto vymyslet takový projekt, kde bych uplatnil jak oblíbenou grafiku, tak další dovednosti a znalosti informatiky. Grafiku a programování jsem proto spojil ve vizuální programování, které mne zajímá již od 3. ročníku.

Nejprve jsem váhal mezi C++ a C#. Ve 3. ročníku jsme programovali v C++, ale tento projekt jsem pojal záměrně v C#. První varianta je starší, ale ta druhá je novější a má mnoho nových funkcí. O prázdninách jsem si vyzkoušel několik programů v C#, a tak jsem měl o volbě jasnou představu. Můj první nápad se týkal naprogramování grafického bitmapového editoru. Ale nakonec jsem se rozhodl pro podstatné rozvinutí a propracování jednoho malého prográmku z prázdnin do velké závěrečné práce.

V následujících kapitolách popisuji jednotlivé části celého programu, a to jak z pohledu programátora, tak z pohledu uživatele. Snažím se konkrétně vysvětlit jednotlivé použité prvky a knihovny jazyka C#.

 

1.  Použité technologie

1.1.     Programovací jazyky

1.1.1.   Jazyk C#

Proč jsem si vybral jazyk C# jsem popsal již v úvodu. Jazyk C# je objektově orientovaný programovací jazyk, který vytvořila počítačová firma Microsoft zároveň s platformou NET. První zmínky o něm pronikly na veřejnost v roce 2000 jako součást Visual Studia .NET. Je to vlastně zjednodušená, vylepšená a čistě objektová verze programovacího jazyka C++.

1.2.     Knihovny a rozhraní

1.2.1.   Microsoft .NET Framework 4

Prostředí Microsoft .NET Framework 4 je komplexní a konzistentní programovací model společnosti Microsoft určený pro sestavování aplikací, které se vyznačují vizuálně působivým uživatelským rozhraním a bezproblémovou zabezpečenou komunikací. V podstatě balíček běhových knihoven nutných pro programování v Microsoft Visual Studiu.

1.2.2.   .NET

.NET je rozhraní mezi operačním systémem a programovacím jazykem. Je nezávislou platformou, která podporuje několik jazyků (C#, VB.NET, J# a managed C++) a obsahuje knihovny, které jsou všem jazykům společné. Pokud používáte stejnou funkci v C# a VB.NET, voláte tu samou knihovnu a to samé místo v ní.

1.2.3.   Rozhraní IDE sady Visual Studio 2010

Integrované vývojové prostředí (IDE) sady Visual Studio nabízí sadu nástrojů, které pomáhají se zápisem a úpravou kódu, a také rozpoznávají a opravují chyby.

1.3.     Vývojové prostředí

1.3.1.   Microsoft Visual C# 2010 Express

Domovská stránka:

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express

Vývojové prostředí pro C# firmy Microsoft nabízí sadu kompilačních nástrojů pro platformu MS Windows. Je dostupné ve více verzích, já jsem jej použil ve volně stažitelné verzi Express. Visual C# je určen pro stavbu různých aplikací, které běží na .NET Framework. Visual C# je jednoduchý, silný, typově bezpečný a objektově orientovaný. Se svými mnoha inovacemi Visual C# umožňuje rychlý vývoj aplikací a také si udrží expresivitu i eleganci stylu jazyka C.

Výhody

  • Kompilátor pro MS Windows.
  • Obsáhlé nastavení.
  • Kvalitní nástroj pro hledání chyb (bugů).

Nevýhody

  • Hardwarově náročné a pomalé prostředí.
  • Absence možnosti otevřít dva projekty v jednom programu.
  • Závislé na platformě.

1.4.     Grafika

1.4.1.   Zoner Photo Studio 10

Domovská stránka:

http://www.zoner.cz/

Potřeboval jsem grafický bitmapový editor pro vytvoření pozadí jednotlivých menu i samotné hry. Zkušenosti s tímto programem mám již od základní školy, proto byl Zoner Photo Studio jasnou volbou. Program je placený, ale mě bohatě postačila zkušební 30-denní trial verze.

Výhody

  • Obrovské množství funkcí a grafických nástrojů.
  • Propracovanost prostředí.
  • Široká škála podporovaných formátů.

Nevýhody

  • Program je placený.
  • Absence možnosti snižovat kvalitu bitmapy metodou komprese.


2.    Popis projektu

2.1.     Hlavní menu

2.1.1.   Hlavní menu z pohledu programátora

Hlavní menu bylo jedno z jednodušších úkolů. Formulář se skládá pouze z tlačítek, které odkazují na další podmenu a nastavení daného formuláře.

Přesto je hlavní menu, jako základní orientační část programu, jediné voláno ze základního kódu, který nám automaticky vygeneruje Visual Studio. Další podmenu se volají už jen pouze z hlavního menu (formuláře). Tlačítko Nová hra ukončí formulář Hlavního menu a zavolá formulář pro výběr obtížnosti. „Nejlepší výsledky“ a „O hře“ pouze zavolají do nového okna dané formuláře. Poslední tlačítko ukončí celou aplikaci.

2.1.2.   Hlavní menu z pohledu uživatele

Z pohledu uživatele je vidět přívětivé prostředí, které dává na výběr mezi základními prvky hry. Grafický podtext určitě na dojmu přidá. Rychlá orientace a okamžitá reakce po kliknutí na libovolnou možnost je jistě základní prioritou každé hry. 

2.2.     Výběr obtížností a úrovní

2.2.1.   Obtížnosti a úrovně

Snad v každé hře je systém úrovní nebo obtížností. Od nejlehčích po nejtěžší. Já toho chtěl docílit také. Proto jsem vytvořil pro každou obtížnost (Snadná/Normální/Těžká) tři bludiště, které se liší úrovní. Tudíž se pro hráče otevírá možnost hrát devět her podle stupně obtížnosti.

2.2.2.   Výběr obtížností

Formulář s menu pro výběr obtížnosti se volá ihned po kliknutí na tlačítko Nová hra v hlavním menu. Menu má tři tlačítka pro výběr každé obtížnosti a také tlačítko zpět pro návrat do hlavního menu.

2.2.3.   Výběr úrovní

Zde se volá pro každou obtížnost jiný formulář, tedy tři formuláře s výběrem úrovní. Volán je pouze formulář odpovídající dané obtížnosti. Každé z těchto podmenu obsahuje tlačítka, která přímo přenesou hráče do hry.

 

2.3.     Hra z pohledu programátora

2.3.1.   Bludiště – „aby bludiště bylo opravdu bludiště“

Nejdůležitější bylo rozhodnutí jak ošetřit stěny bludiště, aby nemohl hráč jen tak přejet myší přes celou obrazovku a dostat se snadno do cíle. Napadaly mě pouze dvě možnosti jak vyřešit tento důležitý problém.

První je vytvoření bludiště z obyčejných štítků (labelů). Objekty, které mohou mít pouze obdélníkovitý (čtvercový) tvar. Dají se vyplnit libovolnou barvou či obrázkem, můžou obsahovat text a upravují se dobře jejich nastavení. A následně napsat funkci, která při každém doteku kurzoru stěny bludiště vrátí kurzor na začátek (start) bludiště. V obtížnosti normální má hráč větší šanci, že kurzor se vrátí na začátek až při každém druhém doteku stěny. V těžké obtížnosti pak reaguje na každý třetí dotek.

Výhody:

  • Žádná závislost na čase – každý štítek má přiřazenou akci „MouseEnter“, která poté volá metodu pro vrácení kurzoru na začátek.
  • Když už se v obtížnosti normální nebo těžká hráč dotkne stěny, může toho využít a stěnu „přejet“ tím si může zkrátit cestu a dohnat čas.

Nevýhody:

  • Obrovská náročnost na čas – každá stěna se musí umisťovat zvlášť, každá délka stěny se musí nastavovat zvlášť. S přibývající obtížností samozřejmě stoupal počet zdí – počet štítků je i několik stovek.
  • Omezení pouze pro hranaté bludiště. Nemožné vytvořit bludiště například kulaté či jinak oblé.
  • Složitější pro kompilátor. Než inicializuje všechny štítky …

Druhou možností je na pozadí formuláře dát bitmapu bludiště. Poté by se napsala funkce pomocí časovače (timer), která by každou milisekundu kontrolovala, jestli se barva pod kurzorem nezměnila (např. pozadí bílé, stěny černé) a teprve potom by odkazoval na funkci, která vrátí kurzor na začátek.

Výhody:

  • Méně časově náročné než první varianta.
  • Možnost vytvoření jakéhokoliv bludiště

Nevýhody:

  • Časovač by skenoval každou milisekundu – při obtížnostech normální nebo těžká se mohou napočítat ony dva nebo tři doteky prakticky v jednom malém okamžiku -> když kurzorem na stěně zůstane déle než 3 milisekundy …
  • Omezení v barevném spektru – kontrastní barvy.
  • Náročné na operační paměť – timer musí pořád „tikat“.

 

Rozhodl jsem se pro první variantu, protože mi přišla jednodušší a vhodnější. Jistě mnohem pracnější než druhá možnost, ale bludiště jsem nakonec stihl v relativně krátkém čase. Vytvořil jsem tedy devět bludišť. Zprovoznil základní kámen bludiště – napsal funkci, která vrátí hráče při doteku na začátek a také funkci, která se vyvolá, když hráč dorazí do cíle.

2.3.2.   Hodnocení výsledků

Další téma na přemýšlení bylo jak hodnotit hráčův výkon. První mě napadlo stopovat čas, ale říkal jsem si, že to je málo. Tak jsem ještě zakomponoval počítání doteků zdi. Obojí jsem snadno přidal do bludišť pomocí štítků, časovače a přidáním inkrementace do funkce, která řeší dotek stěn.

private void timer1_Tick(object sender, EventArgs e) // ukázka časovače

{

TimeSpan span = DateTime.Now.Subtract(da); // zjistí momentální čas

cas_cas = span.Minutes.ToString() + “ : “ + span.Seconds.ToString() + “ : “ + span.Milliseconds.ToString(„000“);

/*

do řetězce cas_cas se každou milisekundu uloží stopovaný čas ve formátu minuty:sekundy:setiny

*/

this.cas.Text = cas_cas;    // vypíše do štítku cas řetězec cas_cas

}

Dále jsem musel promyslet způsob hodnocení. Než složitě porovnávat čas a počet doteků najednou, je lepší hodnotit na největší počet bodů. Napsal jsem si tedy v Excelu vzorec pro výpočet bodů:

points = 1000 – (sekundy + (pocet_doteku * 30));

Takže v konečné fázi se hráč stejně dozví jen počet bodů. Čím víc bodů tím lépe.

2.3.3.   Ukládání a čtení nejlepších výsledků

Jak víme, po ukončení programu se celý program z operační paměti smaže. A my chceme, aby se nám data uchovávala. Přijatelným řešením je ukládání do externích textových souborů. Zapisuje se na jeden řádek jméno uživatele, na druhý pak počet bodů. Takto se zapisuje pouze prvních pět nejlepších výsledků.

Když hráč dojede do cíle, nejdříve se na pozadí načtou data z textového souboru. Poté se vypočítá dosažený počet bodů a porovná s nejlepšími výsledky. Pokud je lepší probíhá přepis celého souboru na nových pět výsledků.

 

StreamReader lehka_score = new StreamReader(jmeno_lehka, kodovani);

/* otevření souboru pro čtení */

Pro každé bludiště je jeden textový soubor, protože v tabulce nejlepších výsledků si bude hráč mezi úrovněmi vybírat, musí se ukládat i 9 různých výsledkových listin.

2.4.     Hra z pohledu uživatele

2.4.1.   Hratelnost

Poprvé hráče asi překvapí, když se hned dostane do hry a uvidí, že se mu počítá čas. První doteky zdí také budou něčím „novým“. Uživatel si však zvykne rychle a tomu se taky přizpůsobí. Brzy zjistí, že zbrklost není na místě, a že je lepší postupovat raději pomaleji s co nejmenším počtem doteků zdí, a hlavně dorazit do cíle.

2.4.2.   Pokoření hranic

Uživatel zjistí, že tady nejde až tak o zábavu, jako spíše o pokořování vlastních hranic. Zde si může každý zkusit jak dobře a jak přesně se vlastně dokáže pohybovat s myší, a také jak klidný dokáže být, pokud chce být nejlepší. Je docela pravděpodobné, že spoustu hráčů odradí věčné „kopance“ na začátek, a že na to prostě nebudou mít „nervy“. Ale ti, kteří se chtějí zdokonalovat v práci s myší, tuto hru jistě ocení. Zvláště, když se nakonec zapíšou do listiny nejlepších výsledků.

2.5.     Menu nejlepších výsledků

2.5.1.   Výběr obtížnosti pro zobrazení konkrétních výsledků

Do menu nejlepších výsledků se dostaneme z hlavního menu. Uživatel si vybere z „combo box“ požadovanou obtížnost a úroveň hry a po kliknutí na tlačítko Hotovo se níže zobrazí všech pět nejlepších. Pokud uživatel nevybere obtížnost či úroveň, objeví se varovná hláška. Zde může uživatel porovnávat výsledky s jinými obtížnostmi, s jinými hráči, případně se sebou samým.

2.5.2.   Smazání nejlepších výsledků

Samozřejmostí je možnost smazání nejlepších výsledků. Po kliknutí na příslušné tlačítko se zobrazí dialogové okno, které se zeptá uživatele, jestli opravdu chce smazat všechna data. Textové soubory se přepíšou na defaultního hráče Mr. Noname a základní počty bodů.

 

2.6.     Grafika

2.6.1.   Tvorba pozadí do hlavního menu a podmenu

Práce s bitmapou patří mezi mé oblíbené činnosti. Celkově počítačová grafika mne fascinuje a myslím si, že v tom i vynikám. V podstatě jsem tuto etapu mé závěrečné práce nechal skoro až nakonec. Řekl jsem si, že hlavní je, aby to fungovalo. Samotná estetika hry je až „druhořadý“ úkol. Stáhl jsem si tedy z Google Images několik desítek obrázků a dal se do práce. Většina byla barevná a já si řekl, že by to chtělo něco lepšího než obyčejný barevný obrázek. Po několika hodinách míchání barev, kopírování jednoho obrázku do druhého a mnoha dalších úprav jsem vytvořil pět obrázků pro všechna menu.

2.6.2.   Vložení textur na pozadí bludišť, přidělení barev stěnám bludiště

S grafikou bludišť jsem začal až po tvorbě pozadí menu. Stačilo několik textur opět z Google Images a přidělení odpovídajících barev stěnám bludiště a bylo hotovo. Výběr textur byl vskutku striktní. Nesměla to být žádná, ve které by splýval kurzor, plnobarevné (aby šla vybrat barva pro stěny bludiště), a další. Nakonec jsem vybral nejlepší z nejlepších a vložil na pozadí.


3.  Řešené problémy

3.1.      „Vždy se naskytnul nějaký problém“

Jaký by byl život, kdyby nebyly problémy? Velká nuda. Při programování hry se mi naskytly desítky menších problémů, které spočívaly například jen v chybějící závorce, chybějícím středníku, špatné podmínce, nevhodně použité úpravě daného objektu. Takové drobnější problémy se daly vyřešit v několika minutách. V extrémních případech až desítkách minut, ale naštěstí vždycky tady byl internet a spousta fór či návodů jak určité problémy řešit.

3.2.     Problém s rozhodnutím

Jak jsem už psal v předešlé kapitole, největší problém jsem měl s tímto rozhodnutím. Rozhodnout se pro zdlouhavé, ale za to funkční verzi, nebo pro rychlou ale prakticky polovičně funkční verzi dvě? Přemýšlel jsem nad tím dlouho a rozhodnul se pro verzi jedna. Proč? Nelíbila se mi nemožnost dát hráči čas pro rozmyšlení, když už se stěny dotkne. Můžete se mnou nesouhlasit, ale mě se to zdálo jako ta nejlepší varianta.

3.3.      Problém s rozlišením

To byl (a nejspíš pořád ještě je) druhý nejzáludnější problém. Vzhledem k tomu, že jsem se rozhodl dělat svou aplikaci v celoobrazovkovém režimu, začal být tento problém opravdový „problém“. Bludiště jsem „klikal“ ručně, a to na celou výšku i šířku obrazovky mého notebooku (1366×768). Každý štítek má pevně dané místo a zobrazení celého bludiště v menším rozlišení je zatím nemožné. Takže kdo nemá možnost nastavit toto rozlišení, má zřejmě smůlu. Zkusím ještě přes vánoční prázdniny zprovoznit režim (1024×768), ale nic neslibuju.

3.4.     Problém s texturama bludišť

Úmysl dát na pozadí bludišť texturu byl jasný. Estetika má na celkovém dojmu asi největší podíl a já toho chtěl docílit i přidělením textur samotným stěnám bludiště (např. dřevěné, ocelové, skleněné …). Jenže po vyzkoušení na jednom bludišti se samotná aplikace začala zpomalovat a neskutečně dlouho se načítalo samotné bludiště. Proto nezbývalo než dát stěnám pouze jednu určitou barvu a dojem nechat jen na pozadí.

 

4.  Systémové požadavky

Pro spuštění hry je nutné mít nainstalovaný balíček .NET 4.

Doporučená konfigurace:

  • AMD Athlon Dual-Core 2.0 GHz / Intel Core 2 Duo 2.0 GHz
  • nVidia GeForce 8200M
  • 2 GB RAM
  • Microsoft Windows Vista, 7
  • 170 MB místa na pevném disku


Závěr

Už na začátku jsem si byl vědom, že za šest měsíců nestihnu vytvořit něco, co by se aspoň z dálky podobalo dnešním počítačovým hrám či programům. Uvědomil jsem si však věc jinou. A to, že raději vytvořím něco menšího a hlavně funkčního. Přišlo mi pošetilé, že bych v lednu obhajoval práci, která je hotová jen z půlky. Takže úkol byl jasný. Naprogramovat hru, která nebude nikterak velká, ale zato plně fungující a propracovaná.

Když se na to dívám zpětně. Myslím, že jsem udělal obrovský kus práce. Snažím se nenechávat věci na poslední chvíli a vždycky se mi to vyplatilo. Hra je hotová a počáteční cíl je dosažen. Vytvořil jsem fungující logickou hru, která plně odpovídá mým počátečním představám. Se svou prací jsem spokojen.

Resumé

Already at the beginning I knew that in 6 months I can’t make something what would be similar to today’s computer games or programs. I realized another thing. Namely I will make something smaller and primary functional. It seemed foolish in January defend work which is complete only by half. Task was clear. Program game which will isn‘t so big but it will fully working and elaborate.

If I am looking back I think that I did very big piece of work. I try to not leave things at the last moment and I always worth it. The game is complete and the initial goal is achieved. I created a working logic game, which fully corresponds to my initial expectations. I am satisfied with my work.

 

Fotogalerie