Bij dit spelletje is het de bedoeling om aan de overkant van een kloof te geraken met behulp van een turbolift. Deze bestaat uit een aantal horizontale platformen die aansluitend achter elkaar opgesteld worden. De platformen bewegen verticaal op en neer, en werken onafhankelijk van elkaar. Je kunt enkel naar het volgende platform springen, wanneer dat zich op dezelfde hoogte bevindt als het platform waarop je momenteel staat.

Opgave

Voor elk platform wordt bij aanvang een startniveau ingesteld en een richting waarin het platform zich initieel beweegt: naar boven, naar beneden of stilstaan. Daarnaast wordt voor het platform ook een laagste en een hoogste niveau ingesteld, en deze kunnen achteraf niet meer gewijzigd worden. Bij elke volgende tijdsstap beweegt het platform één niveau naar boven of naar beneden, of blijft het stilstaan. Als het platform het laagste (resp. hoogste) niveau bereikt heeft, dan beweegt het vanaf de volgende tijdsstap terug naar boven (resp. naar beneden). Een platform waarvoor het laagste niveau gelijk is aan het hoogste niveau, of waarvoor bij aanvang werd opgegeven dat het stilstaat, blijft bij elke tijdsstap stilstaan.

Definieer een klasse Platform die kan gebruikt worden om dergelijke platformen te modelleren. Bij het aanmaken van een object van de klasse Platform moeten vier gehele getallen als argument doorgegeven worden: i) startniveau, ii) startrichting, iii) laagste niveau en iv) hoogste niveau. De laatste twee argumenten zijn optioneel, en worden gelijkgesteld aan het startniveau indien ze niet worden doorgegeven. De waarden van de vier argumenten moeten respectievelijk toegekend worden aan de eigenschappen stand, richting, laagste en hoogste van het nieuw aangemaakt object van de klasse Platform. Voor de configuratie van een platform moet gelden dat het laagste niveau niet hoger ligt dan het hoogste niveau, en dat het startniveau tussen het laagste en het hoogste niveau gelegen is (grenzen inbegrepen). Bekijk onderstaand voorbeeld om te zien hoe de constructor moet reageren als niet aan deze voorwaarden voldaan is. De richting waarin het platform initieel beweegt, wordt voorgesteld door de waarden -1 (naar beneden), 0 (stilstand) of 1 (naar boven). Zorg er voor dat deze waarden symbolisch kunnen voorgesteld worden door de variabelen Platform.NEER, Platform.STIL en Platform.OP.

De klasse Platform moet een methode volgende hebben waarmee gesimuleerd wordt dat de lift binnen de periode van één tijdsstap, één niveau naar boven of naar beneden beweegt, of blijft stilstaan. Deze methode moet de waarde van de eigenschap stand aanpassen volgens de beschrijving uit de inleiding.

> const platform = new Platform(0, Platform.OP, -1, 1);
> platform.stand;
0
> platform.volgende();
> platform.stand;
1
> platform.volgende();
> platform.stand;
0
> platform.volgende();
> platform.stand;
-1
> platform.volgende();
> platform.stand;
0
> platform.volgende();
> platform.stand;
1

> const platform = new Platform(1, Platform.NEER, 1, 1);
> platform.stand;
1
> platform.volgende();
> platform.stand;
1
> platform.volgende();
> platform.stand;
1

> const platform = new Platform(3, Platform.STIL);
> platform.stand;
3
> platform.volgende();
> platform.stand;
3
> platform.volgende();
> platform.stand;
3

> const platform = new Platform(-3, Platform.OP, -1, 1);
PlatformError: ongeldige configuratie

Definieer ook nog een klasse TurboLift waarvan elk object een turbolift voorstelt die is opgebouwd uit een aantal platformen. Het eerste en laatste platform stellen hierbij het vertrekpunt en de overkant van de kloof voor, maar hoeven niet op hetzelfde niveau te staan, en moeten ook niet noodzakelijk stilstaan. Bij het aanmaken van een object van de klasse TurboLift moeten geen argumenten opgegeven worden. Bij aanvang heeft een turbolift nog geen platformen, maar er kan te allen tijde achteraan een extra platform toegevoegd worden. De klasse TurboLift moeten de volgende methoden hebben:

> const turbolift = new Turbolift();
> turbolift.voegtoe(new Platform(0, Platform.STIL));
> turbolift.voegtoe(new Platform(2, Platform.NEER, -2, 2));
> turbolift.voegtoe(new Platform(0, Platform.OP, 0, 4));
> turbolift.voegtoe(new Platform(0, Platform.NEER, -4, 0));
> turbolift.voegtoe(new Platform(0, Platform.NEER, -2, 4));
> turbolift.voegtoe(new Platform(0, Platform.STIL));
> turbolift.tijdsstappen();
16
> turbolift.voegtoe(new Platform(4, Platform.OP, 2, 8));
> turbolift.tijdsstappen();
null