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 klassen GrensStrategie en FraudeStrategie. Daarna worden deze klassen gebruikt om een groot aantal spelrondes te spelen in de klasse KaartSpel.

Klasse GrensStrategie

Programmeer in deze klasse het volgende:

Voorbeel

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]'

Klasse FraudeStrategie

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:

Voorbeeld

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]'

Klasse KaartSpel

Programmeer in deze klasse: