Bouwsteen 6 — terminal(bord)
Leerdoel: je bepaalt of een spel afgelopen is. Deze functie gebruikt
jouw winner uit bouwsteen 5, precies het patroon van
functies in functies.
Wat doet deze functie?
terminal(bord) geeft True terug als het spel klaar is, anders
False. Een spel is klaar in twee gevallen: er is een winnaar, of er
is geen lege cel meer. Eén van de twee is genoeg. Geen winnaar en nog
lege cellen, dan gaat het spel door.
Functies stapelen
Deze functie gebruikt winner(bord) uit bouwsteen 5, in plaats van de
check opnieuw te schrijven:
def terminal(bord):
if winner(bord) is not None:
return True
# geen winnaar — check of er nog lege cellen zijn
...
terminal doet zelf weinig nieuw werk: het zoeken naar drie op een rij
laat hij aan winner over. Dat is waar
functies in functies over ging.
Specificatie
- Input: een
bord. - Output:
TrueofFalse.
Voorspel
Voor elk van deze borden — terminal of niet?
a = [[None]*3, [None]*3, [None]*3] # leeg
b = [["X","X","X"], ["O","O",None], [None]*3] # X wint
c = [["X","O","X"], ["O","X","O"], ["X","O","X"]] # vol, geen winnaar
d = [["X","O","X"], ["O",None,None], [None]*3] # spel loopt nog
Antwoord
a is niet terminal: leeg en geen winnaar. b wel, X wint. c ook,
het bord is vol en het is remise. d niet: er zijn lege cellen en geen
winnaar.
Bouw zelf en test
Tip
Eerst winner(bord): is die niet None, dan is het klaar. Daarna loop
je door alle cellen. Vind je een None, dan is er nog een zet mogelijk
en ben je meteen klaar met False. Kom je de lus uit zonder een None
te vinden, dan is het bord vol.
Antwoord
def terminal(bord):
if winner(bord) is not None:
return True
for rij in bord:
for cel in rij:
if cel is None:
return False
return True
De return False staat ín de lus: bij de eerste lege cel weet je
genoeg. De return True erna wordt alleen bereikt als de lus geen
enkele lege cel vond.
Door naar bouwsteen 7: utility →.