Fáze projektu

Vehicles and Roads (VAR)

Cvičení

OOP (Objektově orientované programování)

SSŠVT

Vehicles and Roads (VAR)

Fáze projektu


Fáze I – Objektová hierarchie s bazickou třídou Vehicle

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:

Z MotorVehicle dále dědí:

Z NonMotorVehicle dědí tyto třídy:

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.


Fáze II – Definice a implementace interface-u IMovable

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:


Fáze III – Orchestrace celého projektu – spuštění simulace

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.");
            }
        }
    }
}
        

Fáze IV – Dobrovolné rozšíření (WinForms, vlastní implementace IRoadMap apod.)

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).