美文网首页I love iOSiOS Developer代码改变世界
用Swift写围棋App-07解析器改进

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

作者: MarkNote | 来源:发表于2015-12-29 20:13 被阅读311次

    已完成章节索引

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

    相关文章

      网友评论

        本文标题:用Swift写围棋App-07解析器改进

        本文链接:https://www.haomeiwen.com/subject/xyrihttx.html