Skip to content
Chess engine and AI written in Swift
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
SwiftChess Moved tests from example project to library project May 31, 2019
.gitignore Initial commit Sep 4, 2016
LICENSE Initial commit Sep 4, 2016 Added build status and contact badges to readme May 31, 2019
SwiftChess.podspec Update version to 1.1 May 30, 2019


Version License Platform CI Status Twitter

SwiftChess is a chess engine written in Swift.



  • Move validation
  • AI with three difficulty levels
  • Callbacks for check, checkmate and stalemate
  • Supports castling
  • Supports En Passent
  • Supports pawn promotion
  • Asyncronous AI move calculation

SwiftChess doesn't provide any UI, just all of the logic required to create a chess game. The example project contains a complete UIKit UI with touch handling that you start from if you like.


The example application contains a complete implementation of SwiftChess.

Run Example/Example.xcodeproj

Basic Use

Start a game
// Make a human player
let whitePlayer = Human(color: .white)

// ... or an AI Player
let blackPlayer = AIPlayer(color: .black, configuration: AIConfiguration(difficulty: .hard))

// Create a game       
let game = Game(firstPlayer: whitePlayer, secondPlayer: blackPlayer)
Make a move
if let player = game.currentPlayer as? Human {

	let currentLocation = BoardLocation(x: 4, y: 1)
	let newLocation = BoardLocation(x: 4, y: 2)

	try! player.movePiece(from: currentLocation,
                        to: newLocation)
Tell the AI to make a move
if let player =  game.currentPlayer as? AIPlayer {
Then just wait for the callbacks!
extension GameViewController: GameDelegate {

	func gameDidMovePiece(game: Game, piece: Piece, toLocation: BoardLocation) {
        // Move piece on board
    func gameDidRemovePiece(game: Game, piece: Piece, location: BoardLocation) {
        // Remove piece from board 
    func gameDidTransformPiece(game: Game, piece: Piece, location: BoardLocation) {
    	// A pawn was promoted!
    func gameWonByPlayer(game: Game, player: Player) {
    func gameEndedInStaleMate(game: Game) {
    func gameDidChangeCurrentPlayer(game: Game) {
    	// Make another move        


The entire state of a SwiftChess game can be converted to and initialised from a Dictionary.

Get a snapshot of the current state:

let dictionary: [String: Any] = game.dictionaryRepresentation

Initialise a game with a previous snapshot:

let game = Game(dictionary: dictionary)

The returned dictionary stores all the information required to create a 'save game' feature. The player colors, AI difficulty, piece positions etc.

You can serialize this to JSON, save it to disk, send it over the network etc.

Other stuff

Make a castling move
if game.board.canColorCastle(color: .white, side: .kingSide) {
	player.performCastleMove(side: .kingSide)
Support pawn promotion
func promotedTypeForPawn(location: BoardLocation, 
                         player: Human, 
                         possiblePromotions: [Piece.PieceType], 
                         callback: @escaping (Piece.PieceType) -> Void) {

	// Show UI for the user to select one of the possible promotion types
	// then call the handler
	// ...or some games just promote to a queen


Follow me on twitter @SteveBarnegren


SwiftChess is available under the MIT license. See the LICENSE file for more info.

You can’t perform that action at this time.