Prolog开发AI国际象棋时车、象可行走法谓词实现问题
Prolog国际象棋滑动棋子(车/主教)移动实现方案
核心逻辑抽象:车和主教属于滑动类棋子,走法逻辑可复用「固定方向步进+路径遮挡判断+吃子校验」的通用框架,无需重复编码。
前置修正:现有兵逻辑bug修复
原有黑兵吃子逻辑存在两处笔误:两个吃子分支均错误写为NewCol is Col-1,且吃子校验错误匹配己方棋子,修正后代码如下:
opposite(white, black). opposite(black, white). %% 修正后的黑兵吃子逻辑 movement(Board,piece(black,pawn,Col,Row),piece(black,pawn,NewCol,NewRow)):- NewCol is Col-1, NewRow is Row-1, in_boundaries(NewCol,NewRow), opposite(black, OppColor), member(piece(OppColor,_,NewCol,NewRow),Board). movement(Board,piece(black,pawn,Col,Row),piece(black,pawn,NewCol,NewRow)):- NewCol is Col+1, NewRow is Row-1, in_boundaries(NewCol,NewRow), opposite(black, OppColor), member(piece(OppColor,_,NewCol,NewRow),Board).
通用滑动逻辑实现
新增通用步进谓词,处理路径生成、遮挡判断、吃子逻辑:
% 滑动步进取值:当前坐标、步进增量、棋盘、己方颜色、棋子类型、合法目标棋子 % 分支1:单步进后合法(空位/可吃对方棋子) slide_step(Col, Row, DCol, DRow, Board, MyColor, Type, piece(MyColor, Type, NextC, NextR)) :- NextC is Col + DCol, NextR is Row + DRow, in_boundaries(NextC, NextR), ( nonmember(piece(_, _, NextC, NextR), Board) ; opposite(MyColor, OppColor), member(piece(OppColor, _, NextC, NextR), Board) ). % 分支2:单步进后为空,可继续向同方向滑动,递归生成更远位置 slide_step(Col, Row, DCol, DRow, Board, MyColor, Type, Target) :- NextC is Col + DCol, NextR is Row + DRow, in_boundaries(NextC, NextR), nonmember(piece(_, _, NextC, NextR), Board), slide_step(NextC, NextR, DCol, DRow, Board, MyColor, Type, Target).
车(Rook)移动逻辑
车支持上下左右四个方向滑动,直接调用通用滑动逻辑即可:
movement(Board, piece(MyColor, rook, Col, Row), Target) :- % 四个移动方向:(列增量, 行增量) member((DCol, DRow), [(0,1), (0,-1), (1,0), (-1,0)]), slide_step(Col, Row, DCol, DRow, Board, MyColor, rook, Target).
主教(Bishop)移动逻辑
主教支持四个对角线方向滑动:
movement(Board, piece(MyColor, bishop, Col, Row), Target) :- % 四个对角线移动方向 member((DCol, DRow), [(1,1), (1,-1), (-1,1), (-1,-1)]), slide_step(Col, Row, DCol, DRow, Board, MyColor, bishop, Target).
后续扩展提示
后续实现皇后逻辑时,仅需要将车和主教的方向合并传入slide_step即可,无需额外编写逻辑。
内容的提问来源于stack exchange,提问作者avihaiB
相关产品推荐
相关产品推荐

