working game
continuous-integration/drone/push Build is failing Details

main
Mathis RIBEMONT 2 years ago
parent e634d435d8
commit a1bd7bb178

BIN
.DS_Store vendored

Binary file not shown.

@ -65,7 +65,7 @@ public struct Board: CustomStringConvertible {
return string
}
private func isFull() -> Bool {
public func isFull() -> Bool {
for column in 0...nbColumns{
if !isColumnFull(column: column) {
return false
@ -76,12 +76,9 @@ public struct Board: CustomStringConvertible {
}
private func isColumnFull(column: Int) -> Bool{
for row in 0..<nbRows {
if grid[row][column] == nil {
return false
}
if grid[0][column] == nil {
return false
}
return true
}

@ -7,7 +7,7 @@
import Foundation
public enum BoardResult : Equatable{
public enum BoardResult: Equatable{
case unknown
case ok
case failed(FailedReason)

@ -14,7 +14,7 @@ public struct Game {
private var afficheur: Afficheur
private var rule: Rule
public init?(withBoard board: Board, playedBy players: [Player], withRules rule: Rule, writeOn afficheur: Afficheur) {
public init?( withBoard board: inout Board, playedBy players: [Player], withRules rule: Rule, writeOn afficheur: Afficheur) {
self.board = board
self.players = players
self.afficheur = afficheur
@ -53,19 +53,35 @@ public struct Game {
let player = players[numero]
var result = BoardResult.unknown
var choice = 0
while( result != BoardResult.ok){
while(result != BoardResult.ok){
afficheur.afficherLigne(message: "\nJoueur \(player.name), dans quelle colonne voulez-vous insérer un jeton ?")
choice = player.playInColumn()
afficheur.afficherLigne(message: "Le nombre choisi est \(choice).")
result = board.insertPiece(id: numero + 1, column: choice)
switch result {
case BoardResult.failed(FailedReason.unknown):
afficheur.afficherLigne(message: "Vous ne pouvez pas placer de pièce ici.")
break
case BoardResult.failed(FailedReason.columnFull):
afficheur.afficherLigne(message: "Vous ne pouvez pas placer de pièce ici.")
break
case BoardResult.failed(FailedReason.boardFull):
afficheur.afficherLigne(message: "Vous ne pouvez pas placer de pièce ici.")
break
case BoardResult.failed(FailedReason.outOfBound):
afficheur.afficherLigne(message: "Vous ne pouvez pas placer de pièce ici.")
break
default: break
}
}
let winnerId = rule.isValid(column: choice)
if winnerId != 0 {
afficheur.afficherLigne(message: "\(players[winnerId].name) a gagné !")
return players[winnerId]
let winnerId = rule.execute(column: choice, board: &board)
afficheur.afficherLigne(message: board.description)
if winnerId != nil {
let index = winnerId! - 1
afficheur.afficherLigne(message: "\(players[index].name) a gagné !")
return players[winnerId! - 1]
}
joueurSuivant();
afficheur.afficherLigne(message: board.description)
return nil
}

@ -9,13 +9,11 @@ import Foundation
public class Human : Player {
public var name: String
public var board: Board
private var lecteur: Lecteur
// au lieu du protocol Lecteur, prendre une fonction qui sera appelé à chaque fois si on ne veux qu'une seul méthode (c'est une closure, si on la stock, on doit mettre @escaping en paramètre). On peut stocker une méthode optionnel
public init(named name: String, playedOn board: Board, readOn lecteur: Lecteur){
public init(named name: String, readOn lecteur: Lecteur){
self.name = name
self.board = board
self.lecteur = lecteur
}

@ -9,10 +9,9 @@ import Foundation
public class IA: Player {
public var name: String
private var board: Board
public var board: Board
public init(named name: String, playedOn board: Board){
public init(named name: String, playedOn board: inout Board){
self.name = name
self.board = board
}

@ -9,7 +9,6 @@ import Foundation
public protocol Player {
var name: String { get set }
var board: Board { get set }
func playInColumn() -> Int
}

@ -13,6 +13,6 @@ import Foundation
// Pour avoir une collection de règles, créer une règle qui étend ce protocol, et qui contiendra une liste de rules, qui elles vont faire la logique. Ca permettra de juger les priorités des règles.
public protocol Rule {
func isValid(column: Int) -> Int
func isGameOver() -> Bool
func execute(column: Int, board: inout Board) -> Int?
func isGameOver(board: inout Board) -> Bool
}

@ -8,34 +8,25 @@
import Foundation
public class ClassicRules : Rule {
private let board: Board
private let nbColMin = 4
private let nbRowMin = 4
private var isOver = false
public init?(withBoard board: Board){
public init?(withBoard board: inout Board){
guard board.nbColumns >= nbColMin && board.nbRows >= nbRowMin else {
return nil
}
self.board = board
}
public func isGameOver() -> Bool {
isOver = true
for i in 0..<board.nbColumns {
if board.grid[0][i] == 0 {
isOver = false
break
}
}
return isOver
public func isGameOver(board: inout Board) -> Bool {
return board.isFull()
}
public func isValid(column: Int) -> Int {
public func execute(column: Int, board: inout Board) -> Int? {
let grid = board.grid
var y = 0;
var id = 0
(y, id) = getLastPiece(column: column)
var result = getLastPiece(column: column, board: &board)
var y = result.y
var id = result.id
var score = 0
@ -77,11 +68,27 @@ public class ClassicRules : Rule {
}
if score >= 4 { return id }
//diagonale NO -> SE
var minCoord = min(minX, minY)
var maxCoord = min(maxX, maxY)
for i in minCoord...maxCoord {
if grid[i][i] == id {
var minOffsetNOSE = -3
if column + minOffsetNOSE < 0 {
minOffsetNOSE = 0 - column
}
if y + minOffsetNOSE < 0 {
minOffsetNOSE = 0 - y
}
var maxOffsetNOSE = 3
if column + maxOffsetNOSE >= board.nbColumns {
maxOffsetNOSE = board.nbColumns - column - 1
}
if y + maxOffsetNOSE >= board.nbRows {
maxOffsetNOSE = board.nbRows - y - 1
}
for i in minOffsetNOSE...maxOffsetNOSE {
//print("\(y+i),\(column+i)\n")
if grid[y+i][column+i] == id {
score += 1
} else {
score = 0
@ -89,21 +96,40 @@ public class ClassicRules : Rule {
}
if score >= 4 { return id }
//diagonale NE -> SO
minCoord = min(maxX, minY)
maxCoord = min(minX, maxY)
for i in minCoord...maxCoord {
if grid[i][i] == id {
//diagonale SO -> NE
var c = column + y
var minOffsetSONE = -3
if column + minOffsetSONE < 0 {
minOffsetSONE = 0 - column
}
if y - minOffsetSONE >= board.nbRows {
minOffsetSONE = y - (board.nbRows - 1)
}
var maxOffsetSONE = 3
if column + maxOffsetSONE >= board.nbColumns {
maxOffsetSONE = board.nbColumns - 1 - column
}
if y - maxOffsetSONE < 0 {
maxOffsetSONE = y
}
//print("min: \(minOffsetSONE) max: \(maxOffsetSONE)")
for i in minOffsetSONE...maxOffsetSONE {
//print("\(column+i),\(y-i)\n")
if grid[y-i][column+i] == id {
score += 1
} else {
score = 0
}
}
if score >= 4 { return id }
return 0
return nil
}
private func getLastPiece(column: Int) -> (Int, Int) {
private func getLastPiece(column: Int, board: inout Board) -> (y: Int, id: Int) {
let grid = board.grid
var y = 0;
var id = 0

@ -0,0 +1,8 @@
import XCTest
@testable import model
final class ClassicRulesTests: XCTestCase {
public func test_execute(){
let rule = ClassicRules()
}
}

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "A4A1C93E-BB64-47CF-A2C8-5A1DFB856FD4"
type = "0"
version = "2.0">
<Breakpoints>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "D8D02ADC-3FC5-4DB5-A08C-BD9BB0FFF89D"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "136"
endingLineNumber = "136"
landmarkName = "getLastPiece(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "EA60BD35-FC01-4FD4-9A5A-2F93C7D33476"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "137"
endingLineNumber = "137"
landmarkName = "getLastPiece(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "3CE83989-C22B-477E-A58F-9332F55F7E8B"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/model/Game.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "53"
endingLineNumber = "53"
landmarkName = "tour()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "F257708F-679C-4976-969B-196EF317E2D5"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "puissance4/puissance4/main.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "27"
endingLineNumber = "27"
landmarkName = "unknown"
landmarkType = "0">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "6505DAD5-0B49-4E65-B30F-E473210FFDA5"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "puissance4/puissance4/main.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "38"
endingLineNumber = "38"
landmarkName = "unknown"
landmarkType = "0">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "CCE3C952-0D48-44FB-B882-3F9D69CB42AD"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/model/Game.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "77"
endingLineNumber = "77"
landmarkName = "tour()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "F9188C15-957F-4D32-9910-C7F1ADF0E177"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "31"
endingLineNumber = "31"
landmarkName = "execute(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "A6C31BB5-1FDB-476B-93AB-B9A1263C9439"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "134"
endingLineNumber = "134"
landmarkName = "getLastPiece(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "9EE9B605-88BC-4C85-B692-C6CE21A2AEEB"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "88"
endingLineNumber = "88"
landmarkName = "execute(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "B89838F0-4489-4BB3-9A56-086CFCA2E275"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "73"
endingLineNumber = "73"
landmarkName = "execute(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "B59C408B-1B22-475F-8533-5FD81C56120B"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "model/Sources/model/rules/ClassicRules.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "101"
endingLineNumber = "101"
landmarkName = "execute(column:board:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>

@ -25,18 +25,17 @@ let lecteur = Lecteur()
let afficheur = Afficheur()
var b = Board()
if let board = b {
let player1 = Human(named: "Bingeamain", playedOn: board, readOn: lecteur)
if var board = b {
//let player1 = Human(named: "Bingeamain", readOn: lecteur)
let player1 = IA(named: "Lya", playedOn: &board)
//let player2 = Human(named: "illeauhanne", playedOn: board, readOn: lecteur)
let player2 = IA(named: "Géraimiedepain", playedOn: board)
let rule = ClassicRules(withBoard: board)
let player2 = IA(named: "Géraimiedepain", playedOn: &board)
let rule = ClassicRules(withBoard: &board)
var game = Game(withBoard: board, playedBy: [player1, player2], withRules: rule!, writeOn: afficheur)
var game = Game(withBoard: &board, playedBy: [player1, player2], withRules: rule!, writeOn: afficheur)
var winner : Player?
while winner == nil && rule!.isGameOver() {
while winner == nil && !rule!.isGameOver(board: &board) {
winner = game?.tour()
}
afficheur.afficherLigne(message: "Le gagnant est \(winner?.name)")
}

Loading…
Cancel
Save