diff --git a/Model/Sources/Model/VerySimpleRules.swift b/Model/Sources/Model/VerySimpleRules.swift index 6215b02..b30f6a4 100644 --- a/Model/Sources/Model/VerySimpleRules.swift +++ b/Model/Sources/Model/VerySimpleRules.swift @@ -8,36 +8,35 @@ import Foundation struct VerySimpleRules: Rules { + var occurences = [Board: Int]() var historic = [Move]() static func createBoard() -> Board { var cells = [[Cell]]() - + // Configuration initiale du plateau let initialSetup: [Animal?] = [.lion, .tiger, .rat, .cat, .elephant] let rows = 5 let columns = 5 - + for row in 0.. Owner { @@ -50,7 +49,7 @@ struct VerySimpleRules: Rules { guard b.nbRows == 5, b.nbColumns == 5 else { throw InvalidBoardError.badDimensions(b.nbRows, b.nbColumns) } - + // Vérifier la conformité des cellules (e.g., types de cellules, pièces présentes) for row in 0.. [Move] { var moves = [Move]() - + for row in 0..= 0, newRow < board.nbRows, newCol >= 0, newCol < board.nbColumns, - let destinationCell = board.grid[newRow][newCol], - destinationCell.piece?.owner != owner { - moves.append(Move(owner: owner, rowOrigin: row, columnOrigin: column, rowDestination: newRow, columnDestination: newCol)) + + if newRow >= 0, newRow < board.nbRows, newCol >= 0, newCol < board.nbColumns { + let destinationCell = board.grid[newRow][newCol] + if destinationCell.piece?.owner != owner { + moves.append(Move(owner: owner, rowOrigin: row, columnOrigin: column, rowDestination: newRow, columnDestination: newCol)) + } } + + return moves } - return moves } - + func isMoveValid(board: Board, move: Move) -> Bool { // Vérifier si les coordonnées de destination sont valides if move.rowDestination < 0 || move.rowDestination >= board.nbRows || - move.columnDestination < 0 || move.columnDestination >= board.nbColumns { + move.columnDestination < 0 || move.columnDestination >= board.nbColumns { return false } - + // Vérifier si la case de destination est occupée par une pièce du même joueur - if let destinationCell = board.grid[move.rowDestination][move.columnDestination], - let piece = destinationCell.piece, - piece.owner == move.owner { + let destinationCell = board.grid[move.rowDestination][move.columnDestination] + if let piece = destinationCell.piece, piece.owner == move.owner { return false } - + // Autres vérifications spécifiques au jeu peuvent être ajoutées ici // ... - + return true } func isMoveValid(board: Board, row: Int, column: Int, rowArrived: Int, columnArrived: Int) -> Bool { - <#code#> + let move = Move(owner: board.grid[row][column].piece?.owner ?? .noOne, + rowOrigin: row, + columnOrigin: column, + rowDestination: rowArrived, + columnDestination: columnArrived) + + return isMoveValid(board: board, move: move) } func isGameOver(board: Board, lastMove: Move) -> (Bool, Result) { // Vérifier si la tannière de l'adversaire a été atteinte - let opponent = lastMove.owner == .player1 ? .player2 : .player1 - if let destinationCell = board.grid[lastMove.rowDestination][lastMove.columnDestination], - destinationCell.cellType == .den, destinationCell.initialOwner == opponent { + var opponent: Owner + if lastMove.owner == .player1 { + opponent = .player2 + } else { + opponent = .player1 + } + let destinationCell = board.grid[lastMove.rowDestination][lastMove.columnDestination] + if destinationCell.cellType == .den, destinationCell.initialOwner == opponent { return (true, .winner(lastMove.owner, .denReached)) } - + // Vérifier si l'adversaire n'a plus de pièces let hasOpponentPieces = board.grid.flatMap { $0 }.contains { cell in guard let piece = cell.piece else { return false } @@ -149,19 +160,26 @@ struct VerySimpleRules: Rules { if !hasOpponentPieces { return (true, .winner(lastMove.owner, .noMorePieces)) } - + // Vérifier si l'adversaire ne peut plus bouger - let opponentMoves = getMoves(board: board, owner: opponent) + let opponentMoves = getMoves(board: board, owner: opponent) if opponentMoves.isEmpty { return (true, .winner(lastMove.owner, .noMovesLeft)) } - + // Si aucune condition de victoire n'est remplie, la partie n'est pas encore terminée return (false, .notFinished) } func playedMove(move: Move, oldBoard: Board, newBoard: Board) { - <#code#> + // ToDo + // Ajouter le mouvement à l'historique + // historic.append(move) + + // Mise à jour du comptage des occurrences pour le nouveau plateau + // occurences[newBoard, default: 0] += 1 + } + }