
本文详解如何在 8×8 网格的扩展井字棋(需连续 5 子获胜)中,准确、高效地检测所有可能获胜路径——包括横向、纵向、主对角线(左上→右下)和副对角线(右上→左下),避免边界越界与重复计算。
在传统 3×3 井字棋中,获胜判定逻辑简单;但当网格扩大至 8×8 且胜利条件升级为“任意方向连续 5 子同色”时(即类五子棋规则),暴力遍历所有可能起始点+全方向扫描极易出错——尤其常见问题如:仅检测主对角线却忽略副对角线、未校验坐标合法性导致 ArrayIndexOutOfBoundsException、或从固定起点硬编码循环(如 for (int row=0; row
核心设计思想是:以落子位置为锚点,动态判断其是否可能成为某条长度为 5 的获胜序列的起点,并仅对合法方向执行增量检查。这不仅大幅提升效率(O(1) 平均单次判定),更彻底规避边缘遗漏。
以下为关键实现逻辑(基于一维数组优化的二维映射):
static int side = 8;
static int toWin = 5;
static int[] fields = new int[side * side]; // 'x' → -1, 'o' → 1, empty → 0
private static int gameOver(int idx) {
if (fields[idx] == 0) return 0;
int row = idx / side;
int col = idx % side;
// 预判各方向是否可容纳 5 连子(避免越界)
boolean canRight = col + toWin <= side; // 横向:向右延伸
boolean canDown = row + toWin <= side; // 纵向:向下延伸
boolean canRightDown = canRight && canDown; // 主对角线(↘)
boolean canLeftDown = (col + 1) >= toWin && canDown; // 副对角线(↙),即 col ≥ toWin-1
// 四方向检查:使用 lambda 定义步进函数,复用 check() 逻辑
return (canRight && check(idx, toWin, i -> i + 1) ||
canDown && check(idx, toWin, i -> i + side) ||
canRightDown && check(idx, toWin, i -> i + side + 1) ||
canLeftDown && check(idx, toWin, i -> i + side - 1))
? fields[idx] : 0;
}
private static boolean check(int start, int len, IntUnaryOperator next) {
int val = fields[start];
for (int i = 1; i < len; i++) {
start = next.applyAsInt(start);
if (start < 0 || start >= fields.length || fields[start] != val) {
return false;
}
}
return true;
}✅ 优势说明:
- 精准锚定:每次只从最新落子位置出发判断,无需全局扫描,时间复杂度从 O(n²) 降至 O(1) 单次调用;
- 安全边界:canRight/canDown 等布尔标志在进入 check() 前完成数学验证(如 col + toWin
- 方向正交:覆盖全部 4 个获胜方向(横、纵、主对角、副对角),其中副对角线通过 col >= toWin - 1 判断左边界可行性;
- 可扩展强:仅需修改 side 和 toWin 即可适配任意尺寸棋盘与连胜数(如 15×15 五子棋、10×10 六子棋)。
⚠️ 注意事项:
- 若使用 JButton[][] buttons 二维结构,请在 gameOver() 中将 (row, col) 映射为一维索引:idx = row * side + col;
- 避免直接比较 Color.RED 等对象引用(易因 UI 渲染差异失败),推荐为每个按钮维护独立状态枚举(如 Player.RED, Player.GREEN);
- 字符串拼接(如 red.concat("+"))效率低下且不适用于动态长度判定——应改用计数器或布尔标记(如 streak = 0; if (match) streak++; else streak = 0;)。
综上,该方案以“落子驱动、方向预检、增量验证”为原则,兼顾正确性、性能与可维护性,是大型网格化连珠类游戏获胜判定的工业级实践范式。










