如何将仅有索引位置差异的两个for循环合并优化?
优化方案
你这两段代码分别实现的是水平方向连五检查和垂直方向连五检查,唯一差异是棋盘坐标的索引顺序,完全可以抽象成公共函数实现复用。
实现思路
- 把固定的连5阈值、循环逻辑提取成公共函数,通过参数控制是检查行还是检查列
- 也可以进一步扩展支持斜向检查,后续加需求不用重复写逻辑
基础优化实现(仅适配你当前的两段逻辑)
首先提取公共检查函数:
def check_five_in_line(gameboard: list, dimension: int, check_vertical: bool = False) -> any: """ 检查棋盘上是否存在5个连续的同色棋子 :param gameboard: 二维棋盘数组 :param dimension: 棋盘边长 :param check_vertical: 为True时检查垂直方向,为False时检查水平方向 :return: 获胜方棋子标识,无获胜方返回None """ for i in range(dimension): for j in range(dimension - 4): k = 1 # 根据检查方向切换坐标索引逻辑 while k < 5: if check_vertical: current = gameboard[j + k][i] target = gameboard[j][i] else: current = gameboard[i][j + k] target = gameboard[i][j] if current != target: break k += 1 if k == 5: return target return None
原来的两段逻辑可以直接替换成两次函数调用:
# 先查水平方向 winner = check_five_in_line(gameboard, dimension) # 水平没查到再查垂直方向 if not winner: winner = check_five_in_line(gameboard, dimension, check_vertical=True)
进阶优化(可扩展支持全方向检查)
如果后续需要加斜向(左上到右下、右上到左下)的检查,还可以把方向抽象成步长参数,不用再写重复的循环逻辑:
def check_five_in_line(gameboard: list, dimension: int, dx: int, dy: int) -> any: """ 按指定步长方向检查连五 :param dx: x坐标的步长,水平检查dx=0,垂直检查dx=1,斜向dx=±1 :param dy: y坐标的步长,水平检查dy=1,垂直检查dy=0,斜向dy=±1 """ for i in range(dimension): # 计算j的有效范围,避免索引越界 if dy > 0: max_j = dimension - 4 elif dy < 0: max_j = dimension min_j = 4 else: max_j = dimension for j in range(max_j): if dy < 0 and j < min_j: continue k = 1 target = gameboard[i][j] if not target: # 空位置直接跳过,减少无效判断 continue while k < 5: x = i + k * dx y = j + k * dy if x >= dimension or y >= dimension or gameboard[x][y] != target: break k += 1 if k == 5: return target return None # 调用示例 winner = check_five_in_line(gameboard, dimension, dx=0, dy=1) # 水平 if not winner: winner = check_five_in_line(gameboard, dimension, dx=1, dy=0) # 垂直 if not winner: winner = check_five_in_line(gameboard, dimension, dx=1, dy=1) # 左上到右下斜向 if not winner: winner = check_five_in_line(gameboard, dimension, dx=1, dy=-1) # 右上到左下斜向
内容的提问来源于stack exchange,提问作者VictorD
相关产品推荐
相关产品推荐

