Reversi(Othello)游戏legalMove函数合法落子判断异常排查
问题分析与修复:Reversi合法落子判断函数bug
核心问题
你的legalMove函数存在致命逻辑错误:当某一个方向的检查不满足条件时,直接返回false,没有继续检查剩余7个方向。
比如目标格子的某个方向是对手棋子,但延伸后碰到边界,此时函数会立刻返回false,完全忽略了其他可能存在的合法方向。而Reversi规则明确:只要有任意一个方向满足「己方棋子-对方棋子-新落子」的夹击条件,该位置就是合法落子点。
修复方案
修改检查逻辑:单个方向不合法时,仅跳出当前方向的循环,继续检查下一个方向;只有所有8个方向都检查完毕且无合法情况时,才返回false。
修改后的legalMove函数代码:
bool legalMove(int row, int col) { // 检查目标格子是否已被占据 if (board[row,col] != 0) return false; // 遍历所有8个方向 for (int i = -1; i<=1; i++) for (int j = -1; j<=1; j++) { if (i == 0 && j == 0) continue; int currentRow = row + i; int currentCol = col + j; // 第一步:检查相邻格子是否为对手棋子 if (currentRow >= 0 && currentRow < board.GetLength(0) && currentCol >= 0 && currentCol < board.GetLength(1) && board[currentRow,currentCol] == -turn) { // 沿当前方向继续延伸检查 while(true) { currentRow += i; currentCol += j; // 若超出边界或碰到空格,当前方向无效,跳出循环检查下一个方向 if (currentRow < 0 || currentRow >= board.GetLength(0) || currentCol < 0 || currentCol >= board.GetLength(1) || board[currentRow, currentCol] == 0) break; // 找到己方棋子,说明此方向满足夹击条件,返回合法 else if (board[currentRow,currentCol] == turn) return true; } } } // 所有方向均不满足条件,返回非法 return false; }
关键修改点
- 原代码中,单个方向检查失败时直接
return false,现在改为break,仅终止当前方向的检查流程,继续遍历其他方向。 - 只有找到任意一个合法方向时才返回
true,确保不会漏掉符合规则的落子点。
额外建议
你可以将相同的逻辑修正应用到flipCircles函数中,避免出现类似的方向检查遗漏问题,确保所有被夹击的对方棋子都能被正确翻转。
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

