Update(Tp5): refacto et fix bug mouvement

pull/6/head
Louis DUFOUR 1 year ago
parent 859fca4362
commit 2c08f18816

@ -42,7 +42,7 @@ public struct Game {
} }
do { do {
try rules.apply(move: move, to: &board) // Applique le mouvement try rules.playedMove(move: move, to: &board) // Applique le mouvement
onMoveChosen?(move) onMoveChosen?(move)
onBoardChanged?() // Notifie que le plateau a changé onBoardChanged?() // Notifie que le plateau a changé

@ -18,7 +18,7 @@ public class HumanPlayer: Player {
public override func chooseMove(board: Board, rules: Rules) -> Move? { public override func chooseMove(board: Board, rules: Rules) -> Move? {
print("Votre tour, \(name). Saisissez votre mouvement (format attendu : 'rowOrigin columnOrigin rowDestination columnDestination') :") print("Votre tour, \(name). Saisissez votre mouvement (format attendu : 'rowOrigin columnOrigin rowDestination columnDestination') :")
if let input = readLine() { // Déballez en toute sécurité l'entrée de l'utilisateur if let input = readLine() {
let components = input.compactMap { Int(String($0)) } let components = input.compactMap { Int(String($0)) }
if components.count == 4, if components.count == 4,
rules.isMoveValid(board: board, row: components[0], column: components[1], rowArrived: components[2], columnArrived: components[3]) { rules.isMoveValid(board: board, row: components[0], column: components[1], rowArrived: components[2], columnArrived: components[3]) {

@ -26,10 +26,8 @@ public protocol Rules {
func isMoveValid( board: Board, row: Int, column: Int, rowArrived: Int, columnArrived: Int) -> Bool func isMoveValid( board: Board, row: Int, column: Int, rowArrived: Int, columnArrived: Int) -> Bool
func isMoveValid( board: Board, move: Move) -> Bool func isMoveValid( board: Board, move: Move) -> Bool
mutating func apply(move: Move, to board: inout Board) throws
func isGameOver( board: Board, lastMove: Move) -> (Bool, Result) func isGameOver( board: Board, lastMove: Move) -> (Bool, Result)
// permet de stocker le coût qui a été fait. (playedMove) // permet de stocker le coût qui a été fait. (playedMove)
mutating func playedMove(move: Move, oldBoard: Board, newBoard: Board) mutating func playedMove(move: Move, to board: inout Board) throws
} }

@ -116,27 +116,33 @@ public struct VerySimpleRules: Rules {
} }
public func isMoveValid(board: Board, move: Move) -> Bool { public func isMoveValid(board: Board, move: Move) -> Bool {
// Vérifier si les coordonnées de destination sont dans les limites du plateau // Vérifier si les coordonnées de destination sont valides
if move.rowDestination < 0 || move.rowDestination >= board.nbRows || if move.rowDestination < 0 || move.rowDestination >= board.nbRows ||
move.columnDestination < 0 || move.columnDestination >= board.nbColumns { move.columnDestination < 0 || move.columnDestination >= board.nbColumns {
return false return false
} }
// Obtenir la cellule de destination // Obtenir la cellule de destination
guard let destinationCell = board.getCell(atRow: move.rowDestination, column: move.columnDestination) else { let destinationCell = board.grid[move.rowDestination][move.columnDestination]
return false // Ne devrait pas se produire si les limites sont correctement vérifiées
} // Si la case de destination est une case jungle, vérifier les conditions spécifiques
if destinationCell.cellType == .jungle {
// Vérifier si la destination est occupée par une pièce alliée // Vérifier si la case de destination est occupée par une pièce du même joueur
if let piece = destinationCell.piece, piece.owner == move.owner { // Modifier cette logique si vous voulez permettre le déplacement sur des cases jungle occupées par des pièces alliées
return false if let piece = destinationCell.piece, piece.owner == move.owner {
return false // Retourner true si le déplacement est autorisé malgré la présence d'une pièce alliée
}
} else {
// Pour les autres types de cases, vérifier si la case de destination est occupée par une pièce du même joueur
if let piece = destinationCell.piece, piece.owner == move.owner {
return false
}
} }
// Ajouter ici d'autres vérifications spécifiques au jeu, comme les obstacles ou les règles spéciales de pièces // Autres vérifications spécifiques à votre jeu (par exemple, les règles de déplacement basées sur le type de pièce)
return true // Le mouvement est valide si toutes les vérifications sont passées return true // Le mouvement est valide si aucune des conditions d'invalidité n'est remplie
} }
public func isMoveValid(board: Board, row: Int, column: Int, rowArrived: Int, columnArrived: Int) -> Bool { public func isMoveValid(board: Board, row: Int, column: Int, rowArrived: Int, columnArrived: Int) -> Bool {
// Création d'un objet Move à partir des coordonnées fournies // Création d'un objet Move à partir des coordonnées fournies
@ -151,30 +157,32 @@ public struct VerySimpleRules: Rules {
} }
public mutating func apply(move: Move, to board: inout Board) throws { public mutating func playedMove(move: Move, to board: inout Board) throws {
// Vérifier si le mouvement est valide // Assurez-vous que le mouvement est valide avant de continuer
guard isMoveValid(board: board, move: move) else { guard isMoveValid(board: board, move: move) else {
throw GameError.invalidMove throw GameError.invalidMove
} }
// Suppression de la pièce à l'origine // Obtenez la pièce à déplacer
let removalResult = board.removePiece(atRow: move.rowOrigin, andColumn: move.columnOrigin)
guard removalResult == .ok else {
throw GameError.invalidMove // Ou une erreur plus spécifique si vous en avez défini
}
// Récupération de la pièce pour la déplacer
guard let piece = board.getCell(atRow: move.rowOrigin, column: move.columnOrigin)?.piece else { guard let piece = board.getCell(atRow: move.rowOrigin, column: move.columnOrigin)?.piece else {
throw GameError.invalidMove // La pièce n'existe pas à l'origine prévue throw GameError.invalidMove // Ou une erreur plus spécifique
} }
// Supprimez la pièce de sa position d'origine
_ = board.removePiece(atRow: move.rowOrigin, andColumn: move.columnOrigin)
// Insertion de la pièce à la destination // Placez la pièce à sa nouvelle position
let insertionResult = board.insert(piece: piece, atRow: move.rowDestination, andColumn: move.columnDestination) let insertionResult = board.insert(piece: piece, atRow: move.rowDestination, andColumn: move.columnDestination)
guard insertionResult == .ok else { switch insertionResult {
throw GameError.invalidMove // Ou une erreur plus spécifique basée sur `insertionResult` case .ok:
print("Mouvement appliqué avec succès.")
case .failed(let reason):
print("Échec de l'application du mouvement : \(reason).")
// Vous pouvez convertir ceci en une erreur spécifique si nécessaire
throw GameError.invalidMove
} }
// Mettre à jour l'historique des mouvements // Mettre à jour l'historique des mouvements ou d'autres états au besoin
historic.append(move) historic.append(move)
} }
@ -210,10 +218,5 @@ public struct VerySimpleRules: Rules {
// Si aucune condition de victoire n'est remplie, la partie n'est pas encore terminée // Si aucune condition de victoire n'est remplie, la partie n'est pas encore terminée
return (false, .notFinished) return (false, .notFinished)
} }
public mutating func playedMove(move: Move, oldBoard: Board, newBoard: Board) {
// Ajouter le mouvement à l'historique
historic.append(move)
}
} }

Loading…
Cancel
Save