diff --git a/Connect4_CLI/Connect4_CLI/main.swift b/Connect4_CLI/Connect4_CLI/main.swift index 711b143..31a1f37 100644 --- a/Connect4_CLI/Connect4_CLI/main.swift +++ b/Connect4_CLI/Connect4_CLI/main.swift @@ -20,16 +20,33 @@ func read(question: String) -> String { } } -var board = Board(rowsNb: 6, columnsNb: 7) -var rules = Connect4Rules(piecesToAlign: 4) -var player1: Player = HumanPlayer(rules: rules, color: .red, name: "player1", CLI: read) -var player2: Player = HumanPlayer(rules: rules, color: .yellow, name: "player2", CLI: read) +public func display(board: Board) { + var boardString = "" -while rules.isGameOver(board: board).0 != true { - var move = player1.play() - while rules.possibleMoves(board: board).contains(move) != true { - print("Move invalide en choisir un autre") - move = player1.play() + for row in (0.. Player { + return players[history.count % players.count] + } + let piecesToAlign: Int public init(piecesToAlign: Int) { self.piecesToAlign = piecesToAlign } - public func add(board: inout Board, position pos: (row: Int, column: Int), token: Token) -> Bool { - var currentRowNb = 0; - for var row in board.grid { - if row[pos.column] != Token.empty && currentRowNb != 0 { - row[currentRowNb - 1] = token - return true - } - currentRowNb += 1 - } - return false + public mutating func add(board: inout Board, move pos: Move, token: Token) { + history.append(pos) + board[pos.row, pos.column] = token } public func isGameOver(board: Board) -> (result: Bool, winner: Token) { diff --git a/Model/Sources/Model/Game.swift b/Model/Sources/Model/Game.swift new file mode 100644 index 0000000..f70b3e4 --- /dev/null +++ b/Model/Sources/Model/Game.swift @@ -0,0 +1,36 @@ +// +// File.swift +// +// +// Created by Adam BONAFOS on 06/02/2025. +// + +import Foundation +public struct Game { + var board = Board(rowsNb: 6, columnsNb: 7) + var rules = Connect4Rules(piecesToAlign: 4) + var players: [Player] + var currentPlayer: Player + + public init(board: Board = Board(rowsNb: 6, columnsNb: 7), rules: Connect4Rules = Connect4Rules(piecesToAlign: 4), players: [Player]) { + self.board = board + self.rules = rules + self.players = players + self.currentPlayer = players[0] + } + + public mutating func start(display: (Board) -> Void){ + while rules.isGameOver(board: board).0 != true { + var currentPlayer = rules.nextPlayer(players: players) + display(board) + print("Au tour de : " + currentPlayer.name) + var move = currentPlayer.play(board: board) + while rules.possibleMoves(board: board).contains(move) != true { + display(board) + print("Move invalide en choisir un autre") + move = currentPlayer.play(board: board) + } + rules.add(board: &board, move: move, token: currentPlayer.color) + } + } +} diff --git a/Model/Sources/Model/Player/AIPlayer.swift b/Model/Sources/Model/Player/AIPlayer.swift index 86130f2..5538ec7 100644 --- a/Model/Sources/Model/Player/AIPlayer.swift +++ b/Model/Sources/Model/Player/AIPlayer.swift @@ -6,5 +6,5 @@ // import Foundation -class AIPlayer : Player { +public class AIPlayer : Player { } diff --git a/Model/Sources/Model/Player/HumanPlayer.swift b/Model/Sources/Model/Player/HumanPlayer.swift index f541759..1bb48dd 100644 --- a/Model/Sources/Model/Player/HumanPlayer.swift +++ b/Model/Sources/Model/Player/HumanPlayer.swift @@ -16,7 +16,7 @@ public class HumanPlayer : Player { super.init(rules: rules, color: color, name: name) } - public override func play() -> Move { + public override func play(board: Board) -> Move { // Demande la colonne à l'utilisateur let columnInput = CLI!("Entrez le numéro de la colonne : ") guard let column = Int(columnInput) else { diff --git a/Model/Sources/Model/Player/Player.swift b/Model/Sources/Model/Player/Player.swift index c051a71..0360623 100644 --- a/Model/Sources/Model/Player/Player.swift +++ b/Model/Sources/Model/Player/Player.swift @@ -7,7 +7,7 @@ import Foundation public class Player { - var name: String + public let name: String public let color: Token var rules: Rules public init(rules: Rules, color: Token, name: String){ @@ -15,7 +15,7 @@ public class Player { self.color = color self.rules = rules } - public func play() -> Move { + public func play(board: Board) -> Move { fatalError("Must override in subclass") } } diff --git a/Model/Sources/Model/Player/RandomPlayer.swift b/Model/Sources/Model/Player/RandomPlayer.swift index afa14af..af9f1ef 100644 --- a/Model/Sources/Model/Player/RandomPlayer.swift +++ b/Model/Sources/Model/Player/RandomPlayer.swift @@ -6,8 +6,9 @@ // import Foundation -class RandomPlayer : AIPlayer { - override func play() -> Move { - return Move(row: 0, column: 0) +public class RandomPlayer : AIPlayer { + public override func play(board: Board) -> Move { + let moves = rules.possibleMoves(board: board) + return moves.randomElement() ?? Move(row: 0, column: 0) } } diff --git a/Model/Sources/Model/Rules.swift b/Model/Sources/Model/Rules.swift index 8465292..6363142 100644 --- a/Model/Sources/Model/Rules.swift +++ b/Model/Sources/Model/Rules.swift @@ -8,8 +8,8 @@ import Foundation public protocol Rules { - func add(board: inout Board, position pos: (row: Int, column: Int), token: Token) -> Bool + mutating func add(board: inout Board, move pos: Move, token: Token) func isGameOver(board: Board) -> (result: Bool, winner: Token) func possibleMoves(board: Board) -> [Move] - + func nextPlayer(players: [Player]) -> Player } diff --git a/Model/Sources/Model/TicTacToeRules.swift b/Model/Sources/Model/TicTacToeRules.swift index 28040b4..9909966 100644 --- a/Model/Sources/Model/TicTacToeRules.swift +++ b/Model/Sources/Model/TicTacToeRules.swift @@ -5,7 +5,7 @@ // Created by Adam BONAFOS on 14/01/2025. // -import Foundation +/*import Foundation public struct TicTacToeRules: Rules { public func possibleMoves(board: Board) -> [Move] { @@ -36,4 +36,4 @@ public struct TicTacToeRules: Rules { return (false, Token.empty) } -} +}*/