A Swift package for efficiently implementing chess logic.
For a related Swift package that contains chess engines such as Stockfish, see chesskit-engine.
Add chesskit-swift
as a dependency
.package(url: "https://github.com/chesskit-app/chesskit-swift", from: "0.10.0")
Next, import ChessKit
to use it in Swift code:
import ChessKit
// ...
## Features
* Representation of chess elements
* `Piece`
* `Square`
* `Move`
* `Position`
* `Board`
* `Clock`
* `Game`
* Special moves (castling, en passant)
* Move validation
* Implemented using highly performant `UInt64` [bitboards](https://www.chessprogramming.org/Bitboards).
* Pawn promotion handling
* Game states (check, stalemate, checkmate, etc.)
* Chess notation string parsing
* PGN
* FEN
* SAN
## Examples
* Create a board with the standard starting position:
``` swift
let board = Board()
if let position = Position(fen: "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2") {
let board = Board(position: position)
print(board)
}
// 8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
// 7 ♟ ♟ · ♟ ♟ ♟ ♟ ♟
// 6 · · · · · · · ·
// 5 · · ♟ · · · · ·
// 4 · · · · ♙ · · ·
// 3 · · · · · ♘ · ·
// 2 ♙ ♙ ♙ ♙ · ♙ ♙ ♙
// 1 ♖ ♘ ♗ ♕ ♔ ♗ · ♖
// a b c d e f g h
//
// (see ChessKitConfiguration
for printing options)
* Move pieces on the board
``` swift
let board = Board()
// 8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
// 7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
// 6 · · · · · · · ·
// 5 · · · · · · · ·
// 4 · · · · · · · ·
// 3 · · · · · · · ·
// 2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
// 1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
// a b c d e f g h
// move pawn at e2 to e4
board.move(pieceAt: .e2, to: .e4)
// 8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
// 7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
// 6 · · · · · · · ·
// 5 · · · · · · · ·
// 4 · · · · ♙ · · ·
// 3 · · · · · · · ·
// 2 ♙ ♙ ♙ ♙ · ♙ ♙ ♙
// 1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
// a b c d e f g h
Check move legality
let board = Board()
print(board.canMove(pieceAt: .a1, to: .a8)) // false
Check legal moves
let board = Board()
print(board.legalMoves(forPieceAt: .e2)) // [.e3, .e4]
Parse FEN into a Position
object
// parse FEN using Position initializer
let fen = "rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2"
let position = Position(fen: fen)
// convert Position to FEN string let fenString = position.fen
* Similarly, parse [PGN](https://en.wikipedia.org/wiki/Portable_Game_Notation) (into `Game`) or [SAN](https://en.wikipedia.org/wiki/Algebraic_notation_(chess)) (into `Move`).
``` swift
// parse PGN using Game initializer
let game = Game(pgn: "1. e4 e5 2. Nf3")
// convert Game to PGN string
let pgnString = game.pgn
// parse the move text "e4" from the starting position
let move = Move(san: "e4", in: .standard)
// convert Move to SAN string
let sanString = move.san
ChessKit
is distributed under the MIT License.