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
bordmag je niet veranderen. Minimax moet straks honderden zetten "proberen" zonder het echte spel te beïnvloeden. Dat lukt alleen als elkeresult-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
borden eenzet(tuple(i, j)). - Output: een nieuw bord met de zet van de huidige speler
ingevuld op
(i, j). - Voorbeeld:
bord = leegresult(bord, (1, 1)) → bord met "X" in het middenbord 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.
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
ná de wijziging telt het bord er één extra zet, en zou player
het verkeerde antwoord geven.
Door naar stap 11: bouwsteen 5 — winner →.