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
// 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)
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)
}
if let player = game.currentPlayer as? AIPlayer {
player.makeMoveAsync()
}
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) {
ShowAlert("Checkmate!")
}
func gameEndedInStaleMate(game: Game) {
ShowAlert("Stalemate!")
}
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.
if game.board.canColorCastle(color: .white, side: .kingSide) {
player.performCastleMove(side: .kingSide)
}
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
callback(.queen)
}
Follow me on twitter @SteveBarnegren
SwiftChess is available under the MIT license. See the LICENSE file for more info.