游戏合法落子检测函数优化:用循环简化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
相关产品推荐
相关产品推荐

