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

Gomoku/Caro游戏胜负判断代码测试失败问题排查与修正请求

五子棋(Gomoku/Caro)胜负判断函数问题排查与修正

可能导致Test 10(误判黑胜→实际无胜负)的场景

  • 长连误判:如果题目设定中,连续超过5颗同色棋子(比如6子连)不算获胜,但你的代码用了count >=5的判断条件,就会把这类情况错误判定为胜利。
  • 非连续棋子误判为连续:代码在计数连续同色棋子时,遇到空位或异色棋子后没有及时重置计数器,导致累计错误的连续数(比如之前的计数没清零,和当前棋子的计数叠加到5)。
  • 重复计数同一连线:若代码在不同方向重复识别同一条5子连线后直接返回,可能在某些边界场景下误判(概率较低,但需排查)。

可能导致Test 11(误判无胜负→实际黑胜)的场景

  • 边缘/角落连线未检测:遍历棋盘的范围不足,比如横向检查时j的循环终点设置错误,导致棋盘最右侧或最底部的5子连线未被遍历;或斜向检查时,未考虑起始棋子在边缘、后续4颗棋子刚好在棋盘内的情况。
  • 遗漏某一方向的斜向检查:五子棋需检查4个核心方向:横向、纵向、左上→右下、右上→左下。你的代码可能只覆盖了3个方向,漏掉了其中一个斜向的判断。
  • 连续棋子计数逻辑错误:比如计数时只统计到4颗就终止循环,或判断条件写反(比如用count >5而非count ==5),导致真正的5子连线被漏判。
  • 空位处理不当:代码未跳过棋盘上的空位('none'),导致计数时混入空位,打断了正确的连续同色棋子统计。

修正方案参考实现

以下是覆盖所有标准场景的代码示例,你可以对比自己的代码排查差异:

def get_winner(board):
    n = len(board)
    if n < 5:
        return 'none'
    
    # 定义4个需要检查的连线方向:横向、纵向、左上→右下、右上→左下
    directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
    
    for i in range(n):
        for j in range(n):
            current = board[i][j]
            if current == 'none':  # 跳过空位,只检查有棋子的位置
                continue
            # 遍历每个方向,统计连续同色棋子数量
            for dx, dy in directions:
                count = 1
                x, y = i + dx, j + dy
                # 确保后续棋子在棋盘范围内,且与当前棋子同色
                while 0 <= x < n and 0 <= y < n and board[x][y] == current:
                    count += 1
                    x += dx
                    y += dy
                    if count == 5:  # 刚好连续5颗,判定胜利
                        return current
    # 无任何一方达成5子连线
    return 'none'

关键检查点

  1. 循环边界校验:通过0 <= x < n and 0 <= y < n确保所有检查都在棋盘范围内,不会遗漏边缘的连线。
  2. 计数器重置:每次检查新棋子或新方向时,计数器count都初始化为1(当前棋子本身),避免累计错误。
  3. 方向完整性:必须覆盖4个核心连线方向,不能遗漏。
  4. 长连处理:严格使用count ==5而非count >=5,符合多数题目设定的“仅连续5子获胜”规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:34