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.
- Python Lijsten
- Python De for-loop
- Python F-strings
- Python Tuples
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:
| 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, 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
Door alle cellen lopen
Dit doe je straks in bijna elke functie: twee geneste lussen, één voor de rijen en één voor de 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 bouwstenen hierna bouw je éé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? |
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 →.