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

如何将仅有索引位置差异的两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:54:05