parent
25088223f5
commit
57e294c369
@ -1,36 +1,60 @@
|
|||||||
//
|
//
|
||||||
// File.swift
|
// Game.swift
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Created by Adam BONAFOS on 06/02/2025.
|
// Created by Adam BONAFOS on 06/02/2025.
|
||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public struct Game {
|
public struct Game {
|
||||||
var board = Board(rowsNb: 6, columnsNb: 7)
|
var board: Board
|
||||||
var rules = Connect4Rules(piecesToAlign: 4)
|
var rules: Rules
|
||||||
var players: [Player]
|
var players: [Player]
|
||||||
var currentPlayer: Player
|
var currentPlayer: Player
|
||||||
|
var callbacks: [GameEvent: (String?) -> Void]
|
||||||
|
|
||||||
public init(board: Board = Board(rowsNb: 6, columnsNb: 7), rules: Connect4Rules = Connect4Rules(piecesToAlign: 4), players: [Player]) {
|
public init(board: Board = Board(rowsNb: 6, columnsNb: 7), rules: Rules = Connect4Rules(piecesToAlign: 4), players: [Player]) {
|
||||||
self.board = board
|
self.board = board
|
||||||
self.rules = rules
|
self.rules = rules
|
||||||
self.players = players
|
self.players = players
|
||||||
self.currentPlayer = players[0]
|
self.currentPlayer = players[0]
|
||||||
|
self.callbacks = [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
public mutating func start(display: (Board) -> Void) {
|
public mutating func start(display: (Board) -> Void) {
|
||||||
while rules.isGameOver(board: board).0 != true {
|
while !rules.isGameOver(board: board).0 {
|
||||||
var currentPlayer = rules.nextPlayer(players: players)
|
currentPlayer = rules.nextPlayer(players: players)
|
||||||
display(board)
|
display(board)
|
||||||
print("Au tour de : " + currentPlayer.name)
|
trigger(event: .turn)
|
||||||
var move = currentPlayer.play(board: board)
|
var move = currentPlayer.play(board: board)
|
||||||
while rules.possibleMoves(board: board).contains(move) != true {
|
|
||||||
|
while !rules.possibleMoves(board: board).contains(move) {
|
||||||
display(board)
|
display(board)
|
||||||
print("Move invalide en choisir un autre")
|
trigger(event: .badMove)
|
||||||
move = currentPlayer.play(board: board)
|
move = currentPlayer.play(board: board)
|
||||||
}
|
}
|
||||||
|
|
||||||
rules.add(board: &board, move: move, token: currentPlayer.color)
|
rules.add(board: &board, move: move, token: currentPlayer.color)
|
||||||
}
|
}
|
||||||
|
display(board)
|
||||||
|
trigger(event: .victory)
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func on(event: GameEvent, callback: @escaping (String?) -> Void) {
|
||||||
|
callbacks[event] = callback
|
||||||
|
}
|
||||||
|
|
||||||
|
private func trigger(event: GameEvent) {
|
||||||
|
callbacks[event]?(extractName(from: event))
|
||||||
|
}
|
||||||
|
|
||||||
|
private func extractName(from event: GameEvent) -> String? {
|
||||||
|
switch event {
|
||||||
|
case .turn, .victory:
|
||||||
|
return currentPlayer.name
|
||||||
|
case .badMove:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Adam BONAFOS on 10/02/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
public enum GameEvent : Hashable {
|
||||||
|
case turn
|
||||||
|
case badMove
|
||||||
|
case victory
|
||||||
|
}
|
Loading…
Reference in new issue