Merge branch 'master' of codefirst.iut.uca.fr:louis.dufour/LouisDuf-DouShouQi into Tp5

pull/6/head
Louis DUFOUR 1 year ago
commit 777b1d53a6

@ -91,3 +91,62 @@ if var board = Board(withGrid: initialBoardConfiguration) {
} else { } else {
print("Erreur lors de l'initialisation du plateau de jeu.") print("Erreur lors de l'initialisation du plateau de jeu.")
} }
// Création des règles et du plateau initial
var rules = VerySimpleRules()
var board = VerySimpleRules.createBoard()
/*
// Simulation du mouvement sur le plateau
if let piece = oldBoard.grid[move.rowOrigin][move.columnOrigin].piece {
newBoard.grid[move.rowDestination][move.columnDestination].piece = piece
newBoard.grid[move.rowOrigin][move.columnOrigin].piece = nil
}
*/
/*
// Création des joueurs
let humanPlayer = HumanPlayer(name: "Joueur Humain", id: .player1) { board, rules in
// Logique pour permettre à l'utilisateur de choisir un mouvement
print("Votre mouvement (format 'rowOrigin, columnOrigin, rowDestination, columnDestination') :")
if let input = readLine() {
let components = input.split(separator: ",").compactMap { Int($0.trimmingCharacters(in: .whitespacesAndNewlines)) }
if components.count == 4 {
return Move(owner: .player1, rowOrigin: components[0], columnOrigin: components[1], rowDestination: components[2], columnDestination: components[3])
}
}
return nil
}
let randomPlayer = RandomPlayer(withName: "Joueur IA", andId: .player2)
let human = humanPlayer, let random = randomPlayer else {
print("Erreur lors de la création des joueurs.")
}
while true {
// Afficher l'état actuel du plateau
print(board)
// Déterminer le joueur actuel
let currentPlayer = rules.getNextPlayer() == human.id ? human : random
// Le joueur actuel choisit un mouvement
if let move = currentPlayer.chooseMove(board: board, rules: rules), rules.isMoveValid(board: board, move: move) {
// Appliquer le mouvement et mettre à jour le plateau
rules.playedMove(move: move, oldBoard: board, newBoard: board)
// Vérifier si le jeu est terminé
let gameOverResult = rules.isGameOver(board: board, lastMove: move)
if gameOverResult.0 {
print("Le jeu est terminé. Résultat : \(gameOverResult.1)")
break
}
} else {
print("Mouvement invalide. Essayez de nouveau.")
}
}
*/

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1420"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "Model"
BuildableName = "Model"
BlueprintName = "Model"
ReferencedContainer = "container:">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<TestPlans>
<TestPlanReference
reference = "container:../ModelCov.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ModelTests"
BuildableName = "ModelTests"
BlueprintName = "ModelTests"
ReferencedContainer = "container:">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "Model"
BuildableName = "Model"
BlueprintName = "Model"
ReferencedContainer = "container:">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

@ -7,7 +7,7 @@
import Foundation import Foundation
public struct Board : CustomStringConvertible, Hashable, Equatable { public struct Board : Hashable, Equatable {
public let nbRows: Int public let nbRows: Int
public let nbColumns: Int public let nbColumns: Int
public private(set) var grid: [[Cell]] public private(set) var grid: [[Cell]]
@ -65,16 +65,7 @@ public struct Board : CustomStringConvertible, Hashable, Equatable {
} }
} }
public var description: String {
var boardDescription = ""
for row in grid {
for cell in row {
boardDescription += cell.description + " "
}
boardDescription += "\n"
}
return boardDescription
}
} }

@ -28,5 +28,5 @@ public protocol Rules {
func isGameOver( board: Board, lastMove: Move) -> (Bool, Result) func isGameOver( board: Board, lastMove: Move) -> (Bool, Result)
// permet de stocker le coût qui a été fait. (playedMove) // permet de stocker le coût qui a été fait. (playedMove)
func playedMove(move: Move, oldBoard: Board, newBoard: Board) mutating func playedMove(move: Move, oldBoard: Board, newBoard: Board)
} }

@ -13,4 +13,17 @@ public struct Move {
public let columnOrigin: Int public let columnOrigin: Int
public let rowDestination: Int public let rowDestination: Int
public let columnDestination: Int public let columnDestination: Int
public init(owner: Owner, rowOrigin: Int, columnOrigin: Int, rowDestination: Int, columnDestination: Int) {
self.owner = owner
self.rowOrigin = rowOrigin
self.columnOrigin = columnOrigin
self.rowDestination = rowDestination
self.columnDestination = columnDestination
}
public var description: String {
let description = "Move by \(owner): (\(rowOrigin) / \(columnOrigin)) to (\(rowDestination) / \(columnDestination))"
return description
}
} }

@ -9,6 +9,11 @@ import Foundation
public class RandomPlayer: Player { public class RandomPlayer: Player {
public init?(withName name: String, andId id:Owner)
{
super.init(name: name, id: id)
}
public override func chooseMove(board: Board, rules: VerySimpleRules) -> Move? { public override func chooseMove(board: Board, rules: VerySimpleRules) -> Move? {
let validMoves = rules.getMoves(board: board, owner: self.id) let validMoves = rules.getMoves(board: board, owner: self.id)
return validMoves.randomElement() // Sélectionne un mouvement aléatoire parmi les mouvements valides return validMoves.randomElement() // Sélectionne un mouvement aléatoire parmi les mouvements valides

@ -8,10 +8,15 @@
import Foundation import Foundation
public struct VerySimpleRules: Rules { public struct VerySimpleRules: Rules {
public var occurences = [Board: Int]() public var occurences = [Board: Int]()
public var historic = [Move]() public var historic = [Move]()
public init() {
self.occurences = [Board: Int]()
self.historic = [Move]()
}
public static func createBoard() -> Board { public static func createBoard() -> Board {
var cells = [[Cell]]() var cells = [[Cell]]()
@ -123,9 +128,6 @@ public struct VerySimpleRules: Rules {
return false return false
} }
// Autres vérifications spécifiques au jeu peuvent être ajoutées ici
// ...
return true return true
} }
@ -171,12 +173,9 @@ public struct VerySimpleRules: Rules {
return (false, .notFinished) return (false, .notFinished)
} }
public func playedMove(move: Move, oldBoard: Board, newBoard: Board) { public mutating func playedMove(move: Move, oldBoard: Board, newBoard: Board) {
// ToDo
// Ajouter le mouvement à l'historique // Ajouter le mouvement à l'historique
// historic.append(move) historic.append(move)
// Mise à jour du comptage des occurrences pour le nouveau plateau
// occurences[newBoard, default: 0] += 1
} }
} }

@ -0,0 +1,92 @@
//
// File.swift
//
//
// Created by Louis DUFOUR on 31/01/2024.
//
import Foundation
import Model
import XCTest
/*
// Mocks et Stubs
class MockBoard: Board {
// Implémentez les méthodes nécessaires
}
class MockRules: VerySimpleRules {
var mockMoves: [Move] = []
func getMoves(board: Board, owner: Owner) -> [Move] {
return mockMoves
}
}
class MockMove: Move {
// Implémentez les détails nécessaires
}
// Tests
class PlayerTests: XCTestCase {
func testPlayerInitialization() {
let player = Player(name: "TestPlayer", id: .player1)
XCTAssertNotNil(player)
XCTAssertEqual(player.name, "TestPlayer")
// Plus d'assertions pour id
}
}
class HumanPlayerTests: XCTestCase {
var mockBoard: MockBoard!
var mockRules: MockRules!
var mockMove: MockMove!
override func setUp() {
super.setUp()
mockBoard = MockBoard()
mockRules = MockRules()
mockMove = MockMove()
}
func testHumanPlayerInitialization() {
let humanPlayer = HumanPlayer(name: "Human", id: .player1, inputMethod: { _, _ in return self.mockMove })
XCTAssertNotNil(humanPlayer)
XCTAssertEqual(humanPlayer.name, "Human")
}
func testHumanPlayerChooseMove() {
let humanPlayer = HumanPlayer(name: "Human", id: .player1, inputMethod: { _, _ in return self.mockMove })
let move = humanPlayer.chooseMove(board: mockBoard, rules: mockRules)
XCTAssertEqual(move, mockMove)
}
}
class RandomPlayerTests: XCTestCase {
var mockBoard: MockBoard!
var mockRules: MockRules!
var mockMove: MockMove!
override func setUp() {
super.setUp()
mockBoard = MockBoard()
mockRules = MockRules()
mockMove = MockMove()
mockRules.mockMoves = [mockMove]
}
func testRandomPlayerInitialization() {
let randomPlayer = RandomPlayer(withName: "Random", andId: .player2)
XCTAssertNotNil(randomPlayer)
XCTAssertEqual(randomPlayer.name, "Random")
}
func testRandomPlayerChooseMove() {
let randomPlayer = RandomPlayer(withName: "Random", andId: .player2)
let move = randomPlayer.chooseMove(board: mockBoard, rules: mockRules)
XCTAssertNotNil(move)
}
}*/

@ -1,6 +1,21 @@
import XCTest import XCTest
@testable import Model @testable import Model
class VerySimpleRulesTests: XCTestCase { class VerySimpleRulesTests: XCTestCase {
var rules: VerySimpleRules!
var board: Board!
override func setUp() {
super.setUp()
rules = VerySimpleRules()
board = VerySimpleRules.createBoard()
}
override func tearDown() {
rules = nil
board = nil
super.tearDown()
}
func testCreateBoard() { func testCreateBoard() {
// Test que la fonction createBoard() retourne un plateau valide avec les dimensions attendues // Test que la fonction createBoard() retourne un plateau valide avec les dimensions attendues
@ -18,7 +33,84 @@ class VerySimpleRulesTests: XCTestCase {
rules.historic.append(Move(owner: .player2, rowOrigin: 0, columnOrigin: 1, rowDestination: 0, columnDestination: 2)) rules.historic.append(Move(owner: .player2, rowOrigin: 0, columnOrigin: 1, rowDestination: 0, columnDestination: 2))
XCTAssertEqual(rules.getNextPlayer(), .player1) XCTAssertEqual(rules.getNextPlayer(), .player1)
} }
func testCheckBoardValid() {
// Assurez-vous que la méthode `checkBoard` ne lève pas d'exception pour un plateau valide
XCTAssertNoThrow(try VerySimpleRules.checkBoard(b: board))
}
func testCheckBoardInvalidDimensions() {
// Création d'un plateau avec des dimensions invalides (4x4 au lieu de 5x5)
var invalidCells = [[Cell]]()
for _ in 0..<4 {
var rowCells = [Cell]()
for _ in 0..<4 {
// Créez des cellules basiques, les détails dépendent de votre implémentation de Cell
let cell = Cell(ofType: .jungle, ownedBy: .noOne, withPiece: nil)
rowCells.append(cell)
}
invalidCells.append(rowCells)
}
let invalidBoard = Board(withGrid: invalidCells)!
XCTAssertThrowsError(try VerySimpleRules.checkBoard(b: invalidBoard))
}
func testGetMoves() {
// Supposons que pour une configuration de plateau spécifique, vous attendiez 3 mouvements possibles pour le joueur 1
let expectedMoveCountForPlayer1 = 3 // Remplacez 3 par le nombre correct basé sur votre jeu
// Test pour vérifier si getMoves retourne les bons mouvements pour le joueur 1
let movesForPlayer1 = rules.getMoves(board: board, owner: .player1)
// XCTAssertEqual(movesForPlayer1.count, expectedMoveCountForPlayer1)
}
func testIsMoveValid() {
// Test pour un mouvement valide
let validMove = Move(owner: .player1, rowOrigin: 0, columnOrigin: 0, rowDestination: 1, columnDestination: 0)
XCTAssertTrue(rules.isMoveValid(board: board, move: validMove))
// Test pour un mouvement invalide (par exemple, déplacement vers une case occupée par le même joueur)
let invalidMove = Move(owner: .player1, rowOrigin: 0, columnOrigin: 0, rowDestination: 0, columnDestination: 1)
XCTAssertFalse(rules.isMoveValid(board: board, move: invalidMove))
}
func testIsGameOver() {
// Assurez-vous que `board` est bien initialisé
guard let currentBoard = board else {
XCTFail("Board is not initialized")
return
}
// Créez un mouvement qui simule une fin de partie
let winningMove = Move(owner: .player1, rowOrigin: 3, columnOrigin: 2, rowDestination: 4, columnDestination: 2)
/*
// Appliquez ce mouvement au plateau
// Cette partie dépend de la façon dont votre jeu applique les mouvements
// Ici, un exemple générique où nous remplaçons simplement la pièce dans la cellule de destination
if let piece = currentBoard.grid[winningMove.rowOrigin][winningMove.columnOrigin].piece {
currentBoard.grid[winningMove.rowDestination][winningMove.columnDestination].piece = piece
currentBoard.grid[winningMove.rowOrigin][winningMove.columnOrigin].piece = nil
}
*/
// Testez si `isGameOver` détecte correctement la fin de partie
let (isGameOver, result) = rules.isGameOver(board: currentBoard, lastMove: winningMove)
XCTAssertTrue(isGameOver)
// Vérifiez le résultat spécifique de la fin de partie
switch result {
case .winner(let winner, let winCondition):
XCTAssertEqual(winner, .player1)
XCTAssertEqual(winCondition, .denReached)
default:
XCTFail("Unexpected game over result")
}
}
static var allTests = [ static var allTests = [
("testCreateBoard", testCreateBoard), ("testCreateBoard", testCreateBoard),
("testGetNextPlayer", testGetNextPlayer), ("testGetNextPlayer", testGetNextPlayer),

@ -0,0 +1,24 @@
{
"configurations" : [
{
"id" : "117362A3-7E9A-409E-91DB-0965BE3D3808",
"name" : "Configuration 1",
"options" : {
}
}
],
"defaultOptions" : {
},
"testTargets" : [
{
"target" : {
"containerPath" : "container:",
"identifier" : "ModelTests",
"name" : "ModelTests"
}
}
],
"version" : 1
}

@ -10,4 +10,7 @@
<FileRef <FileRef
location = "group:Model"> location = "group:Model">
</FileRef> </FileRef>
<FileRef
location = "group:ModelCov.xctestplan">
</FileRef>
</Workspace> </Workspace>

Loading…
Cancel
Save