教你怎么用Python和Qt5编写中国象棋AI版——规则模块

提示:该模块用于实现规则模块


前言

提示:针对本人项目架构,本人实现各棋子走棋规则是通过进行特定的计算


提示:本篇博客内容有点多,请耐心消化

一、中国象棋大致规则?

包括:兵的过河问题、撇马脚问题、堵象眼问题,以及各棋子具体走法。

二、各棋子规则实现思路

1.兵

代码如下(示例):

def canMoveBING(ido, idd, board):
    typeStone = board.whichPlayer(board.getBoard()[ido]).lower()

    if stillSameSide(ido, board.getBoard()[ido]):
        # print("未过河")
        if 'red' in typeStone:
            return idd - ido in config.__LEGAL_红兵_MOVE_SET__
        elif 'black' in typeStone:
            return idd - ido in config.__LEGAL_黑兵_MOVE_SET__
    else:
        if 'red' in typeStone:
            return idd - ido in config.__LEGAL_红兵_过河_MOVE_SET__
        elif 'black' in typeStone:
            return idd - ido in config.__LEGAL_黑兵_过河_MOVE_SET__

注意事项

其实判断兵是否合法很简单,根据兵是否过河,判断其 偏移是否合理 即可。

过河兵合法偏移
__LEGAL_红兵_过河_MOVE_SET__ = [1, -1, -9]
__LEGAL_黑兵_过河_MOVE_SET__ = [1, -1, 9]
未过河兵合法偏移
__LEGAL_红兵_MOVE_SET__ = [-9]
__LEGAL_黑兵_MOVE_SET__ = [9]

2.马

代码如下(示例):

def canMoveMA(ido, idd, board):
    # print(config.__PIN_马__[int(config.__LEGAL_马_MOVE_SET__.index(idd - ido) / 2)])
    return idd - ido in config.__LEGAL_马_MOVE_SET__ and isPin(
        ido + config.__PIN_马__[int(config.__LEGAL_马_MOVE_SET__.index(idd - ido) / 2)], board.getBoard())

注意事项

其实判断马走法是否合法很简单,判断其 偏移是否合理且对应偏移位置是否撇马脚 即可。

马合法偏移
__LEGAL_马_MOVE_SET__ = [-19, -17, -11, 7, -7, 11, 17, 19]
马脚位置
__PIN_马__ = [-9, -1, 1, 9]

不知道大家注意到没有,马脚位置其实也是 的走法偏移。


3.车

代码如下(示例):

def canMoveCHE(ido, idd, board):
    return (int(ido / 9) == int(idd / 9) and 0 == getStoneCountX(ido, idd, board.getBoard())) or (
            (0 == (abs(ido - idd) % 9)) and 0 == (getStoneCountY(ido, idd, board.getBoard())))

注意事项

其实判断车走法是否合法也很简单,判断其 前后位置是否在同一条线上(横或竖),以及中间没子,目的地没己方子 即可。

判断是否在同一条横线上
return (int(ido / 9) == int(idd / 9) 
判断是否在同一条竖线上
return 0 == (abs(ido - idd) % 9)

这些只是简单的数学运算而已,包括每个位置的偏移等。


4.炮

代码如下(示例):

def canMovePAO(ido, idd, board):
    if int(ido / 9) == int(idd / 9):
        return (getStoneCountX(ido, idd, board.getBoard()) == 0 and board.getBoard()[idd] == config.__BLANK__) or (
                getStoneCountX(ido, idd, board.getBoard()) == 1 and (
                (board.whichPlayer(board.getBoard()[idd]) != board.whichPlayer(
            board.getBoard()[ido]) and (board.getBoard()[idd] != config.__BLANK__))))
    elif 0 == (abs(ido - idd) % 9):
        return (getStoneCountY(ido, idd, board.getBoard()) == 0 and board.getBoard()[idd] == config.__BLANK__) or (
                getStoneCountY(ido, idd, board.getBoard()) == 1 and (
                (board.whichPlayer(board.getBoard()[idd]) != board.whichPlayer(
            board.getBoard()[ido]) and (board.getBoard()[idd] != config.__BLANK__))))

注意事项

其实判断炮走法是否合法分两种情况,判断其 1、前后位置是否在同一条线上(横或竖),以及中间没子,目的地没己方子 2、前后位置是否在同一条线上,中间一个棋子,目的地是一个敌方棋子 即可。

判断目的地是否为空
return board.getBoard()[idd] != config.__BLANK__

具体实现类似于 的走法


5.将

代码如下(示例):

def canMoveJIANG(ido, idd, board):
    typeStone = board.whichPlayer(board.getBoard()[ido]).lower()

    return (idd - ido) in config.__PIN_马__ and (('red' in typeStone and idd in config.__LEGAL_红将_POS__) or (
            'black' in typeStone and idd in config.__LEGAL_黑将_POS__))

注意事项

其实判断将走法是否合法分两种情况,判断其 针对不同方判断目的位置是否合法以及偏移是否合法——这里的将的偏移就是马脚位置啦 即可。

将 合法目的位置
__LEGAL_红将_POS__ = [66, 67, 68, 75, 76, 77, 84, 85, 86]
__LEGAL_黑将_POS__ = [3, 4, 5, 12, 13, 14, 21, 22, 23]

这里的将合法位置其实也是 的合法位置


6.士

代码如下(示例):

def canMoveSHI(ido, idd, board):
    typeStone = board.whichPlayer(board.getBoard()[ido]).lower()

    return idd - ido in config.__LEGAL_士_MOVE_SET__ and (('red' in typeStone and idd in config.__LEGAL_红将_POS__) or (
            'black' in typeStone and idd in config.__LEGAL_黑将_POS__))

注意事项

其实判断士走法是否合法分两种情况,判断其 针对不同方判断目的位置是否合法以及偏移是否合法 即可。

士 合法偏移
__LEGAL_士_MOVE_SET__ = [-10, -8, 8, 10]

这里的士合法位置其实也是 的合法位置

7.相

代码如下(示例):

def canMoveXIANG(ido, idd, board):
    return idd - ido in config.__LEGAL_相_MOVE_SET__ and isPin(
        ido + config.__PIN_相__[config.__LEGAL_相_MOVE_SET__.index(idd - ido)], board.getBoard()) and stillSameSide(idd,

注意事项

其实判断相走法是否合法分两种情况,判断其 针对不同方判断目的位置是否合法以及偏移是否合法,以及是否堵象眼即可 即可。

相 合法偏移
__LEGAL_相_MOVE_SET__ = [-20, -16, 16, 20]
堵象眼位置
__PIN_相__ = [-10, -8, 8, 10]

这里的象眼位置其实也是 合法走法偏移


总结

以上就是各棋子具体走法实现,谢谢大家观看。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值