parent
0100e7c2ef
commit
e7b0645c30
@ -1 +0,0 @@
|
|||||||
Subproject commit bd4c7ffd777bbfdebec09917d66c818c6ed4f873
|
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -1,14 +1,30 @@
|
|||||||
//
|
//
|
||||||
// main.swift
|
// main.swift
|
||||||
// HelloCLT
|
// MainJeux
|
||||||
//
|
//
|
||||||
// Created by Marc Chevaldonné on 03/05/2022.
|
// Created by etudiant on 09/02/2023.
|
||||||
//
|
//
|
||||||
|
|
||||||
import HelloLibrary
|
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
let helloStruct = HelloStruct()
|
import MyJeux
|
||||||
print(helloStruct.text)
|
|
||||||
|
let lecteur = Lecteur()
|
||||||
|
let afficheur = Afficheur()
|
||||||
|
var b = Board()
|
||||||
|
|
||||||
|
if let board = b {
|
||||||
|
let player1 = Human(nom: "Arafa", playedOn: board, readOn: lecteur)
|
||||||
|
let player2 = IA(nom: "Najlae", playedOn: board)
|
||||||
|
let rule = ClassicRules(withBoard: board)
|
||||||
|
var game = Game(withBoard: board, playedBy: [player1, player2], withRules: rule!, writeOn: afficheur)
|
||||||
|
var winner : Player?
|
||||||
|
while winner == nil && rule!.isGameOver()
|
||||||
|
{
|
||||||
|
winner = game?.tour()
|
||||||
|
}
|
||||||
|
|
||||||
|
afficheur.afficherLigne(message: "Le gagnant est \(winner?.nom)")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
public class Afficheur {
|
||||||
|
public init() {}
|
||||||
|
//cette Fonction affiche une ligne de message
|
||||||
|
public func afficherLigne(message msg: String){
|
||||||
|
print(msg)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,160 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
public struct Board: CustomStringConvertible {
|
||||||
|
// La grille du tableau qui peut contenir des valeurs nues (nil) ou des entiers (1 ou 2)
|
||||||
|
var grid: [[Int?]];
|
||||||
|
// Le nombre de lignes dans la grille
|
||||||
|
let nbRows: Int;
|
||||||
|
// Le nombre de colonnes dans la grille
|
||||||
|
let nbColumns: Int;
|
||||||
|
// Une table de correspondance qui mappe les entiers (1 et 2) aux valeurs de chaînes "O" et "X"
|
||||||
|
private static let descriptionMapper: [Int?:String] = [nil:" ", 1:"O", 2:"X"];
|
||||||
|
// Initialiseur qui permet de créer une grille avec le nombre de lignes et de colonnes données
|
||||||
|
public init?(n1: Int = 4, n2: Int = 5) {
|
||||||
|
// Si n1 ou n2 sont inférieurs ou égaux à 0, retournez nil
|
||||||
|
if n1 <= 0 || n2 <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Définit le nombre de lignes et de colonnes
|
||||||
|
self.nbRows = n1
|
||||||
|
self.nbColumns = n2
|
||||||
|
// Initialise la grille avec des valeurs nues (nil)
|
||||||
|
self.grid = Array(repeating: Array(repeating: nil, count: n2), count: n1)
|
||||||
|
}
|
||||||
|
|
||||||
|
public init?(withGrid grid : [[Int?]]){
|
||||||
|
// Récupère les tailles de chaque colonne dans la grille donnée
|
||||||
|
let sizes = grid.map{ return $0.count }
|
||||||
|
// Vérifie que toutes les tailles correspondent à la taille de la première colonne
|
||||||
|
let result = sizes.allSatisfy {
|
||||||
|
$0 == grid[0].count
|
||||||
|
}
|
||||||
|
// Si toutes les tailles ne correspondent pas, retournez nil
|
||||||
|
guard result else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Définit le nombre de lignes et de colonnes en fonction de la grille donnée
|
||||||
|
nbRows = grid.count
|
||||||
|
nbColumns = grid[0].count
|
||||||
|
// Utilise la grille donnée pour initialiser la grille
|
||||||
|
self.grid=grid
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public var description: String {
|
||||||
|
// déclaration de la variable de sortie string qui sera retournée
|
||||||
|
var string = String()
|
||||||
|
// déclaration de la variable de sortie string qui sera retournée
|
||||||
|
for row in grid {
|
||||||
|
// ajout d'un séparateur de ligne pour séparer les lignes
|
||||||
|
string.append("| ")
|
||||||
|
// boucle pour parcourir les cellules dans la ligne actuelle
|
||||||
|
for cell in row {
|
||||||
|
// ajout de la description de la cellule dans la chaîne string. Si la cellule est vide, un espace vide est ajouté
|
||||||
|
string.append("\(String(describing: Board.descriptionMapper[cell] ?? " "))")
|
||||||
|
// ajout d'un séparateur de colonne pour séparer les cellules
|
||||||
|
string.append(" | ")
|
||||||
|
}
|
||||||
|
// ajout d'un saut de ligne pour passer à la ligne suivante
|
||||||
|
string.append("\n")
|
||||||
|
}
|
||||||
|
// ajout d'un séparateur de ligne pour séparer les lignes de la grille
|
||||||
|
string.append("|")
|
||||||
|
for _ in 0...grid.count{
|
||||||
|
string.append("---|")
|
||||||
|
}
|
||||||
|
// ajout de l'index de colonne en dessous de la grille
|
||||||
|
string.append("\n")
|
||||||
|
|
||||||
|
string.append("|")
|
||||||
|
for i in 0...grid.count{
|
||||||
|
string.append(" \(i) |")
|
||||||
|
}
|
||||||
|
// retourne la chaîne string construite
|
||||||
|
return string
|
||||||
|
}
|
||||||
|
|
||||||
|
private func isFull() -> Bool {
|
||||||
|
// boucle pour parcourir les colonnes
|
||||||
|
for column in 0...nbColumns{
|
||||||
|
// si la colonne n'est pas pleine, retourne false
|
||||||
|
if !isColumnFull(column: column) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// si toutes les colonnes sont pleines, retourne true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private func isColumnFull(column: Int) -> Bool{
|
||||||
|
for row in 0..<nbRows {
|
||||||
|
// si la cellule est vide, retourne false
|
||||||
|
if grid[row][column] == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// si toutes les cellules sont pleines, retourne true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private mutating func insertPiece(id:Int, row:Int, column:Int) -> BoardResult {
|
||||||
|
// vérifie si la ligne et la colonne sont dans les limites de la grille
|
||||||
|
guard row >= 0 && row < nbRows && column >= 0 && column < nbColumns else {
|
||||||
|
// retourne une erreur si les coordonnées sont en dehors de la grille
|
||||||
|
return .failed(.outOfBound)
|
||||||
|
}
|
||||||
|
// vérifie si la cellule est déjà remplie
|
||||||
|
guard grid[row][column] == nil else {
|
||||||
|
return .failed(.unknown)
|
||||||
|
}
|
||||||
|
|
||||||
|
grid[row][column] = id
|
||||||
|
return .ok
|
||||||
|
}
|
||||||
|
// Fonction pour insérer une pièce dans une colonne particulière
|
||||||
|
public mutating func insertPiece(id:Int, column:Int) -> BoardResult {
|
||||||
|
// Initialiser le résultat comme étant inconnu
|
||||||
|
var result = BoardResult.unknown
|
||||||
|
// Boucle à travers les lignes dans l'ordre inverse
|
||||||
|
for row in (0..<nbRows ).reversed() {
|
||||||
|
// Si la ligne est inférieure à 0, retourner une erreur "colonne pleine"
|
||||||
|
if row < 0 {
|
||||||
|
return .failed(.columnFull)
|
||||||
|
} // Appeler la fonction `insertPiece` avec les arguments `id`, `row`, et `column`
|
||||||
|
result = insertPiece(id: id, row: row, column: column)
|
||||||
|
// Vérifier le résultat de l'insertion
|
||||||
|
switch result {
|
||||||
|
// Si l'insertion a réussi, retourner `.ok`
|
||||||
|
case .ok:
|
||||||
|
return .ok
|
||||||
|
// Sinon, continuer la boucle
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return .failed(.unknown)
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func removePiece(row:Int, column:Int) -> BoardResult {
|
||||||
|
guard row >= 0 && row < nbRows && column >= 0 && column < nbColumns else {
|
||||||
|
return .failed(.outOfBound)
|
||||||
|
}
|
||||||
|
|
||||||
|
grid[row][column] = nil
|
||||||
|
return .ok
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func clearGrid(){
|
||||||
|
for r in 0..<nbRows {
|
||||||
|
for c in 0..<nbColumns {
|
||||||
|
grid[r][c] = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
public enum BoardResult : Equatable{
|
||||||
|
case unknown
|
||||||
|
case ok
|
||||||
|
case failed(FailedReason)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FailedReason {
|
||||||
|
case unknown
|
||||||
|
case columnFull
|
||||||
|
case boardFull
|
||||||
|
case outOfBound
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
//
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public struct Game {
|
||||||
|
// La variable privée `board` représente le plateau de jeu
|
||||||
|
private var board: Board
|
||||||
|
// La variable privée `players` représente les joueurs
|
||||||
|
private var players: [Player]
|
||||||
|
private var numero: Int = 0
|
||||||
|
// La variable privée `afficheur` représente l'afficheur de messages
|
||||||
|
private var afficheur: Afficheur
|
||||||
|
private var rule: Rule
|
||||||
|
// Initialise le jeu avec un plateau donné, des joueurs donnés, des règles données et un afficheur donné
|
||||||
|
public init?(withBoard board: Board, playedBy players: [Player], withRules rule: Rule, writeOn afficheur: Afficheur) {
|
||||||
|
// Affecte les valeurs aux variables d'instance
|
||||||
|
self.board = board
|
||||||
|
self.players = players
|
||||||
|
self.afficheur = afficheur
|
||||||
|
self.rule = rule
|
||||||
|
}
|
||||||
|
// Initialise le jeu avec une grille donnée, des joueurs donnés, des règles données et un afficheur donné
|
||||||
|
public init?(withGrid grid: [[Int?]], playedBy players: [Player], withRules rule: Rule, writeOn afficheur: Afficheur) {
|
||||||
|
// Initialise un nouveau plateau avec la grille donnée
|
||||||
|
let b = Board(withGrid: grid)
|
||||||
|
// Vérifie que le plateau a bien été initialisé
|
||||||
|
guard b != nil else {
|
||||||
|
// Si ce n'est pas le cas, retourne nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
board = b!
|
||||||
|
|
||||||
|
self.players = players
|
||||||
|
self.afficheur = afficheur
|
||||||
|
self.rule = rule
|
||||||
|
}
|
||||||
|
// Initialise le jeu avec un nombre donné de lignes et de colonnes, des joueurs donnés, des règles données et un afficheur donné
|
||||||
|
public init?(withNbRow nbRow: Int = 6, withNbCol nbCol: Int = 7, playedBy players: [Player], withRules rule: Rule, writeOn afficheur: Afficheur) {
|
||||||
|
// On crée un plateau de jeu avec les dimensions spécifiées.
|
||||||
|
let b = Board(n1: nbRow, n2: nbCol)
|
||||||
|
// Si le plateau ne peut pas être créé, on renvoie nil.
|
||||||
|
guard b != nil else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Sinon, on définit le plateau de jeu pour l'instance actuelle de la classe Game.
|
||||||
|
board = b!
|
||||||
|
// On enregistre les joueurs qui joueront la partie.
|
||||||
|
self.players = players
|
||||||
|
// On enregistre l'afficheur qui sera utilisé pour afficher les informations sur le plateau.
|
||||||
|
self.afficheur = afficheur
|
||||||
|
// On enregistre les règles du jeu qui seront utilisées pour valider les mouvements des joueurs.
|
||||||
|
self.rule = rule;
|
||||||
|
}
|
||||||
|
// Méthode qui permet à un joueur de jouer un tour.
|
||||||
|
public mutating func tour() -> Player?{
|
||||||
|
// On récupère le joueur actuel.
|
||||||
|
let player = players[numero]
|
||||||
|
// On initialise le résultat de l'insertion de la pièce sur le plateau.
|
||||||
|
var result = BoardResult.unknown
|
||||||
|
var choice = 0
|
||||||
|
// Tant que la pièce ne peut pas être insérée sur le plateau, on demande au joueur où il souhaite insérer la pièce.
|
||||||
|
while( result != BoardResult.ok){
|
||||||
|
afficheur.afficherLigne(message: "\nJoueur \(player.nom), ou veut tu inserer le jeton:) ?")
|
||||||
|
choice = player.playInColumn()
|
||||||
|
afficheur.afficherLigne(message: "Le nombre choisi est \(choice).")
|
||||||
|
result = board.insertPiece(id: numero + 1, column: choice)
|
||||||
|
}
|
||||||
|
// On vérifie si un joueur a gagné la partie.
|
||||||
|
let winnerId = rule.isValid(column: choice)
|
||||||
|
// Si un joueur a gagné, on affiche un message pour annoncer le gagnant et on retourne le joueur gagnant.
|
||||||
|
if winnerId != 0 {
|
||||||
|
afficheur.afficherLigne(message: "\(players[winnerId].nom) a gagné !")
|
||||||
|
return players[winnerId]
|
||||||
|
}
|
||||||
|
joueurSuivant();
|
||||||
|
afficheur.afficherLigne(message: board.description)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
public mutating func joueurSuivant() {
|
||||||
|
numero = (numero + 1) % players.count
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// Définition de la classe "Human" qui conforme au protocole "Player"
|
||||||
|
public class Human : Player {
|
||||||
|
// Propriété : "nom" de type String, avec un getter et un setter
|
||||||
|
public var nom: String
|
||||||
|
// Propriété : "board" de type Board, avec un getter et un setter
|
||||||
|
public var board: Board
|
||||||
|
private var lecteur: Lecteur
|
||||||
|
|
||||||
|
// Initialisation avec trois paramètres "nom", "board" et "lecteur"
|
||||||
|
public init(nom nom: String, playedOn board: Board, readOn lecteur: Lecteur){
|
||||||
|
self.nom = nom
|
||||||
|
self.board = board
|
||||||
|
self.lecteur = lecteur
|
||||||
|
}
|
||||||
|
|
||||||
|
public func playInColumn() -> Int {
|
||||||
|
lecteur.lireInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
// Définition de la classe "IA" qui conforme au protocole "Player"
|
||||||
|
public class IA: Player {
|
||||||
|
// Propriété : "nom" de type String, avec un getter et un setter
|
||||||
|
public var nom: String
|
||||||
|
// Propriété : "board" de type Board, avec un getter et un setter
|
||||||
|
public var board: Board
|
||||||
|
// Initialisation avec deux paramètres "nom" et "board"
|
||||||
|
public init(nom nom: String, playedOn board: Board){
|
||||||
|
self.nom = nom
|
||||||
|
self.board = board
|
||||||
|
}
|
||||||
|
// Fonction : "playInColumn" qui retourne un entier aléatoire compris entre 0 et "nbColumns"
|
||||||
|
public func playInColumn() -> Int {
|
||||||
|
return Int.random(in: 0..<(board.nbColumns))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
public class Lecteur {
|
||||||
|
public init() {
|
||||||
|
|
||||||
|
}
|
||||||
|
// Lit une entrée entière de l'utilisateur et la retourne.
|
||||||
|
public func lireInt() -> Int{
|
||||||
|
// Tente de lire une ligne de l'entrée de l'utilisateur.
|
||||||
|
if let value = readLine() {
|
||||||
|
// Convertit la chaîne en entier et la retourne. Si la conversion échoue, retourne -1.
|
||||||
|
return Int(value) ?? -1
|
||||||
|
} else {
|
||||||
|
// Si la lecture de l'entrée échoue, retourne -1.
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Lit une entrée de ligne de l'utilisateur et la retourne sous forme de chaîne.
|
||||||
|
public func lireLigne() -> String? {
|
||||||
|
// Lit une ligne de l'entrée de l'utilisateur et la retourne sous forme de chaîne.
|
||||||
|
return readLine()
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
public struct HelloStruct {
|
public struct MyJeux {
|
||||||
public private(set) var text = "Hello, World!"
|
public private(set) var text = "Hello, World!"
|
||||||
|
|
||||||
public init() {
|
public init() {
|
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Import the Foundation library
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// Define a protocol "Player"
|
||||||
|
public protocol Player {
|
||||||
|
|
||||||
|
// Property: "nom" of type String, with both getter and setter
|
||||||
|
var nom: String { get set }
|
||||||
|
|
||||||
|
// Property: "board" of type Board, with both getter and setter
|
||||||
|
var board: Board { get set }
|
||||||
|
|
||||||
|
// Function: "playInColumn" returns an Int
|
||||||
|
func playInColumn() -> Int
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by etudiant on 09/02/2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// Pour avoir une collection de règles,la création d'une règle qui étend ce protocol, et qui contiendra une liste de rules permet de savoir les priorités des règles.
|
||||||
|
public protocol Rule {
|
||||||
|
func isValid(column: Int) -> Int
|
||||||
|
func isGameOver() -> Bool
|
||||||
|
}
|
@ -1,11 +0,0 @@
|
|||||||
import XCTest
|
|
||||||
@testable import HelloLibrary
|
|
||||||
|
|
||||||
final class HelloStructTests: XCTestCase {
|
|
||||||
func testExample() throws {
|
|
||||||
// This is an example of a functional test case.
|
|
||||||
// Use XCTAssert and related functions to verify your tests produce the correct
|
|
||||||
// results.
|
|
||||||
XCTAssertEqual(HelloStruct().text, "Hello, World!")
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,40 @@
|
|||||||
|
import XCTest
|
||||||
|
@testable import MyJeux
|
||||||
|
|
||||||
|
final class MyJeuxTests: XCTestCase {
|
||||||
|
|
||||||
|
func manipulation() {
|
||||||
|
var board = Board(n1: 4, n2: 4)
|
||||||
|
board?.insertPiece(id: 1, column: 2)
|
||||||
|
XCTAssertEqual(1, board?.grid[3][2])
|
||||||
|
board?.removePiece(row: 3, column: 2)
|
||||||
|
XCTAssertNil(board?.grid[3][2])
|
||||||
|
}
|
||||||
|
func clean(){
|
||||||
|
var board = Board(withGrid: [[1,0,1],[0,1,0],[1,0,1]])
|
||||||
|
if var b = board {
|
||||||
|
b.clearGrid()
|
||||||
|
for r in 0..<b.nbRows {
|
||||||
|
for c in 0..<b.nbColumns {
|
||||||
|
XCTAssertNil(b.grid[r][c])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func constructor() throws {
|
||||||
|
var n1 = -8
|
||||||
|
var n2 = 10
|
||||||
|
var b = Board(n1: n1, n2: n2)
|
||||||
|
XCTAssertNil(b?.grid)
|
||||||
|
n1 = 4
|
||||||
|
n2 = -10
|
||||||
|
b = Board(n1: n1, n2: n2)
|
||||||
|
XCTAssertNil(b?.grid)
|
||||||
|
n1 = 4
|
||||||
|
n2 = 10
|
||||||
|
b = Board(n1:n1, n2: n2)
|
||||||
|
XCTAssertNotNil(b?.grid)
|
||||||
|
XCTAssertEqual(n1, b?.nbRows)
|
||||||
|
XCTAssertEqual(n2, b?.nbColumns)
|
||||||
|
}
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 8862d6b914bebfae93ac4fe106309ca1fb496b0e
|
|
Loading…
Reference in new issue