Bouwsteen 5 — winner(bord)
Leerdoel: je checkt drie rijen, drie kolommen en twee diagonalen om te bepalen of iemand heeft gewonnen.
Wat doet deze functie?
winner(bord) geeft terug wie drie op een rij heeft. Tic-tac-toe heeft
acht lijnen waarop dat kan: drie rijen, drie kolommen en twee
diagonalen. Is geen enkele lijn gevuld met dezelfde speler, dan geef je
None terug.
Specificatie
- Input: een
bord. - Output:
"X","O"ofNone. - Voorbeelden:
- X vol op rij 0 →
"X". - O op de hoofd-diagonaal →
"O". - Leeg bord →
None. - Vol bord zonder drie-op-een-rij →
None.
- X vol op rij 0 →
Hoe controleer je een lijn?
Een lijn is een rij van drie cellen, en X heeft hem gewonnen als alle
drie "X" zijn. Voor O hetzelfde. De check in één regel:
if rij[0] == rij[1] == rij[2] and rij[0] is not None:
return rij[0] # de winnaar
De and rij[0] is not None hoort erbij: drie keer None is ook drie
keer hetzelfde, en dat mag niet tellen als winnaar.
Voorspel
Welke lijn is winnend op dit bord?
bord = [
["X", "O", "X"],
["O", "X", "O"],
["O", "X", "X"],
]
Antwoord
De anti-diagonaal (0,2) (1,1) (2,0) is X X O, niet winnend. De
hoofddiagonaal (0,0) (1,1) (2,2) is X X X: X wint. In de rijen en
kolommen staat nergens drie op een rij. Dus winner(bord) geeft "X".
Bouw zelf en test
Tip
De rij-check staat er al. Een kolom j bestaat uit bord[0][j],
bord[1][j] en bord[2][j]: dezelfde vergelijking, in een lus over
j. De twee diagonalen zijn elk één if met de drie cellen uit het
commentaar.
Helemaal aan het eind blijft return None staan: geen winnaar gevonden.
Antwoord
def winner(bord):
for rij in bord:
if rij[0] == rij[1] == rij[2] and rij[0] is not None:
return rij[0]
for j in range(3):
if bord[0][j] == bord[1][j] == bord[2][j] and bord[0][j] is not None:
return bord[0][j]
if bord[0][0] == bord[1][1] == bord[2][2] and bord[0][0] is not None:
return bord[0][0]
if bord[0][2] == bord[1][1] == bord[2][0] and bord[0][2] is not None:
return bord[0][2]
return None
Acht lijnen, vier checks: drie rijen in één lus, drie kolommen in één lus, en de twee diagonalen los.
Door naar bouwsteen 6: terminal →.