====== 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 ==== * Vi vil behandle engine-API’et som systemets grænseflade * Og lade tests simulere en aktør Jeg har identificeres følgende use-cases for kryds og bolle. * UC1 – Initialisere spil * UC2 – Placere brik * UC3 – Afvise ugyldigt træk * UC4 – Registrere sejr * UC5 – Registrere uafgjort * UC6 – Nulstille spil ----- 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