Connect4游戏对角线胜利判定如何高效遍历目标索引?
对角线遍历优化方案
你给出的左下到右上方向的所有同对角线坐标,存在统一数学规律:同一对角线上的所有坐标都满足 2 * 行号 + 列号 = 固定值。
验证你给出的示例:
- 第一组(3,1)、(2,3)、(1,5)、(0,7):
2*3+1=7、2*2+3=7、2*1+5=7、2*0+7=7,所有结果均为7 - 第二组(4,1)、(3,3)等坐标计算后统一为9,后续组的固定值分别为11、13、15、17,完全匹配你列出的6组坐标
单方向遍历实现(仅需1个两层循环)
你只需要遍历所有固定值k,再通过公式反算合法坐标即可,无需单独写6个循环:
// 定义棋盘边界参数,根据你的实际情况调整 static final int ROW_MAX = 5; static final int COL_MAX = 13; static final int WIN_LENGTH = 4; // 校验左下到右上方向是否有4连 public boolean checkAntiDiagonal(String[][] board) { // 该方向所有对角线对应的固定k值,也可以动态计算范围 int[] kValues = {7,9,11,13,15,17}; for (int k : kValues) { int consecutive = 0; String lastPiece = "_"; // 从最底行往上遍历,即从左下往右上走 for (int row = ROW_MAX; row >= 0; row--) { int col = k - 2 * row; // 跳过不合法的列号 if (col < 0 || col > COL_MAX) continue; String curr = board[row][col]; if (curr.equals(lastPiece) && !curr.equals("_")) { consecutive++; if (consecutive >= WIN_LENGTH) return true; } else { consecutive = 1; lastPiece = curr; } } } return false; }
另一个方向遍历
右下到左上方向的同对角线坐标满足 2 * 行号 - 列号 = 固定值,套用上面的逻辑修改公式即可,同样仅需1个两层循环完成所有校验。
更高效率的落子后校验方案
如果你不需要全棋盘扫描,仅在每次玩家落子后判定胜利,可以用更高效的方案,不需要遍历所有对角线:
- 拿到当前落子坐标
(r,c) - 沿着两个对角线的四个方向(左下、右上、右下、左上)分别计数连续的同色棋子
- 同一对角线两个方向的计数相加后减1(当前落子被重复计数)如果≥4,直接判定胜利
该方案每次校验最多访问8个格子,性能远高于全对角线扫描。
内容的提问来源于stack exchange,提问作者gone
相关产品推荐
相关产品推荐

