用Swift寫圍棋App-08繪制每一手棋

已完成章節(jié)索引

用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算法改進

要繪制棋子其實不難:

  • 首先,每一手棋要么是黑棋渴语,要么是白棋苹威,這個可以通過繪制UIImage來實現(xiàn)

        let imgBlack = UIImage(named: "Black.png")
        let imgWhite = UIImage(named: "White.png")
  • 其次,每一手棋的位置信息驾凶,都已經(jīng)在 Move對象中了牙甫。我們只需要挨個往棋譜上放就好了。

改進后的棋譜View代碼如下:


import UIKit

class GobanView: UIView {
    var moves:[Move]?

    override func drawRect(rect: CGRect) {
        
        let ctx = UIGraphicsGetCurrentContext()
        let rec = CGContextGetClipBoundingBox(ctx)
        let w = rec.size.width;
        //back ground image
        let background = UIImage(named:"board_back")
        
        CGContextDrawImage(ctx, rec, background!.CGImage )
        let space = w/20.0
        drawLines(ctx!,space:space,w:w)
        drawDots(ctx!,space:space)
        if (moves != nil  && moves?.count > 0)  {
            drawMoves(ctx!, stoneSize: space)
        }
        
    }
    func drawLines(ctx:CGContext,space:CGFloat, w:CGFloat){
        CGContextSetRGBStrokeColor(ctx, 0, 0, 0, 1)
        CGContextSetLineWidth(ctx, 0.4)
        CGContextBeginPath(ctx)
        
        for(var i=0;i<=18;i++)
        {
            
            CGContextMoveToPoint(ctx, (CGFloat(i+1))*space, space)
            CGContextAddLineToPoint(ctx, (CGFloat(i+1))*space, w-space)
            CGContextStrokePath(ctx)
        }
        for(var i=0;i<=18;i++)
        {
            
            CGContextMoveToPoint(ctx, space,(CGFloat(i+1))*space);
            CGContextAddLineToPoint(ctx,w-space, (CGFloat(i+1))*space);
            CGContextStrokePath(ctx);
        }

    }
    func drawDots(ctx:CGContext,space:CGFloat){
        for (var i=0;i<=2;i++)
        {
            for(var j=0;j<=2;j++)
            {
                CGContextBeginPath(ctx);
                
                CGContextAddArc(ctx, (CGFloat(1+3+6*i))*space ,CGFloat(1+3+6*j)*space, 2, 0, CGFloat(2.0*M_PI), 1);
                
                CGContextStrokePath(ctx);
            }
        }

    }
    
    func drawMoves(ctx:CGContext,stoneSize:CGFloat ){
        // chess
        let imgBlack = UIImage(named: "Black.png")
        let imgWhite = UIImage(named: "White.png")
       
        let  count = moves?.count
        for (var i = 0; i < count; i++ )
        {
            let move = moves![i]
            let imageRect = CGRectMake( (CGFloat(move.location.x)+0.5)*stoneSize,(CGFloat(move.location.y)+0.5)*stoneSize, stoneSize, stoneSize);
            if move.type == .White
            {
                CGContextDrawImage(ctx, imageRect, imgWhite?.CGImage)
            }else
            {
                CGContextDrawImage(ctx, imageRect, imgBlack?.CGImage )
                
            }
        }
    }

}

現(xiàn)在调违,只需將棋譜信息傳給棋譜GobanView就好了窟哺。
為了能一步步的演示,我們每次只需要傳從第一手技肩,到當(dāng)前手就好了脏答。核心代碼如下:

let moves = _game.allMoves[0..<_currentMove]
            _goban.moves = Array(moves)
            _goban.setNeedsDisplay()

然后在GameViewController中加上前進和后退的事件:

@IBAction func backClick(sender:UIBarItem){
        _currentMove -= 1
        if (_currentMove < 0){
            _currentMove = 0
        }
        showMoves()
    }
    
    @IBAction func forwardClick(sender:UIBarItem){
        _currentMove += 1
        if (_currentMove > _game.allMoves.count - 1){
            _currentMove = _game.allMoves.count - 1
        }
        showMoves()
    }
    func showMoves(){
        if _game.allMoves.count > 0 {
            let moves = _game.allMoves[0..<_currentMove]
            _goban.moves = Array(moves)
            _goban.setNeedsDisplay()
            _lblTitle.text = "\(_game.playerBlack) v \(_game.playerWhite)   \(_currentMove + 1) / \(_game.allMoves.count)"
        }
    }

好了,激動人心的時刻到來了。
我們運用應(yīng)用殖告,效果如下:

Simulator Screen Shot 30 Dec 2015, 10.15.59 PM.png

太好了阿蝶!
現(xiàn)在可以點擊演示每一手棋了!
打譜的功能基本完成黄绩!
目前還有幾個小問題羡洁。其中最大的問題在于,程序只知道加載所有的棋爽丹,不知道提子筑煮,也就是除去沒有氣的棋子。
這個問題需要研究一下算法粤蝎,我們后面再弄真仲。
現(xiàn)在push最新的代碼到github:https://github.com/marknote/GoTao

你可以編譯,好好把玩一下了初澎!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秸应,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碑宴,更是在濱河造成了極大的恐慌软啼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件延柠,死亡現(xiàn)場離奇詭異祸挪,居然都是意外死亡,警方通過查閱死者的電腦和手機贞间,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門贿条,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人增热,你說我怎么就攤上這事闪唆。” “怎么了钓葫?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵悄蕾,是天一觀的道長。 經(jīng)常有香客問我础浮,道長帆调,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任豆同,我火速辦了婚禮番刊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘影锈。我一直安慰自己芹务,他們只是感情好蝉绷,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枣抱,像睡著了一般熔吗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佳晶,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天桅狠,我揣著相機與錄音,去河邊找鬼轿秧。 笑死中跌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菇篡。 我是一名探鬼主播漩符,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驱还!你這毒婦竟也來了嗜暴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铝侵,失蹤者是張志新(化名)和其女友劉穎灼伤,沒想到半個月后触徐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咪鲜,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年撞鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了疟丙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸟雏,死狀恐怖享郊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孝鹊,我是刑警寧澤炊琉,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站又活,受9級特大地震影響苔咪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柳骄,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一团赏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耐薯,春花似錦舔清、人聲如沸丝里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杯聚。三九已至,卻和暖如春营密,著一層夾襖步出監(jiān)牢的瞬間械媒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工评汰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纷捞,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓被去,卻偏偏與公主長得像主儡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惨缆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容