ios 棋类游戏对战的实现

棋类游戏对战的实现

  • 六洲棋
  • 五子棋
  • AI对战
  • 蓝牙对战
  • 在线对战

六洲棋

六洲棋,又称:泥棋、插方、来马、五福棋,中国民间传统棋类体育形式。源于民间,简便、通俗、易学,在民间广为流行,深受社会底层大众的喜爱。龙其在淮河流域的安徽省、河南省、江苏省、以及湖北省、山东省非常普及,并流传到中国各地,包括港、澳、台地区。起源于劳动人民生活,根植于民间大众之中,它简捷、明快,趣味性、竞技性强,是一项长期流行于民间,富有传统文化色彩的竞技项目。对于启迪智慧,休闲娱乐,增进交流非常有益。列安徽省第二批省级非物质文化遗产。
6*6纵横线组成,共三十六个棋点。每方十八枚棋子,以两色区分敌我。

规则

对弈过程分三阶段。(凤阳下法)放子:对弈双方依次将己子放入空棋点,将手上的棋子放完才开始走子。逼子:若无棋子被吃,使得棋子放满棋盘。则两人各选对方一枚敌子移出游戏。走子:由后手方开始轮流移动己棋,沿线直横线一格。吃子:无论是下子或走子阶段,只要己方棋子排成以下排列称为成城,就要吃掉一定数量的敌子,但不可吃掉已成城子的敌棋。在放子阶段,被吃的子先作记号,等走子阶段开始才一齐提取。
成六:六枚棋子以纵、横和斜3个方向连成直线(除了四条边的直线)。吃掉敌方三子。

six

six_two

斜五:连子的2头都靠棋盘边缘,吃掉敌方两子。

five

斜四:连子的2头都靠棋盘边缘,吃掉敌方一子。

four

斜三:连子的2头都靠棋盘边缘,吃掉敌方一子。

three

成方:四枚棋子组成一个紧邻相连的小正方形,吃掉敌方一子。

check

使对方只剩下三枚以下则获胜。因为是民间文化,各地稍有差异。

棋型的算法实现

“`swift
//是否形成斜子棋(三子棋,四子棋,五子棋,六子棋)
static func isXiZiChess(_ point:SWSPoint,_ chessArray: [[FlagType]]) -> LianZhuState?{
let type = chessArray[point.x][point.y]
let pointLeft = SWSPoint()
let pointRight = SWSPoint()
let ponitTop = SWSPoint()
let pointBottom = SWSPoint()

    // 东北方向
    var i = 0
    while point.x - i >= 0 && point.y + i <= 5 && chessArray[point.x - i][point.y + i] == type {
        pointLeft.x = point.x - i
        pointLeft.y = point.y + i
        i += 1
    }
        i = 0
    while point.x + i <= 5 && point.y - i >= 0 && chessArray[point.x + i][point.y - i] == type {
        pointRight.x = point.x + i
        pointRight.y = point.y - i
        i += 1
    }

    //西北方向
    i = 0
    while point.x - i >= 0 && point.y - i >= 0 && chessArray[point.x - i][point.y - i] == type {
        ponitTop.x = point.x - i
        ponitTop.y = point.y - i
        i += 1
    }
    i = 0
    while point.x + i <= 5 && point.y + i <= 5 && chessArray[point.x + i][point.y + i] == type {
        pointBottom.x = point.x + i
        pointBottom.y = point.y + i
        i += 1
    }
    print(pointRight.x,pointRight.y,pointLeft.x,pointLeft.y,ponitTop.x,ponitTop.y,pointBottom.x,pointBottom.y)
    let arr = [3,2,1,0]
    for index in arr {

        func condition() -> Bool {
            if pointRight.x == 2+index && pointRight.y == 0 && pointLeft.x == 0 && pointLeft.y == 2+index {
                return true
            }
            if pointRight.x == 5  && pointRight.y == 3 - index && pointLeft.x == 3 - index && pointLeft.y == 5 {
                return true
            }
            if ponitTop.x == 0 && ponitTop.y == 3-index && pointBottom.x == 2+index && pointBottom.y == 5 {
                return true
            }
            if ponitTop.x == 3-index && ponitTop.y == 0 && pointBottom.x == 5 && pointBottom.y == 2+index {
                return true
            }
            return false
        }

        if condition() {
            switch index {
            case 0:
                return .threeChess
            case 1:
                return .fourChess
            case 2:
                return .fiveChess
            case 3:
                return .sixChess
            default:()
            }
        }
    }
    return nil
}

 //是否形成方格棋
static func isCheckChess(_ point:SWSPoint,_ chessArray: [[FlagType]]) ->LianZhuState? {
    let type = chessArray[point.x][point.y]
    //左上
    if point.x - 1 >= 0 && point.y - 1 >= 0 && chessArray[point.x][point.y-1] == type &&
        chessArray[point.x-1][point.y] == type && chessArray[point.x-1][point.y-1] == type {
        return .checkChess
    }
    //左下
    if point.x - 1 >= 0 && point.y + 1 <= 5 && chessArray[point.x][point.y+1] == type &&
        chessArray[point.x-1][point.y] == type && chessArray[point.x-1][point.y+1] == type {
        return .checkChess
    }
    //右上
    if point.x + 1 <= 5 && point.y - 1 >= 0 && chessArray[point.x][point.y-1] == type &&
        chessArray[point.x+1][point.y] == type && chessArray[point.x+1][point.y-1] == type {
        return .checkChess
    }
    //右下
    if point.x + 1 <= 5 && point.y + 1 <= 5 && chessArray[point.x][point.y+1] == type &&
        chessArray[point.x+1][point.y] == type && chessArray[point.x+1][point.y+1] == type {
        return .checkChess
    }
    return nil
}

“`

小结

六洲棋,在我们老家被称为泥棋,小时候经常玩的一种棋,偶有回忆,因此实现下这个游戏,望能找到个棋友没事玩玩,这种棋,玩法多种,很有趣。

五子棋

五子棋五子棋是比较流行的棋类游戏了,玩法简单,基本上人人会玩,在此就不介绍游戏规则了。下面使用 swift实现五子棋这个游戏,主要实现AI算法,包括极大值极小值算法,深度搜索算法,估值函数,Alpha Beta 剪枝算法等等。

 //横向五子连珠(除去四边线的五子连珠)
    static func isFiveChess(_ point:SWSPoint,_ chessArray: [[FlagType]]) -> Bool {
        let type = chessArray[point.x][point.y]
        let pointLeft = SWSPoint()
        let pointRight = SWSPoint()
        let pointTop = SWSPoint()
        let pointBottom = SWSPoint()
        let pointLeft45 = SWSPoint()
        let pointRight45 = SWSPoint()
        let pointTop135  = SWSPoint()
        let pointBottom135 = SWSPoint()
        //东西方向
        var i = 0
        while point.x - i >= 0 && chessArray[point.x - i][point.y] == type {
            pointLeft.x = point.x - i
            i += 1
        }
        i = 0
        while point.x + i <= 14 && chessArray[point.x + i][point.y] == type {
            pointRight.x = point.x + i
            i += 1
        }

        if pointRight.x - pointLeft.x == 4 && (pointLeft.y != 15 || pointLeft.y != 0){
            return true
        }
        //南北方向
        i = 0
        while point.y - i >= 0 && chessArray[point.x][point.y-i] == type {
            pointTop.y = point.y - i
            i += 1
        }
        i = 0
        while point.y + i <= 14 && chessArray[point.x][point.y+i] == type {
            pointBottom.y = point.y + i
            i += 1
        }
        if pointBottom.y - pointTop.y == 4 && (pointTop.x != 15 || pointTop.x != 0) {
            return true
        }

        // 东北方向
         i = 0
        while point.x - i >= 0 && point.y + i <= 14 && chessArray[point.x - i][point.y + i] == type {
            pointLeft45.x = point.x - i
            pointLeft45.y = point.y + i
            i += 1
        }
        i = 0
        while point.x + i <= 14 && point.y - i >= 0 && chessArray[point.x + i][point.y - i] == type {
            pointRight45.x = point.x + i
            pointRight45.y = point.y - i
            i += 1
        }

        if pointLeft45.y - pointRight45.y == 4{
            return true
        }

        //西北方向
        i = 0
        while point.x - i >= 0 && point.y - i >= 0 && chessArray[point.x - i][point.y - i] == type {
            pointTop135.x = point.x - i
            pointTop135.y = point.y - i
            i += 1
        }
        i = 0
        while point.x + i <= 14 && point.y + i <= 14 && chessArray[point.x + i][point.y + i] == type {
            pointBottom135.x = point.x + i
            pointBottom135
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值