Ga naar hoofdinhoud

9.10 Bouwsteen 4 — result(bord, zet)

Leerdoel: je past een zet toe op een bord — zonder het oorspronkelijke bord te veranderen. 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 pagina 7).

Belangrijk: het originele bord mag je niet veranderen. Minimax moet straks honderden zetten "proberen" zonder het echte spel te beïnvloeden. 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.

Oplossing: diepe kopie maken met de standaardbibliotheek copy:

import copy
nieuw_bord = copy.deepcopy(bord)

deepcopy maakt een volledig onafhankelijke kopie, ook van de rijen binnenin. Dan 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 onaangeraakt.

Bouw zelf en test

Boven de starter staan je twee al-werkende functies van vorige pagina's (initial_state en player). Vul result aan.

Python
Code-omgeving wordt voorbereid…
Tip

Drie regels werk:

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

i, j = zet is tuple-unpacking: pak rij en kolom los uit de tuple.

Belangrijk: roep player(bord) aan vóór je de cel invult — want de wijziging telt het bord er één extra zet, en zou player het verkeerde antwoord geven.

Door naar stap 11: bouwsteen 5 — winner →.