Proloog

Dit kaartspel verloopt, zoals de titel suggereert, in 10 fasen. Elke fase is verschillend en verlangt zijn eigen strategie. Het doel van dit spel is om, door het verzamelen en uitleggen van de kaarten, 10 verschillende combinaties van kaarten uit te spelen. Die 10 combinaties moeten in een welbepaalde volgorde uitgespeeld worden. De eerste fase moet je 2 drielingen (= drie kaarten met zelfde cijfer, kleur maakt niet uit) spelen, tijdens de tweede fase moet 1 drieling en een reeks van 4 kaarten samen stellen. Dit gaat zo verder tot fase 10 waar je 1 vijfling en 1 drieling moet hebben. Wie aan de beurt is, moet eerst een kaart van de verdekte of aflegstapel nemen, kan vervolgens een fase uitspelen en moet een kaart op de aflegstapel leggen om zijn speelbeurt te eindigen. Als je zelf reeds een fase op tafel liggen hebt tijdens die ronde, mag je aanvullend extra kaarten bij uitgespeelde fases van om het even wie aanleggen. Zo kan je je voorraad handkaarten uiteindelijk uitspelen. Slaagt iemand daarin, dan ontvangen de andere spelers strafpunten per overgebleven handkaart.

Alle kaarten worden opnieuw geschud en een nieuwe ronde start. Noteer wie reeds welke fase bereikt heeft en hoeveel strafpunten de spelers ontvangen per beëindigde ronde.

Oefening

Als oefening zullen we een aantal zaken vanuit de game automatiseren a.d.h.v. functies.

Achtergrondinformatie

  1. We zullen een kaart voorstellen door een tuple. Deze tuple bestaat uit twee elementen. Het eerste element is de getal waarde. Er bestaan kaarten van 1 tot en met 12. Vervolgens heeft de kaart ook een kleurwaarde. Een kaart kan volgende kleuren aannemen: Blauw, Rood, Groen of Geel. Merk op dat in het echte spel er ook twee speciale kaarten zijn. Voor eenvoudigheid zullen we deze niet opnemen in deze oefening.
  2. We zullen een hand voorstellen door een lijst. In deze lijst dienen 10 kaarten (zie punt 1) te zitten. Merk op dat de volgorde van een hand niet belangrijk is en dat een hand meerdere van dezelfde kaarten mag/kan hebben.
  3. Om te mogen afleggen moeten een bepaald aantal van jouw kaarten een bepaalde structuur volgen. We zullen een structuur voorstellen a.d.h.v. een string. Er zijn 3 type structuren. (1) De eerste structuur is nA met n een natuurlijk getal (n kaarten met zelfde getal waarde; noteer dat n steeds tussen 1 en 9 is). (2) De tweede structuur is nK (n kaarten met zelfde kleurwaarde; noteer dat n steeds tussen 1 en 9 is). (3) De derde structuur is A … X (met X een hoofdletter in het alfabet en … de hoofdletters uit het alfabet tussen A en X. Bijvoorbeeld ABCDE).
  4. In het echte spel is afleggen iets complexer maar hier werken we een vereenvoudigde versie af. Je mag afleggen indien een aantal kaarten uit jouw hand de gewenste structuur volgen.
  5. Om eenvoudig te controleren of je een hand kan afleggen kan je onderzoeken of er een combinatie van kaarten uit jouw hand bestaat die aan de structuur voldoen. Eerst dien je het aantal kaarten die nodig zijn voor de structuur te bepalen. Vervolgens maak itereer je door alle combinatie met deze lengte van kaarten uit jouw hand. Dit kan je eenvoudig doen met de module itertools1. De functie combinations in deze module doet deze stap voor jou. De functie neemt twee argumenten: (1) een collectie om combinaties van te maken en (2) het aantal elementen dat je in elke combinatie wilt hebben. Bekijk volgend voorbeeld om de functie goed te begrijpen.
import itertools

l = [('a', 'b'), (1, 2), (2, 3), (4, 5)]
for i in itertools.combinations(l, 2):
    print(list(i))

Voorbeeld

>>> iskaart((5, "Blauw"))
True
>>> iskaart((7, "Oranje"))
False
>>> h1 = [(4, 'Geel'), (12, 'Groen'), (5, 'Blauw'), (1, 'Geel'), (1, 'Blauw'), (1, 'Blauw'), (1, 'Rood'), (7, 'Blauw'), (12, 'Blauw'), (5, 'Groen')]
>>> h2 = [(4, 'Grijs'), (14, 'Groen'), (5, 'Blauw'), (1, 'Geel'), (1, 'Blauw'), (1, 'Blauw'), (1, 'Rood'), (7, 'Blauw'), (12, 'Blauw'), (5, 'Groen')]
>>> iskaarten(h1[:-1])
True
>>> ishand(h1)
True
>>> ishand(h2)
False
>>> s1a = '3A'
>>> s1b = '10A'
>>> s2a = '3K'
>>> s2b = '5J'
>>> s3a = 'ABCD'
>>> s3b = 'ABCE'
>>> isstructuur1(s1a)
True
>>> isstructuur1(s1b)
False
>>> isstructuur2(s2a)
True
>>> isstructuur2(s2b)
False
>>> isstructuur3(s3a)
True
>>> isstructuur3(s3b)
False
>>> isstructuur(s1a)
True
>>> isstructuur(s3b)
False
>>> structuur2aantal(s1a)
3
>>> structuur2aantal(s3a)
4
>>> volgt_structuur1([(5, "Blauw"), (5, "Groen"), (5, "Groen")], s1a)
True
>>> volgt_structuur1([(5, "Blauw"), (10, "Groen"), (5, "Groen")], s1a)
False
>>> volgt_structuur2([(7, "Groen"), (5, "Groen"), (4, "Groen")], s2a)
True
>>> volgt_structuur2([(7, "Groen"), (5, "Groen"), (4, "Geel")], s2a)
False
>>> sorteer_op_getalwaarde([(7, "Groen"), (5, "Groen"), (4, "Groen"), (6, "Rood")])
[(4, 'Groen'), (5, 'Groen'), (6, 'Rood'), (7, 'Groen')]
>>> volgt_structuur3([(7, "Groen"), (5, "Groen"), (4, "Groen"), (6, "Rood")], s3a)
True
>>> volgt_structuur3([(7, "Groen"), (5, "Groen"), (4, "Geel")], s3a)
False
>>> volgt_structuur([(5, "Blauw"), (5, "Groen"), (5, "Groen")], s1a)
True
>>> volgt_structuur([(7, "Groen"), (5, "Groen"), (4, "Geel")], s3a)
False
>>> afleggen(h1, s2a)
True
>>> afleggen(h2, s2a)
False