I love iOSiOS Developer代码改变世界

用Swift写围棋App-07解析器改进

2015-12-29  本文已影响311人  MarkNote

已完成章节索引

用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
下一步,就需要把每一步棋,绘制到棋盘上了。

上一篇下一篇

猜你喜欢

热点阅读