👔 Implement Game
continuous-integration/drone/push Build is passing Details

main
Alexis Drai 2 years ago
parent 5f48e0355a
commit c50b11e9b5

@ -11,60 +11,43 @@ public func scan() -> Int {
return res! return res!
} }
var chosenCol: Int? var status: (isOver: Bool, result: Result)
var wasPlayed = false print("nothing yet")
var status: (isOver: Bool, result: Result) = (false, .notOver) if let rules = BasicDefaultsNoDiag() {
var currentId: Int print("rules")
var currentPlayer: Player
let p1id = 1, p2id = 2
let p1name = "Alice", p2name = "Bob the bot"
if let rules = BasicDefaultsNoDiag(withMinNbRows: 3, if let board = Board() {
withMaxNbRows: 5, print("board")
withMinNbCols: 3,
withMaxNbCols: 5,
withNbChipsToAlign: 3) {
if var board = Board(withRows: 3, if let human = Human(withId: 1,
andWithCols: 3) { withName: "Geraldine Humanman",
if let me = Human(withId: p1id,
withName: p1name,
usingScanner: scan) { usingScanner: scan) {
print("human")
if let them = Bot(withId: p2id,
withName: p2name) { if let bot = Bot(withId: 2,
withName: "Botty McBotFace") {
print(board) // 1st turn print("bot")
while(!(status.isOver)) {
if let game = Game(withScanner : scan,
currentId = rules.getNextPlayer(fromGrid: board.grid, withBoard: board,
withPlayer1Id: p1id, withRules: rules,
withPlayer2Id: p2id) withPlayer1: human,
currentPlayer = { withPlayer2: bot) {
if(me.id == currentId) { return me } print("game")
else { return them }
}() status = game.isOver
if let chosenCol = currentPlayer.chooseColumn(inBoard: board, print(game.boardString) // 1st turn
withRules: rules) { while(!(status.isOver)) {
if(board.insertChip(from: currentId, if game.play() {
atCol: chosenCol)) { print(game.boardString)
print(board) status = game.isOver
status = rules.isGameOver(byPlayer: currentId,
onGrid: board.grid)
} }
} }
}
print("Game over") print(game.gameOverString)
switch(status.result) {
case .won(let playerId, let victoryTiles):
print("Player \(playerId) won!")
print(board.displayVictory(fromTiles: victoryTiles))
default: break; // nothing
} }
} }
} }
} }
} }

@ -51,13 +51,14 @@ public struct Board : CustomStringConvertible {
&& 0 <= col && col < nbCols && 0 <= col && col < nbCols
} }
static let descriptionMapper : [Int? : String] = [nil : "-", 1 : "X", 2: "O"] static let descriptionMapper : [Int? : String] = [nil : "", 1 : "X", 2: "O"]
public var description: String { public var description: String {
var string = String() var string = String()
for row in _grid { for row in _grid {
for tile in row { for tile in row {
string.append("\(String(describing: Board.descriptionMapper[tile] ?? "@"))") string.append("\(String(describing: Board.descriptionMapper[tile] ?? "@"))")
string.append(" ")
} }
string.append("\n") string.append("\n")
} }
@ -71,7 +72,7 @@ public struct Board : CustomStringConvertible {
var string = String() var string = String()
for row in tmpGrid { for row in tmpGrid {
for tile in row { string.append(tile == nil ? "@" : "$") } for tile in row { string.append(tile == nil ? "" : "$ ") }
string.append("\n") string.append("\n")
} }
return string return string

@ -2,12 +2,12 @@ import Foundation
public class Game { public class Game {
private let scanner: () -> Int private let scanner: () -> Int
private let displayBoard: () -> String private let displayBoard: () -> String
private let board: Board private var board: Board
private let rules: IRules private let rules: IRules
private let player1: Player private let player1: Player
private let player2: Player private let player2: Player
init(withScanner scanner: @escaping () -> Int, public init?(withScanner scanner: @escaping () -> Int,
withBoard board: Board, withBoard board: Board,
withRules rules: IRules, withRules rules: IRules,
withPlayer1 player1: Player, withPlayer1 player1: Player,
@ -16,9 +16,54 @@ public class Game {
self.displayBoard = { () -> String in self.displayBoard = { () -> String in
return board.description return board.description
} }
guard(rules.isValid(board)) else { return nil }
self.board = board self.board = board
self.rules = rules self.rules = rules
self.player1 = player1 self.player1 = player1
self.player2 = player2 self.player2 = player2
} }
public var isOver: (isOver: Bool, result: Result) {
return rules.isGameOver(byPlayer: getCurrentPlayerId(),
onGrid: board.grid)
}
public var boardString: String {
return board.description
}
public var gameOverString: String {
var string = "Game over"
switch(isOver.result) {
case .won(let playerId, let victoryTiles):
string.append("\nPlayer \(playerId) won!\n")
string.append(board.displayVictory(fromTiles: victoryTiles))
default: break; // nothing
}
return string
}
public func play() -> Bool {
let currentPlayer = {
if(rules.getNextPlayer(fromGrid: board.grid,
withPlayer1Id: player1.id,
withPlayer2Id: player2.id) == player1.id) { return player1 } else { return player2 }
}()
if let chosenCol = currentPlayer.chooseColumn(inBoard: board,
withRules: rules) {
return board.insertChip(from: currentPlayer.id, atCol: chosenCol)
}
return false
}
private func getCurrentPlayerId() -> Int {
if(rules.getNextPlayer(fromGrid: board.grid,
withPlayer1Id: player1.id,
withPlayer2Id: player2.id) == player1.id) { return player2.id } else { return player1.id }
}
} }

Loading…
Cancel
Save