From 3b3bf57d03976e2b4ce7de22888ab418514a7f18 Mon Sep 17 00:00:00 2001 From: "louis.dufour" Date: Sat, 10 Feb 2024 17:24:46 +0100 Subject: [PATCH] Fix(Tp5): Condition de victoire --- DouShouQiConsole/DouShouQiConsole/main.swift | 15 +++++----- Model/Sources/Model/VerySimpleRules.swift | 30 +++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/DouShouQiConsole/DouShouQiConsole/main.swift b/DouShouQiConsole/DouShouQiConsole/main.swift index 06094f4..5d2e507 100644 --- a/DouShouQiConsole/DouShouQiConsole/main.swift +++ b/DouShouQiConsole/DouShouQiConsole/main.swift @@ -96,24 +96,25 @@ func olMain(){ } func main() { - /*guard let randomPlayer = RandomPlayer(withName: "Random Player 1", andId: .player1), + guard let randomPlayer = RandomPlayer(withName: "Random Player 1", andId: .player1), let humanPlayer = HumanPlayer(name: "Human Player 2", id: .player2, inputMethod: { validMoves in return validMoves.first }) else { fatalError("Failed to initialize players") - }*/ + } + /* guard let Humanplayer1 = HumanPlayer(name: "Player 1", id: .player1, inputMethod: { _ in nil }), let Humanplayer2 = HumanPlayer(name: "Player 2", id: .player2, inputMethod: { _ in nil }) else { fatalError("Failed to initialize players") - } + } */ var game = Game( rules: VerySimpleRules(), - // player1: humanPlayer, - // player2: humanPlayer - player1: Humanplayer1, - player2: Humanplayer2 + player1: humanPlayer, + player2: randomPlayer + // player1: Humanplayer1, + // player2: Humanplayer2 ) // Configuration des callbacks pour la gestion des événements de jeu diff --git a/Model/Sources/Model/VerySimpleRules.swift b/Model/Sources/Model/VerySimpleRules.swift index dbd3f03..7a8d939 100644 --- a/Model/Sources/Model/VerySimpleRules.swift +++ b/Model/Sources/Model/VerySimpleRules.swift @@ -21,7 +21,7 @@ public struct VerySimpleRules: Rules { let initialBoardConfiguration: [[Cell]] = [ // Ligne 1 - Joueur 1 [Cell(ofType: .jungle), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player1, andAnimal: .lion)), - Cell(ofType: .den), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player1, andAnimal: .tiger)), + Cell(ofType: .den, ownedBy: Owner.player1), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player1, andAnimal: .tiger)), Cell(ofType: .jungle)], // Ligne 2 - Joueur 1 @@ -40,7 +40,7 @@ public struct VerySimpleRules: Rules { // Ligne 5 - Joueur 2 [Cell(ofType: .jungle), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player2, andAnimal: .tiger)), - Cell(ofType: .den), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player2, andAnimal: .lion)), + Cell(ofType: .den, ownedBy: Owner.player2), Cell(ofType: .jungle, withPiece: Piece(withOwner: .player2, andAnimal: .lion)), Cell(ofType: .jungle)] ] if let board = Board(withGrid: initialBoardConfiguration) { @@ -134,8 +134,6 @@ public struct VerySimpleRules: Rules { return false } - // Autres vérifications spécifiques à votre jeu... - return true } @@ -162,12 +160,12 @@ public struct VerySimpleRules: Rules { guard let movingPiece = board.getCell(atRow: move.rowOrigin, atColumn: move.columnOrigin)?.piece else { throw GameError.invalidMove // Ou une erreur plus spécifique } - + // Vérifiez s'il y a une pièce ennemie à la position de destination et la supprimez si c'est le cas - if let destinationCell = board.getCell(atRow: move.rowDestination, atColumn: move.columnDestination), let destinationPiece = destinationCell.piece { + if let destinationPiece = board.getCell(atRow: move.rowDestination, atColumn: move.columnDestination)?.piece { if destinationPiece.owner != movingPiece.owner { // La pièce ennemie est capturée et doit être supprimée - _ = board.removePiece(atRow: move.rowDestination, andColumn: move.columnDestination) + _ = board.removePiece(atRow: move.rowDestination, andColumn: move.columnDestination) } } @@ -188,6 +186,7 @@ public struct VerySimpleRules: Rules { historic.append(move) } + public func hasPlayerNoPieces(board: Board, player: Owner) -> Bool { for row in board.grid { for cell in row { @@ -202,23 +201,30 @@ public struct VerySimpleRules: Rules { public func isGameOver(board: Board, lastMove: Move) -> (Bool, Result) { let destinationCell = board.grid[lastMove.rowDestination][lastMove.columnDestination] - var opponent:Owner + var opponent: Owner if lastMove.owner == .player1 { opponent = .player2 } else { opponent = .player1 } - + // Vérifiez si la destination est la tanière de l'opposant if destinationCell.cellType == .den && destinationCell.initialOwner == opponent { return (true, .winner(lastMove.owner, .denReached)) } - + // Vérifie si la tanière de l'adversaire a été atteinte if destinationCell.cellType == .den && destinationCell.initialOwner != lastMove.owner { return (true, .winner(lastMove.owner, .denReached)) } - + + // Vérifie si l'un des joueurs a atteint la tanière de l'adversaire + let player1ReachedOpponentDen = board.grid[0][4].piece?.owner == .player1 + let player2ReachedOpponentDen = board.grid[4][0].piece?.owner == .player2 + if player1ReachedOpponentDen || player2ReachedOpponentDen { + return (true, .winner(player1ReachedOpponentDen ? .player1 : .player2, .denReached)) + } + // Vérifie si l'un des joueurs n'a plus de pièces if hasPlayerNoPieces(board: board, player: opponent) { return (true, .winner(lastMove.owner, .noMorePieces)) @@ -228,5 +234,7 @@ public struct VerySimpleRules: Rules { return (false, .notFinished) } + + }