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

游戏合法落子检测函数优化:用循环简化8方向判断逻辑

优化落子合法性判断函数:循环遍历8个方向

作为编程新手,你已经实现了可用的落子合法性判断函数,但重复调用8次legal_dir显得冗余。可以通过定义方向数组+循环遍历的方式简化代码,同时保留原逻辑的短路特性(只要找到一个合法方向就停止判断)。

原代码的小问题

原函数里else分支的!out_of_bounds(x,y)判断完全多余——第一个if已经把越界的情况过滤了,进入else时必然是在棋盘内的,可以直接删掉这个判断。

优化后的代码

// 判断(x,y)是否是合法的落子位置:需满足在棋盘内、位置为空('_'),且至少有一个合法方向
bool legal(Game* g, int x, int y) {
    // 先判断是否越界,越界直接返回非法
    if (out_of_bounds(x, y)) {
        return false;
    }
    // 位置非空,直接非法
    if (g->board[x][y] != '_') {
        return false;
    }

    // 定义8个方向的偏移量:dx, dy
    int dirs[8][2] = {{0, -1}, {-1, -1}, {-1, 0}, {1, -1},
                      {-1, 1}, {1, 0}, {0, 1}, {1, 1}};
    
    // 遍历所有方向
    for (int i = 0; i < 8; i++) {
        int dx = dirs[i][0];
        int dy = dirs[i][1];
        // 只要有一个方向合法,就返回true(短路特性,不用遍历剩余方向)
        if (legal_dir(g, x, y, dx, dy)) {
            return true;
        }
    }

    // 所有方向都不合法,返回false
    return false;
}

改动说明

  • 拆分判断逻辑:先检查越界,再检查位置是否为空,代码更清晰
  • 用dirs数组存储8个方向的偏移量,避免重复写8次legal_dir调用
  • 循环遍历方向,利用if的短路特性,找到合法方向立即返回,和原逻辑的||效果一致
  • 代码结构更简洁,后续如果要调整方向(比如某些游戏只有4个方向),只需修改dirs数组即可,维护性更好

需求注释翻译:
// 判断(x,y)是否是合法的落子位置。一个位置合法的条件是:
// 位置为空('_')、在棋盘内,且至少有一个合法的方向。

内容的提问来源于stack exchange,提问作者neyz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:25:17