In het spelletje Dr. Eureka zijn alle spelers assistent-wetenschappers. Ze moeten proberen om sneller dan hun medespelers de gekleurde ballen in de voorgeschreven volgorde in de proefbuizen te krijgen. Daarbij mogen de ballen niet uit de buizen vallen of met de handen aangeraakt worden.
Als alle spelers klaar zijn om eraan te beginnen, wordt de bovenste opdrachtkaart omgedraaid. Dan proberen alle spelers zo snel mogelijk de gekleurde ballen van de ene in de andere buis te krijgen, zodat ze de volgorde krijgen die op de opdrachtkaart staat. Daarbij gelden de volgende regels:
de opdracht kan voltooid worden met alle proefbuizen rechtopstaand (A)
de opdracht kan voltooid worden door één buis omgekeerd neer te zetten (B)
De volgorde van de proefbuizen doet er niet toe (van links naar rechts). Enkel de volgorde van de gekleurde ballen in de proefbuizen (van boven naar onder). Als het helpt mogen de proefbuizen met de hand van plaats verwisseld worden.
Als een speler een bal met de hand raakt, een bal uit een buis laat vallen, of onterecht aankondigt dat de opdracht bereikt werd, dan doet de speler die ronde niet meer mee (dus totdat de anderen deze opdracht af hebben).
Het spel wordt gespeeld met een vast aantal proefbuizen. De proefbuizen hebben een maximale capaciteit die aangeeft hoeveel ballen er maximaal in elke buis passen.
De eerste speler die zijn ballen in de voorgeschreven volgorde in zijn proefbuizen heeft, roept "Eureka!". Als de andere spelers het er mee eens zijn dat hij de opdracht op een correcte manier voltooid heeft, dan krijgt hij de opdrachtkaart die 1 punt waard is.
De spelers laten de ballen in hun proefbuizen zoals ze na de vorige ronde zaten. De ballen worden dus niet opnieuw in een bepaalde startpositie geplaatst. Alle buizen moeten echter rechtop gezet worden voordat een nieuwe opdrachtkaart wordt omgekeerd. Als alle spelers klaar zijn, begint de volgende ronde met het omdraaien van een nieuwe opdrachtkaart. De eerste speler die 5 punten heeft, wint het spel.
Definieer een klasse Eureka waarmee kan gesimuleerd worden hoe de spelers van Dr. Eureka de gekleurde ballen over hun proefbuizen kunnen verdelen. Om te kunnen verwijzen naar de verschillende proefbuizen, worden de buizen van links naar rechts genummerd vanaf 0.
Bij het aanmaken van een simulatie (Eureka) moet een string (String) doorgegeven worden die de configuratie van de gekleurde ballen over de verschillende proefbuizen beschrijft. Daarin wordt elke bal voorgesteld als een hoofdletter die de kleur van de bal aangeeft (dezelfde letters stellen ballen met dezelfde kleur voor). Elke proefbuis wordt beschreven door de opeenvolging van de ballen die erin zitten (opgelijst van onder naar boven). De opeenvolgende proefbuizen worden telkens van elkaar gescheiden door een komma (,). Zo stelt PG,GR,PR bijvoorbeeld de configuratie van drie proefbuizen voor die te zien is in de eerste afbeelding in de inleiding, waarbij de hoofdletter P een paarse bal voorstelt, G een groene bal en R een rode bal.
Bij het aanmaken van een simulatie (Eureka) kan optioneel nog een tweede argument doorgegeven worden: een Object waarmee bijkomende eigenschappen kunnen ingesteld worden. Als deze eigenschappen niet ingesteld worden, dan vallen ze terug op een standaardwaarde:
Met de eigenschap maximum kan de maximale capaciteit (Number) van de proefbuizen ingesteld worden (standaardwaarde: 4). Als één van de proefbuizen in de gegeven configuratie de maximale capaciteit overschrijdt, dan moet er een Error opgeworpen worden met de boodschap ongeldige configuratie.
Met de eigenschap omgekeerd kan het volgnummer (Number) ingesteld worden van een proefbuis die omgekeerd staat. Standaard staan alle proefbuizen rechtop. Als er een ongeldig volgnummer wordt doorgegeven, dan moet er een Error opgeworpen worden met als boodschap ongeldige configuratie.
Daarnaast moet je op een simulatie $$s$$ (Eureka) minstens de volgende methoden kunnen aanroepen:
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een stringvoorstelling (String) teruggeven van de opstelling van de proefbuizen in simulatie $$s$$. Het formaat van die stringvoorstelling kan afgeleid worden uit onderstaand voorbeeld. Daarbij geven de bovenkant (= =) en de onderkant (===) van elke proefbuis aan of de buis rechtop of omgekeerd staat. De proefbuizen worden in de stringvoorstelling telkens van elkaar gescheiden door één enkele spatie.
Een methode omkeren waaraan het volgnummer (Number) van een proefbuis in simulatie $$s$$ moet doorgegeven worden. De methode moet de aangegeven proefbuis omkeren, waarbij moet gelden dat er hoogstens één proefbuis omgekeerd staat. Het is dus enkel toegelaten om een proefbuis om te keren als alle proefbuizen rechtop staan of om de omgekeerde proefbuis terug rechtop te zetten. De methode moet een verwijzing naar simulatie $$s$$ teruggeven. Als er een ongeldig volgnummer aan de methode wordt doorgegeven of als de aangegeven proefbuis niet mag omgekeerd worden, dan moet er een Error opgeworpen worden met als boodschap ongeldige zet.
Een methode verplaatsen waaraan twee volgnummers (Number) van proefbuizen in simulatie $$s$$ moeten doorgegeven worden: i) de proefbuis van waaruit de methode de ballen moet verplaatsen en ii) de proefbuis waarnaar de methode de ballen moet verplaatsen. Daarnaast heeft de methode ook nog een derde optionele parameter waaraan het aantal ballen (Number) kan doorgegeven worden dat moet verplaatst worden. Standaard worden alle ballen uit de proefbuis verplaatst. Het is niet toegelaten om ballen te verplaatsen als er een proefbuis omgekeerd staat, en bij het verplaatsen mag de maximale capaciteit van de proefbuizen niet overschreden worden. De methode moet een verwijzing naar simulatie $$s$$ teruggeven. Als er een ongeldig volgnummer aan de methode wordt doorgegeven, als er minder ballen in de proefbuis zitten dan dat er moeten verplaatst worden of als het verplaatsen niet toegelaten is, dan moet er een Error opgeworpen worden met als boodschap ongeldige zet. In dat geval mag de configuratie van de gekleurde ballen in simulatie $$s$$ ook niet gewijzigd worden.
Een methode equals waaraan een andere simulatie $$t$$ (Eureka) moet doorgegeven worden. De methode moet een Booleaanse waarde (Boolean) teruggeven die aangeeft of de simulaties $$s$$ en $$t$$ gelijk zijn. Dat is het geval als de gekleurde ballen in dezelfde volgorde in de proefbuizen liggen (van boven naar onder). Daarbij speelt de volgorde van de proefbuizen (van links naar rechts) geen rol. Ook het omkeren van proefbuizen en de maximale capaciteit van de proefbuizen speelt geen rol.
> const spel = new Eureka("RPG,G,PR")
> console.log(spel.toString())
= = = = = =
| | | | | |
|G| | | | |
|P| | | |R|
|R| |G| |P|
=== === ===
> console.log(spel.verplaatsen(0, 1, 1).toString())
= = = = = =
| | | | | |
| | | | | |
|P| |G| |R|
|R| |G| |P|
=== === ===
> console.log(spel.verplaatsen(1, 2, 2).toString())
= = = = = =
| | | | |G|
| | | | |G|
|P| | | |R|
|R| | | |P|
=== === ===
> console.log(spel.verplaatsen(0, 1, 1).toString())
= = = = = =
| | | | |G|
| | | | |G|
| | | | |R|
|R| |P| |P|
=== === ===
> console.log(spel.verplaatsen(2, 1, 1).verplaatsen(2, 0, 1).toString())
= = = = = =
| | | | | |
| | | | | |
|G| |G| |R|
|R| |P| |P|
=== === ===
> console.log(spel.omkeren(2).toString())
= = = = ===
| | | | | |
| | | | | |
|G| |G| |P|
|R| |P| |R|
=== === = =
> spel.equals(new Eureka("RP,RG,PG"))
true
> spel.equals(new Eureka("PR,RG,PG"))
false
> spel.omkeren(100) // verkeerde positie van buis
Error: ongeldige zet
> spel.omkeren(0) // er is al een buis omgekeerd
Error: ongeldige zet
> spel.verplaatsen(0, 1) // er is een buis omgekeerd
Error: ongeldige zet
> console.log(spel.omkeren(2).toString())
= = = = = =
| | | | | |
| | | | | |
|G| |G| |R|
|R| |P| |P|
=== === ===
> spel.verplaatsen(0, 100) // verkeerde positie van buis
Error: ongeldige zet
> spel.verplaatsen(100, 0) // verkeerde positie van buis
Error: ongeldige zet
> spel.verplaatsen(0, 0) // buis kan je niet in zichzelf overgieten
Error: ongeldige zet
> console.log(spel.verplaatsen(0, 1).toString())
= = = = = =
| | |R| | |
| | |G| | |
| | |G| |R|
| | |P| |P|
=== === ===
> spel.verplaatsen(2, 1) // buis 1 zit al vol
Error: ongeldige zet
> console.log(spel.verplaatsen(0, 1).toString())
= = = = = =
| | |R| | |
| | |G| | |
| | |G| |R|
| | |P| |P|
=== === ===