Prolog实现国际象棋棋盘坐标排序及格式化打印方法
Prolog国际象棋棋盘打印功能实现
初始问题版本
最初编写的实现代码运行时会陷入无限循环,存在无意义的异常回溯问题,初始代码如下:
boardN([w-k-(a-1), b-k-(h-8), b-q-(h-1)]). small(a-1). small(h-8). small(h-1). small(h-7). pretty(B) :- findall(X, small(X), Ps), pretty_h(Ps, B). pretty_h([], _). pretty_h([P|Rest], B) :- (member(Piece-P, B), uci(Piece);format('X')), pretty_h(Rest, B).
现有基础约定
棋盘数据表示
采用如下结构表示国际象棋棋盘数据:
board([w-k-(a-2), b-q-(c-3), w-r-(a-1), b-b-(h-8)]).
目标输出格式
期望执行查询后打印效果如下:
8 b 7 6 5 4 3 q 2K 1R abcdefgh
已实现功能模块
- 棋子格式化输出谓词
uci已编写完成,代码如下:
uci(w-r) :- format('R'). uci(w-q) :- format('Q'). uci(w-k) :- format('K'). uci(w-n) :- format('N'). uci(w-b) :- format('B'). uci(w-p) :- format('P'). uci(b-Role) :- format('~a', Role).
- 位置大小比较谓词已编写完成,支持按
a-8到h-1的顺序比较位置优先级,代码如下:
up(1-2). up(2-3). up(3-4). up(4-5). up(5-6). up(6-7). up(7-8). upper(X-Y, []) :- up(X-Y). upper(X-Y, [Z|Rest]) :- up(X-Z), upper(Z-Y, Rest). right(a-b). right(b-c). right(c-d). right(d-e). right(e-f). right(f-g). right(g-h). righter(X-Y, []) :- right(X-Y). righter(X-Y, [Z|Rest]) :- right(X-Z), righter(Z-Y, Rest). bigger(X-Y,X_-Y_) :- upper(Y-Y_); Y=Y_, righter(X-X_).
待实现需求
需要补全pretty谓词,当前pretty谓词的基础框架如下:
pretty(B) :- format('r k k \nhello~a', B).
要求执行查询?- board(B), pretty(B).时可正确输出棋盘。
核心实现规则:
- 生成按
a-8到h-1排序的所有棋盘位置列表 - 逐行遍历每个位置,若当前位置存在对应棋子则打印棋子字符,否则打印空格
- 实现逻辑尽可能简洁精准,避免冗余杂乱逻辑,解决初始版本的无限回溯问题
内容的提问来源于stack exchange,提问作者eguneys
相关产品推荐
相关产品推荐

