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.
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. Hiervoor moet een object van de klasse Platform over de volgende methoden beschikken:
Een initialisatiemethode __init__ waarmee de configuratie van een platform kan ingesteld worden. Aan deze methode 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 attributen 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 initialisatiemethode 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.
Een methode volgende 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 het attribuut stand aanpassen volgens de beschrijving uit de inleiding.
>>> platform = Platform(0, Platform.OP, -1, 1)
>>> platform.stand
0
>>> for stappen in range(5):
... platform.volgende()
... print(platform.stand)
1
0
-1
0
1
>>> platform = Platform(1, Platform.NEER, 1, 1)
>>> for stappen in range(3):
... print(platform.stand)
... platform.volgende()
1
1
1
>>> platform = Platform(3, Platform.STIL)
>>> for stappen in range(3):
... print(platform.stand)
... platform.volgende()
3
3
3
>>> platform = Platform(-3, Platform.OP, -1, 1)
Traceback (most recent call last):
AssertionError: 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. Voor 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. Beslis zelf of het nodig is om voor de klasse TurboLift een __init__ methode te voorzien, en hoe die dan moet geïmplementeerd worden. Objecten van de klasse TurboLift moeten wel verplicht de volgende methoden hebben:
Een methode voegtoe waarmee achteraan de turbolift een nieuw platform (een object van de klasse Platform) kan toegevoegd worden.
Een methode tijdsstappen die teruggeeft na hoeveel tijdsstappen men het laatste platform van de turbolift bereikt. Bij het aanroepen van deze methode wordt de tijd op nul gezet, en vertrekt men vanaf het eerste platform. Bij elke tijdsstap bewegen eerste alle platformen van de turbolift één niveau naar boven of naar beneden, of blijven ze stilstaan, conform de methode volgende van de klasse Platform. Als daarna het platform waarop men zich bevindt op hetzelfde niveau staat als het volgende platform, dan stapt men over naar het volgende platform. De methode tijdsstappen moet volgens bovenstaande procedure ook gaandeweg de toestand van de platformen van de turbolift aanpassen. Merk op dat het hierdoor mogelijk is dat bij elke volgende aanroep van de methode tijdsstappen een verschillende waarde wordt teruggegeven, ook al wordt aan de configuratie van de turbolift niets gewijzigd. Het kan ook zijn dat het met een gegeven configuratie van een turbolift onmogelijk is om de overkant te bereiken. Daarom moet de methode tijdsstappen de waarde None teruggeven, indien het laatste platform nog niet bereikt is na 1000 tijdsstappen.
>>> turbolift = TurboLift()
>>> turbolift.voegtoe(Platform(0, Platform.STIL))
>>> turbolift.voegtoe(Platform(2, Platform.NEER, -2, 2))
>>> turbolift.voegtoe(Platform(0, Platform.OP, 0, 4))
>>> turbolift.voegtoe(Platform(0, Platform.NEER, -4, 0))
>>> turbolift.voegtoe(Platform(0, Platform.NEER, -2, 4))
>>> turbolift.voegtoe(Platform(0, Platform.STIL))
>>> turbolift.tijdsstappen()
16
>>> turbolift.voegtoe(Platform(4, Platform.OP, 2, 8))
>>> print(turbolift.tijdsstappen())
None