Ga naar hoofdinhoud

Bouwsteen 4 — result(bord, zet)

Leerdoel: je past een zet toe op een bord zonder het oorspronkelijke bord te veranderen. Dit is de eerste functie die een eerder geschreven functie (player) hergebruikt.

Wat doet deze functie?

result(bord, zet) geeft een nieuw bord terug waarop de zet is toegepast. Welke speler de zet doet, bepaal je met player(bord) uit bouwsteen 2.

Het originele bord mag je niet veranderen. Minimax gaat straks honderden zetten proberen zonder het echte spel aan te raken, en dat lukt alleen als elke result-aanroep een vers bord teruggeeft.

Waarom is dit subtiel?

In Python werken lijsten met referenties. Als je schrijft

nieuw_bord = bord
nieuw_bord[0][0] = "X"

dan verander je ook het originele bord. nieuw_bord is geen kopie, het is een tweede naam voor hetzelfde object. Wat je nodig hebt is een diepe kopie, uit de standaardbibliotheek copy:

import copy
nieuw_bord = copy.deepcopy(bord)

deepcopy maakt een volledig onafhankelijke kopie, ook van de rijen binnenin. Daarna kun je nieuw_bord[0][0] = "X" doen zonder dat bord verandert.

Specificatie

  • Input: een bord en een zet (tuple (i, j)).
  • Output: een nieuw bord met de zet van de huidige speler ingevuld op (i, j).
  • Voorbeeld:
    bord = leeg
    result(bord, (1, 1)) → bord met "X" in het midden
    bord is daarna NOG STEEDS leeg

Voorspel

Wat denk je dat dit print?

import copy

origineel = [
[None, None, None],
[None, None, None],
[None, None, None],
]

kopie = copy.deepcopy(origineel)
kopie[0][0] = "X"

print("origineel:", origineel)
print("kopie: ", kopie)
Antwoord
origineel: [[None, None, None], [None, None, None], [None, None, None]]
kopie: [['X', None, None], [None, None, None], [None, None, None]]

deepcopy heeft een onafhankelijke kopie gemaakt; het origineel blijft zoals het was.

Bouw zelf en test

Boven de starter staan twee functies die je al hebt, initial_state en player. Vul result aan.

Python
Code-omgeving wordt voorbereid…
Tip

Vier regels werk: een deepcopy maken, rij en kolom uit de tuple halen, de cel in de kopie vullen, de kopie teruggeven. Rij en kolom haal je uit de tuple met i, j = zet; dat heet tuple-unpacking.

Vraag aan player wie aan zet is op het originele bord, niet op de kopie nadat je de cel hebt gevuld: dan telt de kopie één zet extra en geeft player de verkeerde speler.

Antwoord
def result(bord, zet):
nieuw = copy.deepcopy(bord)
i, j = zet
nieuw[i][j] = player(bord)
return nieuw

bord blijft onaangeraakt; alleen nieuw krijgt de zet.

Door naar bouwsteen 5: winner →.