Ga naar hoofdinhoud

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" of None.
  • Voorbeelden:
    • X vol op rij 0 → "X".
    • O op de hoofd-diagonaal → "O".
    • Leeg bord → None.
    • Vol bord zonder drie-op-een-rij → None.

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

Python
Code-omgeving wordt voorbereid…
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 →.