• Stars
    star
    142
  • Rank 258,495 (Top 6 %)
  • Language
    Swift
  • License
    MIT License
  • Created about 8 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Chess engine and AI written in Swift

SwiftChess

Version License Platform CI Status Twitter

SwiftChess is a chess engine written in Swift.

swiftchess

Features

  • 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.

Example

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 {
	player.makeMoveAsync()
}
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) {
    	ShowAlert("Checkmate!")
    }
    
    func gameEndedInStaleMate(game: Game) {
     	ShowAlert("Stalemate!")
    }
    
    func gameDidChangeCurrentPlayer(game: Game) {
    	// Make another move        
    }
}

Persistence

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
	callback(.queen)
}

Author

Follow me on twitter @SteveBarnegren

License

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