Kulečník v konzoli v C# .NET
Už delší dobru jsem si říkal, že by to chtělo na něčem pěkně ukázat, proč se vlastně objekty zabývat. K čemu by vlastně mohly být dobré. Program, který si právě pročítáte, jsem zamýšlel pro studenty prvě vstupující do objektového programování. Při jeho tvorbě mě zaujalo hned několik zajímavých věcí a rád se o ně s vámi podělím.
Pohyb kuličky
Kvůli odrážení nepřenastavuji při pohnutí kuličky jen jednu souřadnici, ale vždy obě, abych mohl sečíst aktuální polohu s vektorech v obou směrech a o víc se nestarat. Vykreslování na souřadnice už se nám ve škole velmi osvědčilo, takže o jiném řešení (například překreslování celé konzole) ani neuvažuji. Kdo neví, tak počátek soustavy hledejte vlevo nahoře.
Systém odrážení od stěn
Možná to někomu zní banálně, ale dalo mi chvíli práci, než jsem našel jednoduchý způsob, jak ošetřit odrážení kuličky od stěny v jakémkoliv směru! Výčet možností a reakce na ně je prostě špatná varianta a musel jsem ji zavrhnout. Pak jsem zkusil využít vektor. Ten má totiž 2 souřadnice, jednu pro X a druhou pro Y směr. Takže stačí přenastavit vždy jen tuto souřadnici, případně obě, pokud nastal odraz od rohu. Potom je jedno, od jaké stěny a jakým směrem se kulička odrážela. Funguje to perfektně.
Timer
Jasně, že je timer vhodnější, než uspání vlákna metodou Sleep(). Ale chtěl jsem maximální jednoduchost. A také jsem testoval obě varianty a při běhu jsem nepozoroval žádný znatelný rozdíl, takže uspávání proteď zvítězilo.
Problikávání konzole
Obzvlášť při vyšších rychlostech "kutálení" konzole přestane stíhat a pohyby začnou být trhané. Zjistil jsem však, že obyčejné skrytí scrollbaru vpravo velmi zlepší plynulost a výsledek celkově. Další věc - během vykonávání programu se prostě NESMÍ žádný znak vykreslit mimo hranice konzolového okna. Pokud to nastane vlevo, nahoře či vpravo, nastane výjimka a program spadne. Pokud to však nastane směrem dolů - nic nespadne, protože celá konzole se prostě posune o jednu řádku a znak se vykreslí. Jakmile dojde k vykresleni v horní řádce, konzole se opět posune nahoru. A máme zde problikávání. Chvilku mi trvalo, než jsem odhalil tuto prostou příčinu...
Soustava ifů v metodě PohniSe()
Zajímavé, co způsobí drobnost v podobě záměny sekvence if
za sekvenci if else
. Rozdíl nastane ve chvíli, kdy se kulička
odrazí od rohu konzole (v tu chvíli by mělo dojít ke změně vektoru x i
vektoru y), ale změní se jen první vektor a nastane to, o čem jsem psal.
Zkus si to!
A co barviššky?!!
Nejsou tam schválně kvůli jednoduchosti. Není vůbec těžké dotvořit
si tam náhodné barvy kuliček, případně barvy vázané na směr, ve kterém
se kulička pohybuje, takže to už nechám jako výzvu pro zájemce
Galerie
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 146x (49.08 kB)
Aplikace je včetně zdrojových kódů v jazyce C#