Opgave 5 (2021)
Volgende opgave was de vaardigheidsproefopdracht voor examen van dit vak (OOP) in augustus 2021
Inleiding
Knap hoor! We zijn er in geslaagd om eindelijk de aarde voorgoed achter ons te laten en naar nieuwe planeten, ver weg, te reizen. Voor we onze kostbare mensen de ruimte insturen heeft NASA en ESA jou gevraagd om een ruimte-reis-simulatie-pakket te maken. Hopelijk toont jouw applicatie aan dat onze raketten ver genoeg zullen geraken!
Algemene werking
Een ruimteschip zal in de simulatie vertrekken vanop aarde met een gegeven energie aan de start. Voorts wordt er een fictieve route van planeten en tussenstations aangemaakt waar de rakket, soms, kan bijtanken.
De applicatie bestaat uit 2 delen (we gaan verderop in de opgave in op de details van ieder deel)
Deel 1
Eerst wordt de fictieve wereld, de reisweg, aangemaakt die de tussenstops in volgorde toont. Er wordt telkens getoond om wat voor tussenstop het gaat en hoeveel lichtjaren de stop van de aarde verwijderd is. Voorbeeld:
Vervolgens toont de applicatie de startsituatie van het ruimteschip (dat altijd met 3000 energie begint):
Deel 2
Vervolgens zal de simulatie een rakket dit traject laten vliegen. Dit gebeurt automatisch. Op plaatsen waar getankt kan worden (RijkePlaneet en TankTussenstation) zal het ruimteschip dit sowieso doen en dan verder vliegen. Wanneer het ruimteschip niet meer genoeg energie heeft om de volgende etappe af te leggen dan stopt de simulatie daar.
Eén lichtjaar reizen kost 1 energie.
Voorbeeld van de uitput (gegeven het voorbeeld in deel 1 hierboven):
Opbouw
Klasse diagram
Volgende diagram toont alle klassen en interfaces die je moet maken:
We beschrijven nu de individuele klassen in de volgorde dat je ze best maakt, uiteraard ben je vrij om een andere vologrde te hanteren
IEnergiegever
Plekken waar het ruimteschip zal kunnen tanken hebben deze interface. De interface is als volgt gedefinieerd:
Reisbestemming
Deze abstracte klasse wordt gedefinieerd door de afstand (in lichtjaren) van de aarde. Enkele opmerkingen:
r
is eenstatic
Random
-object zodat je dat overal kan gebruikenheeft een read-only property
AfstandVanAarde
heeft een constructor die de instantievariabele
afstandVanAarde
op een willekeurig getal tussen 400 en 10.000 zet.heeft de
IComparable
-interface en zal toelaten om (later) een lijst van Reisbestemmingen te sorteren op hun afstand van de aarde (zie verder).heeft de
ToString
-methode geïmplementeerd en geeft het object weer als [Type object]:[Afstand van Aarde], bijvoorbeeldRijkePlaneet:1911
(zie de output deel 1 bovenaan).Tip: met de
GetType().Name
property krijg je het type terug zonder de overbode namespace ervoor.
Planeet
Een Planeet
is een Reisbestemming
. Niets meer.
Ter info: er kan dus niet getankt worden daar het niet de IEnergieGeven
-interface heeft.
RijkePlaneet
Een RijkePlaneet
is een Planeet
die de IEnergieGever
-interface heeft. Dit type planeet geeft altijd 10% terug van de afstand tot de aarde. Als de planeet zich dus op 3246 lichtjaren bevind dan zal GeefEnergie
324 energie teruggeven.
TankTussenstation
Een TankTussenstation
is een Reisbestemming
die de IEnergieGever
-interface heeft. Dit type geeft altijd een willekeurige hoeveelheid tussen 500 en 1500 energie terug bij GeefEnergie
. Deze waarde is steeds anders telkens de methode wordt aangeroepen.
Wereld
Deze klasse heeft één methode met volgende signatuur:
De methode geeft een lijst van Reisbestemming
-en terug. De parameter aantal
geeft aan hoeveel objecten in de lijst zitten.
De methode plaats een combinatie van Planeet
, RijkePlaneet
en TankTussenstation
-objecten in de lijst. Het kiest willekeurig uit deze 3 types volgende volgende tabel:
25% kans op een
Planeet
25% kans op een
RijkePlaneet
50% kans op een
TankTussenstation
Finaal wordt de lijst gesorteerd waarbij de Reisbestemming
die het dichts bij de aarde zit van voor komt, en zo verder. Deze gesorteerde lijst wordt als resultaat van de methode teruggegeven.
Tip: weet je niet hoe je moet sorteren? Geen probleem, geef gewoon de ongesorteerde lijst terug en werk hier op verder! (verlies dus niet te veel tijd met dit stuk)
Ruimteschip
Deze klasse heeft:
Een read-only property met private set om de
Energie
(type:long
) bij te houden.Een ruimteschip heeft altijd 3000 energie aan de start.
Een instantievariabele
afstandVanAarde
die bijhoudt hoeveel lichtjaren van de aarde het schip is.Deze start altijd op 0 (daar we op aarde vertrekken).
De methode
ToSTring
die volgende zinnetje teruggeeftJe hebt [Energie] energie en bent [afstandVanAarde] units verwijderd van de aarde.
(met natuurlijk de effectieve waarden in plaat van de placeholders met vierkante haken). VoorbeeldJe hebt 294 energie en bent 3489 units verwijderd van de aarde.
De klasse heeft twee speciale methode:
StartReis
:
Deze methode geeft een bool
terug en aanvaardt een Reisbestemming
-object als parameter. De methode werkt als volgt:
Het geeft met de bool weer of het schip genoeg energie heeft om naar de reisbestemming te reizen. Een schip kan enkel naar die plek, het doelwit, reizen (de parameter) indien deze minstens evenveel energie heeft als het aantal lichtjaren dat het schip van de planeet verwijderd is.
De te reizen afstand is natuurlijk het verschil tussen de
afStandVanAarde
-instantie van het ruimteschip en deAfstandVanAarde
van de bestemming.Als het schip op afstand 2000 is van de aarde en het doelwit is op 2500 afstand van de aarde, dan heeft het schip 500 (2500-2000) energie nodig.
Indien het schip niet genoeg energie heeft dan wordt er
false
teruggegeven nadat volgende zin op het scherm komt:"Dit schip heeft niet genoeg energie daarvoor."
Indien het schip wél genoeg energie heeft dan wordt de energie van het schip verminderd met de zonet berekende hoeveel energie die gegeven de afstand tussen beide nodig was (dus 500 in vorig getalvoorbeeld) en worden volgende 2 zinnen getoond:
Bestemming bereikt. Nog [Energie} energie over. Laten we proberen bij te tanken.
Vervolgens wordt de
afstandVanAarde
verhoogt met de afgelegde afstand (namelijk de gespendeerde energie)Voor je nu
true
teruggeeft (om aan te geven dat de reis gelukt is) roep je nu de methodeEnergieBijtanken
(zie volgende stuk) en geeft de doelwitReisbestemming
mee als argument.
EnergieBijtanken
Deze methode geeft niets terug en aanvaardt een Reisbestemming
-object als parameter. De methode werkt als volgt:
Indien het meegeven object de
IEnergieGeven
-interface heeft dan zal het schip hiervan gebruik makenen bijtanken. Het roept hierbij deGeefEnergie
-methode van het doelwit op en zal de teruggekregen energie optellen bij z'n huidige energie en vervolgens volgende zinnetje tonen:Hier werd bijgetankt. Je kreeg [verkregenEnergie] energie en staat nu op [Energie] energie.
Vervolgens stopt de methode.Indien er op het object niet kan getankt worden verschijnt er
Hier kan niet bijgetankt worden
en stopt de methode.
Main code
Het wordt nu tijd om alles samen te gooien. Dat gaat hopelijk eenvoudig. Het hoofdprogramma werkt als volgt:
Een nieuwe wereld wordt aangemaakt mbv van de
GenereerWereld
-methode van deWereld
-klasseIeder tussenstop van deze nieuwe wereld wordt op het scherm getoond (zie voorbeeld uitvoer vooraan de opgave)
Een nieuw RuimteSchip-object wordt aangemaakt en ook op het scherm getoond.
De reis gaat van start. Hierbij wordt een loop gestart die blijft duren:
zolang het schip nog energie heeft (dus meer dan 0),
zolang een teller minder is dan het totaal aantal bestemmingen in de wereld
zolang het schip nog genoeg energie heeft om naar de volgende bestemming te gaan
In de loop houdt je met een teller bij aan welke bestemming je bent en verhoogt deze teller telkens het schip naar de volende bestemming reist.
Finaal toon je tot waar het schip is geraakt.
Volgende voorbeeldoutput toont nogmaals het geheel:
Last updated