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

each方法未遍历嵌套数组:井字棋获胜判断函数异常排查

问题分析与解决方案

哈哈,这个小bug太常见啦!你遇到的核心问题是return false的位置错误,导致循环只执行了第一次迭代就直接退出了。

问题根源

看你原代码里的逻辑:

WIN_COMBINATIONS.each do |combo|
  if 匹配获胜条件
    return combo
  else
    return false  # 这里是坑!
  end
end

当第一个组合[0,1,2]不满足获胜条件时,else分支会立刻执行return false,直接终止整个函数,后面的7个获胜组合根本没机会被遍历检查。这就是为什么你用pry调试时只看到第一个索引被处理。

修正后的代码

我们只需要把return false移到循环外面,确保只有遍历完所有组合都没找到获胜情况时,才返回false:

WIN_COMBINATIONS = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ]
def won?(board)
  WIN_COMBINATIONS.each do |combo|
    # 检查当前组合的三个位置是否非空且全部相同
    if board[combo[0]] != " " && board[combo[0]] == board[combo[1]] && board[combo[0]] == board[combo[2]]
      return combo  # 找到获胜组合,直接返回
    end
    # 不满足条件就跳过,继续检查下一个组合
  end
  # 所有组合都检查完没找到,才返回false
  false
end

可选优化(更简洁的写法)

可以用all?方法简化判断逻辑,让代码更易读:

def won?(board)
  WIN_COMBINATIONS.each do |combo|
    mark = board[combo[0]]
    # 确认标记非空,且组合内所有位置都是这个标记
    if mark != " " && combo.all? { |index| board[index] == mark }
      return combo
    end
  end
  false
end

这样修改后,函数会完整遍历所有WIN_COMBINATIONS中的组合,找到第一个匹配的获胜组合就返回,否则遍历结束后返回false,完全符合你的需求~

内容的提问来源于stack exchange,提问作者Int'l Man Of Coding Mystery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:49:35