Sage 2.5.2

Sage 2.5.2

测试已测试
语言语言 SwiftSwift
许可证 Apache 2
发布最新发布2016 年 9 月
SPM支持 SPM

Nikolai Vazquez 维护。



Sage 2.5.2

Sage 是一个用于 Swift 的跨平台国际象棋库。

开发在 develop 分支上进行。

构建状态

分支 状态
master
develop

功能

  • [x] 国际象棋游戏管理
  • [x] 国际象棋棋盘结构
  • [x] 走棋生成/验证
  • [x] 过河拆将和长将
  • [x] 车兵提升
  • [x] 游戏和棋盘的 FEN
  • [x] PGN 解析和导出
  • [x] 文档

安装

兼容性

  • 平台
    • macOS 10.9+
    • iOS 8.0+
    • watchOS 2.0+
    • tvOS 9.0+
    • Linux
  • Xcode 7.3 和 8.0
  • Swift 2.2 和 3.0

使用 Swift 包管理器安装

The Swift 包管理器 是 Swift 的非集中式依赖项管理器。

  1. 将项目添加到您的 Package.swift

    import PackageDescription
    
    let package = Package(
        name: "MyAwesomeProject",
        dependencies: [
            .Package(url: "https://github.com/nvzqz/Sage.git",
                     majorVersion: 2)
        ]
    )
  2. 导入 Sage 模块。

    import Sage

手动安装

  1. 下载并将 /Sources 文件夹拖放到您的项目中。

  2. 恭喜!

使用方法

游戏管理

运行国际象棋游戏可以通过设置循环实现。

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.PositionBoard 类型都可以生成一个 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)")
    }
}

方格转到移动

SequenceSquare 有两个方法返回从一个方格 إلى 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 协议。

Playground quick look

许可证

Sage 根据 Apache 许可协议 2.0 版本发布。