Sage 是一个用于 Swift 的跨平台国际象棋库。
开发在 develop
分支上进行。
分支 | 状态 |
---|---|
master |
|
develop |
The Swift 包管理器 是 Swift 的非集中式依赖项管理器。
将项目添加到您的 Package.swift
。
import PackageDescription
let package = Package(
name: "MyAwesomeProject",
dependencies: [
.Package(url: "https://github.com/nvzqz/Sage.git",
majorVersion: 2)
]
)
导入 Sage 模块。
import Sage
下载并将 /Sources
文件夹拖放到您的项目中。
恭喜!
运行国际象棋游戏可以通过设置循环实现。
import Sage
let game = Game()
while !game.isFinished {
let move = ...
try game.execute(move: move)
}
可以使用 execute(move:)
和其更快但不安全的兄弟函数 execute(uncheckedMove:)
来执行 Game
实例的移动。
execute(uncheckedMove:)
方法假设传入的移动是合法的。只有在你完全确定这是真的情况下才应该调用此方法。例如,当你使用 availableMoves()
返回的移动时。其他情况下使用 execute(move:)
,它会检查传入移动的合法性。
Sage 能够生成当前玩家的合法移动,并提供对诸如吃过路兵和长将等特殊移动的完整支持。
availableMoves()
将返回当前所有可用的移动。
movesForPiece(at:)
将返回一个方格上所有棋子的移动。
movesBitboardForPiece(at:)
将返回一个包含一个方格上棋子可以移动到的所有方格的 Bitboard
。
Sage 还可以使用 Game
状态的 isLegal(move:)
方法来验证一个移动是否合法。
execute(move:)
方法族会调用此方法,因此直接执行移动并捕捉任何非法移动的错误会更高效。
使用 undoMove()
和 redoMove()
方法执行移动撤销和重做操作。撤销或重做的移动将被返回。
要仅检查要撤销或重做的移动,可以使用 moveToUndo()
和 moveToRedo()
方法。
execute(move:promotion:)
方法接受一个闭包,该闭包返回一个升变棋子的类型。这允许应用程序提示用户选择升变棋子或在进行选择之前执行任何其他操作。
try game.execute(move: move) {
...
return .queen
}
只有在移动为兵升变时才会执行闭包。如果升变棋子类型不能将兵升变(例如用国王或兵),则会抛出错误。
也可以不提供闭包直接给出棋子类型。默认为皇后。
try game.execute(move: move, promotion: .queen)
Both Board
and Bitboard
types have an ascii
property that can be used to print a visual board.
let board = Board()
board.ascii
// +-----------------+
// 8 | r n b q k b n r |
// 7 | p p p p p p p p |
// 6 | . . . . . . . . |
// 5 | . . . . . . . . |
// 4 | . . . . . . . . |
// 3 | . . . . . . . . |
// 2 | P P P P P P P P |
// 1 | R N B Q K B N R |
// +-----------------+
// a b c d e f g h
board.occupiedSpaces.ascii
// +-----------------+
// 8 | 1 1 1 1 1 1 1 1 |
// 7 | 1 1 1 1 1 1 1 1 |
// 6 | . . . . . . . . |
// 5 | . . . . . . . . |
// 4 | . . . . . . . . |
// 3 | . . . . . . . . |
// 2 | 1 1 1 1 1 1 1 1 |
// 1 | 1 1 1 1 1 1 1 1 |
// +-----------------+
// a b c d e f g h
Game.Position
和 Board
类型都可以生成一个 FEN 字符串。
let game = Game()
game.position.fen()
// rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
game.board.fen()
// rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
它们也可以从 FEN 字符串中初始化。
assert(Board(fen: game.board.fen()) == game.board)
assert(Game.Position(fen: game.position.fen()) == game.position)
Board
类型符合 Sequence
,通过其空间进行迭代无缝。
for space in Board() {
if let piece = space.piece {
print("\(piece) at \(space.square)")
}
}
Sequence
和 Square
有两个方法返回从一个方格 إلى another 方格的所有移动数组。
[.a1, .h3, .b5].moves(from: .b4)
// [b4 >>> a1, b4 >>> h3, b4 >>> b5]
[.c3, .d2, .f1].moves(to: .a6)
// [c3 >>> a6, d2 >>> a6, f1 >>> a6]
Square.d4.moves(from: [.c2, .f8, .h2])
// [c2 >>> d4, f8 >>> d4, h2 >>> d4]
Square.a4.moves(to: [.c3, .d4, .f6])
// [a4 >>> c3, a4 >>> d4, a4 >>> f6]
要使用 Sage.playground
,首先打开 Sage.xcodeproj
并构建 OS X 目标。然后你可以在项目中使用沙盒。
Board
遵循 CustomPlaygroundQuickLookable
协议。
Sage 根据 Apache 许可协议 2.0 版本发布。