Board(Grid) -> FEN

This commit is contained in:
cdricms
2024-06-28 18:30:28 +02:00
parent c79e80680c
commit 501484558a
4 changed files with 64 additions and 5 deletions

View File

@@ -33,7 +33,7 @@ public class Board: CustomStringConvertible, EventDelegate {
} }
private var squares = [Square]() private var squares = [Square]()
private var board: Grid { internal var board: Grid {
var board = Grid() var board = Grid()
var rank = -1 var rank = -1
for i in 0...63 { for i in 0...63 {
@@ -46,7 +46,7 @@ public class Board: CustomStringConvertible, EventDelegate {
return board return board
} }
public private(set) var fen: Fen public internal(set) var fen: Fen
public func setBoard() throws { public func setBoard() throws {
var file: Int8 = 1 var file: Int8 = 1

View File

@@ -14,7 +14,7 @@ public struct Fen: CustomStringConvertible {
case All = "KQkq" case All = "KQkq"
} }
private var _fen: String = "" private var _fen: String = ""
private var value: String { public private(set) var value: String {
get { get {
return _fen return _fen
} }
@@ -63,14 +63,49 @@ public struct Fen: CustomStringConvertible {
self.value = value self.value = value
} }
internal mutating func set(
from board: Board.Grid, castiling ca: CastlingAvailibility,
enPassant: String
) {
#warning(
"Determine active color, halfMoveClock, fullMoveClock based on history SAN later passed in arguments"
)
var placement = ""
var rankNr = 0
for rank in board {
var count = 0
for i in 0..<rank.count {
let file = rank[i]
if let piece = file.piece {
if count > 0 {
placement += String(count)
count = 0
}
placement += piece.kind.fenRepresentation(with: piece.color)
} else {
count += 1
}
}
if count > 0 {
placement += String(count)
}
if rankNr != rank.count - 1 {
placement += "/"
}
rankNr += 1
}
value = placement + " w " + ca.rawValue + " " + enPassant + " 0 " + "1"
}
public enum FenError: Error { public enum FenError: Error {
case InvalidCharacter(c: String, column: Int8) case InvalidCharacter(c: String, column: Int8)
case NumberTooBig(n: Int8, column: Int8) case NumberTooBig(n: Int8, column: Int8)
case NumberTooSmall(n: Int8, column: Int8) case NumberTooSmall(n: Int8, column: Int8)
case NotAppropriateLength(n: Int8, column: Int8) case NotAppropriateLength(n: Int8, column: Int8)
} }
public var description: String { public var description: String {
return value return value
} }
} }

View File

@@ -12,6 +12,20 @@ public enum Kind: String, CaseIterable {
} }
} }
func fenRepresentation(with color: Color) -> String {
let str =
switch self {
case .Pawn: "P"
case .Bishop: "B"
case .Knight: "N"
case .Rook: "R"
case .Queen: "Q"
case .King: "K"
}
return color == .White ? str : str.lowercased()
}
static subscript(_ c: Character) -> (Self, Color)? { static subscript(_ c: Character) -> (Self, Color)? {
let v = c.uppercased() let v = c.uppercased()

View File

@@ -105,6 +105,16 @@ final class EngineTests: XCTestCase {
XCTAssertEqual(result, pb.pseudoLegalPositions) XCTAssertEqual(result, pb.pseudoLegalPositions)
} }
func testSetFenFromBoard() throws {
let board: Board = .init()
let fen = board.fen.value
board.fen.set(
from: board.board, castiling: board.fen.castlingAvailibility,
enPassant: board.fen.enPassant)
XCTAssertEqual(
fen, board.fen.value, "Expected \(fen) got \(board.fen.value)")
}
// func testBoard() throws { // func testBoard() throws {
// let board = Board() // let board = Board()
// } // }