Kryds & Bolle – the TDD way
System
Engine-klasse der håndterer:
int[][] board = new int[3][3]
To spillere. currentPlayer (1 eller 2)
gameState (RUNNING, WON, DRAW)
Software skal som udgangspunkt ikke have en GUI.
Use-cases
Jeg har identificeres følgende use-cases for kryds og bolle.
Hvilke use cases kan vi implementere først, så andre bliver lettere?
Hvis en use case kræver en anden for at give mening, så implementér den anden først.
UC1 – Initialisere spil
Trigger: Opret engine eller kald reset()
System:
board fyldes med 0
currentPlayer = 1
gameState = RUNNING
Tests:
shouldInitializeBoardWithZeros()
shouldSetCurrentPlayerToOne()
UC2 – Placere brik
Trigger: placeMark(row, col)
Forudsætninger:
gameState == RUNNING
Felt er tomt
Position er gyldig (0-2)
System:
board[row][col] = currentPlayer
Tjek for sejr/uafgjort
Skift spiller hvis spil fortsætter
Return true
Tests:
shouldPlaceMarkOnEmptyField()
shouldSwitchPlayerAfterMove()
UC3 – Afvise ugyldigt træk
Situationer:
Felt optaget
Spil afsluttet
Ugyldig position
System:
Ingen ændring i board
currentPlayer ændres ikke
Return false
Tests:
shouldNotPlaceOnOccupiedField()
shouldNotAllowMoveWhenGameIsOver()
UC4 – Registrere sejr
Trigger: Efter gyldigt træk
System:
3 ens i række, kolonne eller diagonal
gameState = WON
Spillet stopper
Tests:
shouldDetectHorizontalWin()
shouldDetectVerticalWin()
shouldDetectDiagonalWin()
UC5 – Registrere uafgjort
Trigger: Efter gyldigt træk
Forudsætning:
Board fuldt
Ingen vinder
System:
gameState = DRAW
Test:
shouldDetectDraw()
TDD Arbejdsgang
For hver use case:
Skriv én test
Se den fejle
Implementér minimal kode
Refaktorér
Gentag