
本文详解如何通过递归遍历对角线方向,判断跳棋(checkers)中一枚棋子能否执行单步或多步连续捕获,并返回所有合法落点坐标。核心在于模拟“跳过敌方棋子并落在空位”的模式,支持前向双对角线搜索与深度优先回溯。
本文详解如何通过递归遍历对角线方向,判断跳棋(checkers)中一枚棋子能否执行单步或多步连续捕获,并返回所有合法落点坐标。核心在于模拟“跳过敌方棋子并落在空位”的模式,支持前向双对角线搜索与深度优先回溯。
在跳棋类游戏中,实现多步连续捕获(multiple jumps) 的关键不在于一次性预计算全部路径,而在于建立一个可递归扩展的捕获检测机制:当一枚棋子(如顶部的金色棋子)满足“前方对角线相邻格为敌方棋子、再前方对角线格为空”时,即构成一次有效跳跃;若跳跃后的新位置仍满足该条件,则应继续递归检测——这正是实现强制连跳(mandatory multi-capture)逻辑的基础。
以下是一个精简、可集成的 getCaptures 函数实现,专为标准 8×8 跳棋设计(假设棋子仅向前下方移动,即行号递增方向):
// 棋盘编码说明:
// 0 → 空位;1 → 当前玩家棋子(如金色);-1 → 对手棋子(如红色)
const board = [
[ 0, 1, 0, 1, 0, 1, 0, 1],
[ 1, 0, 1, 0, 1, 0, 1, 0],
[ 0, 1, 0, 1, 0, 1, 0, 1],
[-1, 0, -1, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-1, 0, -1, 0, -1, 0, -1, 0],
[ 0, 0, 0, -1, 0, 0, 0, -1],
[-1, 0, -1, 0, -1, 0, -1, 0],
];
// 安全获取棋盘单元格值(越界返回 null)
function getCell(board, row, col) {
if (row = board.length || col >= board[0].length) {
return null;
}
return board[row][col];
}
// 主函数:返回从 (row, col) 出发的所有合法多步捕获终点坐标(二维数组 [[r1,c1], [r2,c2], ...])
function getCaptures(board, row, col) {
const captures = [];
// 只检查两个前向对角线方向:右下 (row+1, col+1) 和左下 (row+1, col-1)
for (const deltaCol of [-1, 1]) {
const midRow = row + 1;
const midCol = col + deltaCol;
const endRow = row + 2;
const endCol = col + deltaCol * 2;
// 条件:中间格是对手棋子(-1),终点格为空(0)
if (getCell(board, midRow, midCol) === -1 && getCell(board, endRow, endCol) === 0) {
// 找到一次基础捕获
const nextCaptures = getCaptures(board, endRow, endCol);
if (nextCaptures.length === 0) {
// 无后续捕获,记录当前终点
captures.push([endRow, endCol]);
} else {
// 连续捕获:将所有后续路径终点合并进来
captures.push(...nextCaptures);
}
}
}
return captures;
}
// 使用示例:查询位于第2行第1列(0索引)的棋子可跳至哪些位置
console.log(getCaptures(board, 2, 1));
// 输出类似:[[4, 0], [4, 2], [6, 0]] —— 表示三处合法落点
✅ 关键设计要点说明:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
方向限定:本实现默认仅支持“向下”捕获(
row + 1,row + 2),符合题目中“顶部棋子捕获向下”的需求;如需支持王棋(king)双向移动,可扩展为遍历[-1, 1]行偏移。 -
递归终止:当某次跳跃后无法再找到满足
mid=-1 && end=0的组合时,递归自然结束,返回当前终点。 -
路径去重与顺序:返回的是所有可能的最终落点(非路径序列),若需完整路径(如
[2,1]→[4,0]→[6,-1]),可在递归中传递路径数组并累积。 -
性能注意:真实项目中建议加入深度限制(如
maxDepth = 5)防止无限递归或长链导致卡顿。
? 集成到你的 canJumpOverOpponent 函数中:
你只需将 getCaptures(tableData, row, col) 的返回结果转为高亮提示或启用对应空格的点击事件即可。例如:
const validMoves = getCaptures(currentBoardState, clickedRow, clickedCol);
if (validMoves.length > 0) {
highlightSquares(validMoves); // 自定义高亮函数
enableMoveTargets(validMoves); // 绑定点击移动逻辑
}
掌握这一递归对角线扫描模式,你就拥有了构建完整跳棋AI决策、合法走法验证及强制连跳规则的核心能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










