已完成章节索引
用Swift写围棋App-00序
用Swift写围棋App-01准备工作
用Swift写围棋App-02建立工程
用Swift写围棋App-03StoryBoard
用Swift写围棋App-04棋盘
用Swift写围棋App-05初识棋谱
用Swift写围棋App-06解析器初版
用Swift写围棋App-07解析器改进
用Swift写围棋App-08绘制每一手棋
用Swift写围棋App-09分片算法
用Swift写围棋App-10气的算法
用Swift写围棋App-11算法改进
昨天解析器的第一个版本已经出来了,不过功能只能用一个词形容:简陋。
今天我们对它进行改进。既然是TDD,我们先写测试用例:
func testKifuMetaInfo() {
let kifu = "(;PB[本因坊秀策]\nBR[六段]\nPW[林柏荣门人]\nWR[七段]\nPC[江户御城,日本]\nRE[共241手,黑胜7目]\nDT[1851-11-17]"
let game = parser.parse(kifu)
assert(game.playerBlack == "本因坊秀策" )
assert(game.playerWhite == "林柏荣门人" )
assert(game.rankBlack == "六段" )
assert(game.rankWhite == "七段" )
assert(game.result == "共241手,黑胜7目" )
assert(game.date == "1851-11-17")
}
运行它,当然会出问题,然后改进一下代码,让测试通过。
改进一下GameInfo
:
import Foundation
class GameInfo: NSObject {
var title: String = ""
var metaInfo: String = ""
var playerWhite: String = ""
var playerBlack: String = ""
var rankWhite: String = ""
var rankBlack: String = ""
var result: String = ""
var date:String = ""
var allMoves: [Move] = [Move]()
}
改进一下SGFParser:
public class SGFParser {
func parse(kifu:String)->GameInfo{
let game = GameInfo()
let nodes = kifu.characters.split { $0 == ";" }
.map(String.init)
if nodes.count >= 2 {
let metaNode = nodes[1]
if let pb = metaNode.findValueWithTags("PB[", endTag: "]"){
game.playerBlack = pb
}
if let pw = metaNode.findValueWithTags("PW[", endTag: "]"){
game.playerWhite = pw
}
if let br = metaNode.findValueWithTags("BR[", endTag: "]"){
game.rankBlack = br
}
if let wr = metaNode.findValueWithTags("WR[", endTag: "]"){
game.rankWhite = wr
}
if let re = metaNode.findValueWithTags("RE[", endTag: "]"){
game.result = re
}
if let dt = metaNode.findValueWithTags("DT[", endTag: "]"){
game.date = dt
}
}
let moves = nodes
.filter{($0.hasPrefix("B[")||$0.hasPrefix("W["))&&$0.characters.count==5}
.map{Move(step: $0 as String)}
//print(moves)
game.allMoves = moves
return game
}
}
经过改进,解析器通过了测试用例,这意味着它已经基本可以解析棋谱。
这是一个伟大的胜利。
很好,可以收工。
代码Push到github https://github.com/marknote/GoTao
下一步,就需要把每一步棋,绘制到棋盘上了。