Ruby Recursive flood-it

时间:2016-12-13 21:41:27

标签: ruby recursion flood-fill

我试图进行填充,要求用户输入从随机生成的数组的右上角开始,该数组填充了数字1-6,用“颜色”表示。我刚刚添加了oldColor / newColor功能,我收到错误消息,我不确定原因。除此之外,算法继续要求输入而不打印每个步骤中新的填充填充的样子。

    def floodfill(array_1, row, column, colours, oldColor, newColor)
          #colours is an array of the 6 colours i'm going to be using
          boxHeight = array_1.length
          boxWeight = array_1[0].length
          oldColor = array_1
          #puts oldColor
          print "> "
          newColor = gets.chomp.downcase

          if array_1[row][column] != oldColor
            return
            if newColor == "r"
              newColor = colours[:red]
              array_1[row][column] = newColor
              floodfill(array_1, row + 1, column, colours, newColor) # right
              floodfill(array_1, row - 1, column, colours, newColor) # left
              floodfill(array_1, row, column + 1, colours, newColor) # down
              floodfill(array_1, row, column - 1, colours, newColor)# up
              print_it
            else
              puts "didnt get that"
              array_1.each do |row|
                row.each do |c|
                  print c
                end
              puts
            end
          end
        end
      end
floodfill(array_1,14,9,colours,0,0)

我无法直接发布图片,但这是我的输出当前的样子然后是失败消息 http://imgur.com/a/88UrK

2 个答案:

答案 0 :(得分:1)

这会使代码执行短路:

if array_1[row][column] != oldColor
  return

一旦点击return,它就会从方法中返回nil,并且不会评估任何其他内容。

boxHeightboxWeight永远不会被初始化,newColor会被gets覆盖,这可能不会发生。

最后,代码缺少尾随end。我建议使用工具自动重新格式化或重新编写代码,这将有助于避免此类问题。

答案 1 :(得分:0)

Ruby if语句在C或Java中不起作用,您可以在其中编写类似

的内容
if array_1[row][column] != oldColor
  return

您需要end,或者需要在之后放置if

if array_1[row][column] != oldColor
  return
end
# or
return if array_1[row][column] != oldColor