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
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
zoals het was.
Bouw zelf en test
Boven de starter staan twee functies die je al hebt, initial_state en
player. Vul result aan.
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 →.