Board(Grid) -> FEN
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
// }
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user