You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:50:29