You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.7 KiB
125 lines
3.7 KiB
//
|
|
// File.swift
|
|
//
|
|
//
|
|
// Created by etudiant on 09/02/2023.
|
|
//
|
|
|
|
import Foundation
|
|
public class ClassicRules : Rule {
|
|
private let board: Board
|
|
private let Minnbrcoln = 4
|
|
private let MinnbrRow = 4
|
|
private var isOver = false
|
|
|
|
public init?(withBoard board: Board){
|
|
guard board.nbColumns >= Minnbrcoln && board.nbRows >= MinnbrRow else {
|
|
return nil
|
|
}
|
|
self.board = board
|
|
}
|
|
// Fonction pour déterminer si une pièce a été insérée dans une colonne donnée
|
|
// et si elle a formé une combinaison gagnante.
|
|
public func isValid(column: Int) -> Int {
|
|
let grid = board.grid
|
|
var y = 0;
|
|
var id = 0
|
|
// Appel de la fonction pour obtenir la dernière ligne et l'ID de la dernière pièce insérée dans cette colonne
|
|
(y, id) = gettheLast(column: column)
|
|
// Variables pour stocker le score actuel et la valeur de retour
|
|
var score = 0
|
|
|
|
// Définir les bornes pour la vérification des lignes, des colonnes et des diagonales
|
|
var minX = column - 3
|
|
if minX < 0 {
|
|
minX = 0
|
|
}
|
|
var maxX = column + 3
|
|
if maxX >= board.nbColumns {
|
|
maxX = board.nbColumns - 1
|
|
}
|
|
var minY = y - 3
|
|
if minY < 0 {
|
|
minY = 0
|
|
}
|
|
var maxY = y + 3
|
|
if maxY >= board.nbRows {
|
|
maxY = board.nbRows - 1
|
|
}
|
|
|
|
// Vérification de la ligne horizontale
|
|
for i in minX...maxX {
|
|
if grid[y][i] == id {
|
|
score += 1
|
|
} else {
|
|
score = 0
|
|
}
|
|
}
|
|
if score >= 4 { return id }
|
|
|
|
// Vérification de la colonne verticale
|
|
for i in minY...maxY {
|
|
if grid[i][column] == id {
|
|
score += 1
|
|
} else {
|
|
score = 0
|
|
}
|
|
}
|
|
if score >= 4 { return id }
|
|
|
|
// Vérification de la diagonale allant du nord-ouest au sud-est
|
|
var minCoord = min(minX, minY)
|
|
var maxCoord = min(maxX, maxY)
|
|
for i in minCoord...maxCoord {
|
|
if grid[i][i] == id {
|
|
score += 1
|
|
} else {
|
|
score = 0
|
|
}
|
|
}
|
|
if score >= 4 { return id }
|
|
|
|
// Vérification de la diagonale allant du nord-est au sud-ouest
|
|
minCoord = min(maxX, minY)
|
|
maxCoord = min(minX, maxY)
|
|
for i in minCoord...maxCoord {
|
|
if grid[i][i] == id {
|
|
score += 1
|
|
} else {
|
|
score = 0
|
|
}
|
|
}
|
|
if score >= 4 { return id }
|
|
return 0
|
|
}
|
|
// Cette fonction privée `gettheLast` trouve la dernière case remplie dans une colonne donnée.
|
|
private func gettheLast(column: Int) -> (Int, Int) {
|
|
let grid = board.grid
|
|
var y = 0;
|
|
var id = 0
|
|
// Boucle sur toutes les lignes de la grille.
|
|
for i in 0..<board.nbRows {
|
|
// Si une case dans la colonne actuelle est remplie, enregistre les coordonnées (ligne, colonne) et l'identifiant de la pièce.
|
|
if let idCase = grid[i][column] {
|
|
y = i
|
|
id = idCase
|
|
break
|
|
}
|
|
}
|
|
// Renvoie les coordonnées (ligne, colonne) et l'identifiant de la pièce.
|
|
return (y, id);
|
|
}
|
|
// Cette fonction publique `isGameOver` vérifie si la partie est terminée.
|
|
public func isGameOver() -> Bool {
|
|
isOver = true
|
|
for i in 0..<board.nbColumns {
|
|
if board.grid[0][i] == 0 {
|
|
isOver = false
|
|
break
|
|
}
|
|
}
|
|
return isOver
|
|
}
|
|
|
|
}
|