diff --git a/Model/Sources/Model/Board.swift b/Model/Sources/Model/Board.swift index 16ea9fc..03a53cb 100644 --- a/Model/Sources/Model/Board.swift +++ b/Model/Sources/Model/Board.swift @@ -10,26 +10,26 @@ import Foundation public struct Board { let rowNb: Int let columnNb: Int - var grid: [[Int]] + var grid: [[PlayerId]] init(rowsNb: Int = 6, columnsNb: Int = 7) { rowNb = rowsNb columnNb = columnsNb - grid = Array(repeating: Array(repeating: 0, count: columnsNb), count: rowsNb) + grid = Array(repeating: Array(repeating: PlayerId.empty, count: columnsNb), count: rowsNb) } - subscript(row: Int, column: Int) -> Int { - get { - guard row >= 0 && row < rowNb && column >= 0 && column < columnNb else { - fatalError("Out of board") - } - return grid[row][column] + subscript(row: Int, column: Int) -> PlayerId { + get { + guard row >= 0 && row < rowNb && column >= 0 && column < columnNb else { + fatalError("Out of board") } - set { - guard row >= 0 && row < rowNb && column >= 0 && column < columnNb else { - fatalError("Out of board") - } - grid[row][column] = newValue + return grid[row][column] + } + set { + guard row >= 0 && row < rowNb && column >= 0 && column < columnNb else { + fatalError("Out of board") } + grid[row][column] = newValue } + } } diff --git a/Model/Sources/Model/Connect4Rules.swift b/Model/Sources/Model/Connect4Rules.swift new file mode 100644 index 0000000..441ecbb --- /dev/null +++ b/Model/Sources/Model/Connect4Rules.swift @@ -0,0 +1,97 @@ +// +// Connect4Rules.swift +// +// +// Created by Adam BONAFOS on 14/01/2025. +// + +import Foundation +public struct Connect4Rules : Rules { + let piecesToAlign: Int + + init(piecesToAlign: Int) { + self.piecesToAlign = piecesToAlign + } + + func add(board: inout Board, position pos: (Int, Int), playerId: PlayerId) -> Bool { + var currentRowNb = 0; + for var row in board.grid { + if row[pos.1] != PlayerId.empty && currentRowNb != 0 { + row[currentRowNb - 1] = playerId + return true + } + currentRowNb += 1 + } + return false + } + + func isGameOver(board: Board) -> (Bool, PlayerId) { + // Vérification générale avec le nombre de pièces à aligner + let maxRow = board.rowNb + let maxCol = board.columnNb + + // Vérification horizontale + for row in 0.. Bool { + var currentPos = start + let player = board[start.0, start.1] + guard player != .empty else { return false } + + for _ in 1..= board.rowNb || + currentPos.1 < 0 || currentPos.1 >= board.columnNb || + board[currentPos.0, currentPos.1] != player { + return false + } + } + + return true + } +} diff --git a/Model/Sources/Model/Player.swift b/Model/Sources/Model/Player.swift new file mode 100644 index 0000000..cc3bbc3 --- /dev/null +++ b/Model/Sources/Model/Player.swift @@ -0,0 +1,13 @@ +// +// File.swift +// +// +// Created by Adam BONAFOS on 14/01/2025. +// + +import Foundation +enum PlayerId { + case empty + case player1 + case player2 +} diff --git a/Model/Sources/Model/Rules.swift b/Model/Sources/Model/Rules.swift new file mode 100644 index 0000000..4352425 --- /dev/null +++ b/Model/Sources/Model/Rules.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Adam BONAFOS on 14/01/2025. +// + +import Foundation +protocol Rules { + func add(board: inout Board, position pos: (Int, Int), playerId: PlayerId) -> Bool + func isGameOver(board: Board) -> (Bool, PlayerId) +} diff --git a/Model/Sources/Model/TicTacToeRules.swift b/Model/Sources/Model/TicTacToeRules.swift new file mode 100644 index 0000000..93426ad --- /dev/null +++ b/Model/Sources/Model/TicTacToeRules.swift @@ -0,0 +1,21 @@ +// +// File.swift +// +// +// Created by Adam BONAFOS on 14/01/2025. +// + +import Foundation +public struct TicTacToeRules: Rules { + func add(board: inout Board, position pos: (Int, Int), playerId: PlayerId) -> Bool { + if board[pos.0, pos.1] == .empty { + board[pos.0, pos.1] = playerId + return true + } + return false + } + + func isGameOver(board: Board) -> (Bool, PlayerId) { + <#code#> + } +}