Een kaartspel wordt gespeeld met een stapel kaarten, een "deck" genoemd. Elke kaart heeft een numerieke waarde. De bedoeling is dat een speler een kaart vraagt van de gedekte stapel, en hierbij een waarde in zijn hand realiseert die zo dicht mogelijk ligt bij een vooropgegeven waarde $$N$$, zonder die $$N$$ te overtreffen.
In deze oefening bouwen we eerst twee klassen die een strategie vastleggen op basis waarvan de speler beslist hoeveel kaarten hij/zij wenst te nemen, namelijk de klassenGrensStrategie
en FraudeStrategie
.
Daarna worden deze klassen gebruikt om een groot aantal spelrondes te spelen in de klasse KaartSpel
.
__str__()
levert volgende string-gedaante: $$\verb!GrensStrategie[grens]!$$ waarbij
de grens $$g$$ tussen de vierkante haakjes weergegeven wordt. neem_kaarten()
heeft als argumenten:
stapel = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6] s = GrensStrategie(11) str(s) # 'GrensStrategie[11]' kaarten, stapel, aflegstapel = s.neem_kaarten(stapel, [], 6) str(kaarten) # '[1, 2, 3, 4, 5]' str(stapel) # '[6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]' str(aflegstapel) # '[1, 2, 3, 4, 5]'
In deze klasse implementeren we een frauduleuze strategie: de speler kan een kaart bekijken vooraleer te beslissen om ze al dan niet te nemen (je kan dus een kaart terugleggen).
De klasse FraudeStrategie
erft over van de klasse GrensStrategie
en overschrijft volgende methodes van
de klasse GrensStrategie
:
__str__()
levert nu als resultaat de string $$\verb!FraudeStrategie[grens]!$$ waarbij opieuw de grens
tussen de vierkante haakjes als geheel getal weergegeven wordt.neem_kaarten()
met zelfde argumenten en resultaten als in de klasse GrensStrategie
realiseert nu
een andere strategie: je neemt kaarten zoals in de klasse GrensStrategie
. Indien de som van de waarden van de kaarten kleiner of gelijk is
aan de grens, is het resultaat identiek aan het resultaat van de gelijknamige methode uit de klasse GrensStrategie
. Indien echter
de laatst genomen kaart ervoor zorgt dat de grens
overschreden wordt (dus gezamenlijke waarde strikt groter dan de grens), dan leg je die laatstgenomen kaart terug. In dit geval van overschrijden betekent dit concreet dat :
GrensStrategie
. De laast genomen
kaart wordt immers teruggelegd (en die kaart verdwijnt dus uit de lijst genomen kaarten). GrensStrategie
. De kaart
wordt dus teruggelegd op de stapel niet gebruikte kaarten, en deze kaart is de eerstvolgende die genomen wordt in de volgende ronde.GrensStrategie
. De
laatst genomen kaart wordt immers teruggelegd op de stapel niet-gebruikte kaarten, en komt dus niet op de aflegstapel terecht!stapel = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6] s = FraudeStrategie(11) str(s) # 'FraudeStrategie[11]' kaarten, stapel, aflegstapel = s.neem_kaarten(stapel, [], 6) str(kaarten) # '[1, 2, 3, 4]' str(stapel) # '[5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]' str(aflegstapel) # '[1, 2, 3, 4]'
__str__()
levert volgende stringgedaante $$\verb![N,maximum]!$$, dus de waarden van de parameters $$N$$ en $$maximum$$ (zie constructor), gescheiden door
een komma en tussen vierkante haakjes (geen spaties).
speel_rondes()
: deze methode heeft als doel een aantal spelrondes te spelen, en hierbij een bepaalde
strategie te volgen. Er zijn twee stapels kaarten, namelijk een stapel van nog niet genomen kaarten, en een stapel van
kaarten die al gebruikt werden (de aflegstapel). In elke ronde neemt de speler kaarten (van de nog niet gebruikte stapel kaarten)
volgens een bepaalde strategie.
Er wordt gekeken hoeveel punten hij/zij in deze ronde haalt (om dit aantal punten te bepalen, worden hieronder de regels gegeven).
Daarna legt de speler de genomen kaarten op de aflegstapel, en neemt (opnieuw dezelfde strategie volgend) een aantal kaarten. Dit
herhaalt zich voor het opgegeven aantal rondes. Indien er onvoldoende kaarten overblijven op de stapel (meer specifiek indien het
aantal kaarten kleiner is dan het aantal kaarten dat een speler mag nemen $$maximum$$), dan wordt een verse stapel kaarten genomen, en
wordt de aflegstapel leeg gemaakt.
Het resultaat is het totaal aantal punten dat een speler verzamelt na het spelen van die rondes, indien hij/zij
de opgegeven strategie volgt. De methode heeft als argumenten:
neem_kaarten()
beschikt, zoals voorhanden in de klassen GrensStrategie
en
FraudeStrategie
random.shuffle(stapel), de aflegstapel is uiteraard leeg
random.shuffle(stapel)dooreen te halen, en de aflegstapel leeg te maken)
neem_kaarten()
van de strategie (eerste argument) spel = KaartSpel([1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5], 10, 3, 10) str(spel) # '[10,3]' g = GrensStrategie(8) f = FraudeStrategie(10) punten_grens = spel.speel_rondes(g, 25) # '80.0' punten_fraude = spel.speel_rondes(f, 25) # '203.0'