Ga naar hoofdinhoud

Het bord in Python

Hier bouw je op verder: Lijsten, De for-loop, F-strings en Tuples

Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.

Leerdoel: je kunt een tic-tac-toe-bord opslaan in Python, en de afspraken lezen die we straks in elke functie gebruiken.

Het bord = drie rijen​

Een tic-tac-toe-bord is 3 bij 3. In Python wordt dat een lijst van drie lijsten, waarbij elke binnenste lijst één rij is.

bord = [
["X", "O", "X"],
["O", "X", "O"],
[None, None, None],
]

Lees: bovenste rij is X O X, middelste rij is O X O, onderste rij is leeg.

Een cel ophalen​

bord[i][j] geeft de cel op rij i, kolom j. Beide tellen vanaf 0.

kolom 0 kolom 1 kolom 2
rij 0: X O X
rij 1: O X O
rij 2: None None None

Dus bord[0][2] is "X" (rechtsboven), bord[2][1] is None (midden-onder).

Drie waarden per cel​

We gebruiken drie waarden:

WaardeBetekent
"X"X heeft hier gespeeld
"O"O heeft hier gespeeld
Noneleeg (None is Python's "niets")

CS50 noemt deze X, O en EMPTY, als constanten. Wij gebruiken de strings "X", "O" en de waarde None direct; dat is hetzelfde, alleen zonder de constanten.

Een zet = een tuple​

Een zet is een coördinaat: speel op rij i, kolom j. Dat schrijven we als een tuple:

zet = (2, 1) # rij 2, kolom 1 (midden-onder)

Een tuple is een rijtje dat niet meer verandert. zet[0] is 2, zet[1] is 1.

Voorspel​

Wat denk je dat dit print?

bord = [
["X", "O", "X"],
["O", "X", "O"],
[None, None, None],
]

print(bord[0][0])
print(bord[1][2])
print(bord[2][1])
print(bord[2][1] is None)
Antwoord
X
O
None
True

bord[0][0] is linksboven, bord[1][2] is rechts-midden, bord[2][1] is midden-onder (leeg). is None is Python's manier om te checken of een cel leeg is.

Run​

Python
Code-omgeving wordt voorbereid…

Door alle cellen lopen​

Dit doe je straks in bijna elke functie: twee geneste lussen, één voor de rijen en één voor de kolommen.

Python
Code-omgeving wordt voorbereid…
Verwachte uitvoer
bord[0][0] = X
bord[0][1] = O
bord[0][2] = X
bord[1][0] = O
bord[1][1] = X
bord[1][2] = O
bord[2][0] = None
bord[2][1] = None
bord[2][2] = None

Negen cellen, in rij-volgorde.

Wat we hierna gaan doen​

In de bouwstenen hierna bouw je één voor één deze functies:

FunctieWat doet hij
initial_state()maakt een leeg bord
player(bord)bepaalt wie aan zet is (X of O)
actions(bord)geeft alle lege cellen
result(bord, zet)past een zet toe, geeft nieuw bord
winner(bord)wie heeft drie op een rij?
terminal(bord)is het spel afgelopen?
utility(bord)+1, -1 of 0 — wat is de uitkomst?
max_value(bord), min_value(bord)wat is een positie waard als X (of O) aan zet is?
minimax(bord)de AI: welke zet is optimaal?

Eerst nog één pagina over hoe deze functies samenwerken.

Door naar functies werken samen →.