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'
关键检查点
- 循环边界校验:通过
0 <= x < n and 0 <= y < n确保所有检查都在棋盘范围内,不会遗漏边缘的连线。 - 计数器重置:每次检查新棋子或新方向时,计数器
count都初始化为1(当前棋子本身),避免累计错误。 - 方向完整性:必须覆盖4个核心连线方向,不能遗漏。
- 长连处理:严格使用
count ==5而非count >=5,符合多数题目设定的“仅连续5子获胜”规则。
内容的提问来源于stack exchange,提问作者Hanh Nguyen
相关产品推荐
相关产品推荐

