9.4 Het bord in Python
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: een lijst van drie lijsten. Elke binnenste lijst is één rij.
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:
| Waarde | Betekent |
|---|---|
"X" | X heeft hier gespeeld |
"O" | O heeft hier gespeeld |
None | leeg (None is Python's "niets") |
CS50 noemt deze X, O en EMPTY (constanten). Wij gebruiken de
strings "X", "O" en de waarde None direct — dat is precies
hetzelfde, alleen zonder de constanten.
Een zet = een tuple
Een zet is een coordinaat: "speel op rij i, kolom j". We schrijven dat als een tuple:
zet = (2, 1) # rij 2, kolom 1 (midden-onder)
Een tuple is een vast rijtje. 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
Door alle cellen lopen
We doen dit in elke functie. Twee genestelde lussen, één voor rijen en één voor kolommen:
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 volgende 8 pagina's bouwen we één voor één deze functies:
| Functie | Wat 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? |
minimax(bord) | de AI: welke zet is optimaal? |
Eerst nog één pagina over hoe deze functies samenwerken.
Door naar stap 5: functies werken samen →.