提示:该模块用于实现规则模块
教你怎么用Python和Qt5编写中国象棋AI版——规则模块
- 前言
- 一、中国象棋大致规则?
- 二、各棋子规则实现思路
- 1.兵
- 注意事项
- 过河兵合法偏移
- 未过河兵合法偏移
- 2.马
- 注意事项
- 马合法偏移
- 马脚位置
- 3.车
- 注意事项
- 判断是否在同一条横线上
- 判断是否在同一条竖线上
- 4.炮
- 注意事项
- 判断目的地是否为空
- 5.将
- 注意事项
- 将 合法目的位置
- 6.士
- 注意事项
- 士 合法偏移
- 7.相
- 注意事项
- 相 合法偏移
- 堵象眼位置
- 总结
前言
提示:针对本人项目架构,本人实现各棋子走棋规则是通过进行特定的计算
提示:本篇博客内容有点多,请耐心消化
一、中国象棋大致规则?
包括:兵的过河问题、撇马脚问题、堵象眼问题,以及各棋子具体走法。
二、各棋子规则实现思路
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]
这里的象眼位置其实也是 士 合法走法偏移
总结
以上就是各棋子具体走法实现,谢谢大家观看。