parent
25088223f5
commit
57e294c369
@ -1,36 +1,60 @@
|
||||
//
|
||||
// File.swift
|
||||
//
|
||||
// Game.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 board: Board
|
||||
var rules: Rules
|
||||
var players: [Player]
|
||||
var currentPlayer: Player
|
||||
|
||||
public init(board: Board = Board(rowsNb: 6, columnsNb: 7), rules: Connect4Rules = Connect4Rules(piecesToAlign: 4), players: [Player]) {
|
||||
var callbacks: [GameEvent: (String?) -> Void]
|
||||
|
||||
public init(board: Board = Board(rowsNb: 6, columnsNb: 7), rules: Rules = Connect4Rules(piecesToAlign: 4), players: [Player]) {
|
||||
self.board = board
|
||||
self.rules = rules
|
||||
self.players = players
|
||||
self.currentPlayer = players[0]
|
||||
self.callbacks = [:]
|
||||
}
|
||||
|
||||
public mutating func start(display: (Board) -> Void){
|
||||
while rules.isGameOver(board: board).0 != true {
|
||||
var currentPlayer = rules.nextPlayer(players: players)
|
||||
public mutating func start(display: (Board) -> Void) {
|
||||
while !rules.isGameOver(board: board).0 {
|
||||
currentPlayer = rules.nextPlayer(players: players)
|
||||
display(board)
|
||||
print("Au tour de : " + currentPlayer.name)
|
||||
trigger(event: .turn)
|
||||
var move = currentPlayer.play(board: board)
|
||||
while rules.possibleMoves(board: board).contains(move) != true {
|
||||
|
||||
while !rules.possibleMoves(board: board).contains(move) {
|
||||
display(board)
|
||||
print("Move invalide en choisir un autre")
|
||||
trigger(event: .badMove)
|
||||
move = currentPlayer.play(board: board)
|
||||
}
|
||||
|
||||
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