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
相关产品推荐
相关产品推荐

