V první fázi si založíte objekty, které budou reprezentovat dopravní prostředky
pohybující se po silnicích na mapě. Vymyslete si k nim sami vhodné vlastnosti tak,
aby např. třída Bicycle
reprezentovala reálné kolo a jeho cyklistu
(může mít např. vlastnost Stamina, která říká, kolik má cyklista ještě energie),
nebo třída Car
může mít třeba omezenou kapacitu palivové nádrže,
takže vždy po ujetí jednoho úseku silnice se o něco zmenší množství paliva v nádrži.
Základní třídou vaší hierarchie bude Vehicle
(vozidlo), z něj dědí dvě třídy:
MotorVehicle
(motorové vozidlo)NonMotorVehicle
(nemotorové vozidlo)
Z MotorVehicle
dále dědí:
Truck
(nákladní automobil)Car
(osobní automobil)Motorcycle
(motocykl)
Z NonMotorVehicle
dědí tyto třídy:
Trailer
(ruční vozík, který člověk před sebou tlačí)Bicycle
(jízdní kolo)Můžete si vymyslet i vlastní dopravní prostředky. Jde o to, aby náš "vozový park" byl bohatý, rozmanitý.
Řiďte se principy OOP. Když zjistíte, že nějakou vlastnost mají všichni potomci nějakého předka, přesuňte tuto vlastnost do toho předka, ať zbytečně neduplikujete kód. Totéž platí pro metody.
Definujte interface (rozhraní) IMovable
. Tento interface
pak musíte implementovat pro každý specifický typ vozidla tak, aby vozidlo
mohlo jezdit.
V interface-u budou určitě alespoň 2 metody: MoveBy
a ChooseWay
.
Metoda MoveBy
umožní vozidlu, u něhož ji implementujete,
aby se pro zadaný časový úsek "posunulo" (popojelo) na silnici, po které zrovna jede,
o nějakou vzdálenost. Vzdálenost bude odpovídat rychlosti, kterou vozidlo jede,
a síle (stamině, množství paliva), kterou momentálně má.
V metodě nemusíte řešit, jak to přesně po nějaké silnici udělat. To za vás řeší API
knihovny tříd s mapou silnic a měst.
Metoda ChooseWay
implementuje u daného vozidla strategii,
podle které se vozidlo, když přijede na křižovatku, rozhodne,
kam pojede dál. Křižovatka (větvení silniční sítě) je vždy v nějakém městě.
Mimo města se silnice nevětví (maximálně je tam např. nějaké mimoúrovňové křížení).
Možné strategie pro výběr cesty, kam bude vozidlo pokračovat z města, do kterého právě dojelo:
Jak celou simulaci spustit? Napadají mne 2 možnosti:
Varianta s časovačem:
Definujte nějakou třídu (např. SimulationManager
), která bude celou simulaci řídit.
Objekt SimulationManager
si vytvoří instanci třídy Timer
(v konzoli použijte System.Threading.Timer
, případně System.Timers.Timer
,
ve Windows Forms aplikaci použijte System.Windows.Forms.Timer
).
Když časovač "tikne", vygeneruje událost (např. Elapsed), ke které můžeme přidat nějakou naši metodu, která bude vyvolána vždy, když dojde k oné události. Když časovač nastavíme tak, aby tikal např. po sekundách, vyvolá se naše metoda přibližně 1x za sekundu.
Úkolem naší metody (obsluhy události "tiknutí" časovače, nazvěme ji např. DoSimulationStep
) bude "rozpohybovat" celou simulaci.
Objekt SimulationManager
musí dále nějak držet (registrovat) všechny objekty, které mají nějak na událost časovače reagovat.
Lze to udělat třeba tak, že do něj "vložíme" kolekci našich vozidel:
public class SimulationManager { private List<Vehicle> vehicles; // ... public void DoSimulationStep() { foreach (Vehicle vehicle in vehicles) { IMovable movable = vehicle as IMovable; if (movable != null) { movable.MoveBy(...); } else { throw new Exception($"This vehicle {vehicle} cannot move. Please, register only movable vehicles with SimulationManager."); } } } }
Kdo chce, může implementovat celou simulaci ve Windows Forms aplikaci. Představuji si potom, že uděláte i jakousi vizualizaci mapy, po které vozidla jezdí. Zobrazíte města jako nějaké tečky, silnice mezi městy jako nějaké úsečky. Můžete barevně odlišit dálnice, silnice I. třídy a silnice III. třídy, pokud víte jak.
Kdo chce, může vytvořit vlastní implementaci interface-u IRoadMap
,
tj. udělat vlastní mapu (buď ČR, případně i jiné části naší planety).