Ga naar hoofdinhoud

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: True of False.

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

Python
Code-omgeving wordt voorbereid…
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 →.