Ruby Recursive flood-it

Posted

技术标签:

【中文标题】Ruby Recursive flood-it【英文标题】: 【发布时间】:2017-04-29 02:25:12 【问题描述】:

我正在尝试制作一个泛洪填充,从一个随机生成的数组的右上角开始请求用户输入,该数组填充了由“颜色”表示的数字 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

【问题讨论】:

请阅读“minimal reproducible example”。我们需要演示问题的最少代码和输入数据,以及您的预期输出。你得到什么错误代码?此外,在 Ruby 中,我们使用 snake_case 作为变量名。 camelCaseIsTooHardToRead。 这个oldColor = array_1 毫无意义。为什么要丢弃参数并用图像副本替换它? 我的想法是让 oldColors 包含原来存在的内容,然后让 newColors 负责填充。这行不通吗?我对 ruby​​ 还很陌生,希望指出正确的方向以使其正常工作 【参考方案1】:

这会使您的代码执行短路:

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

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

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

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

【讨论】:

您能进一步解释一下吗?我将如何去纠正它?我还没有开始实现 boxHeight 和 boxWeight,因为我首先想确保递归填充函数至少适用于其中一种颜色【参考方案2】:

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

【讨论】:

那么做这两个中的一个将允许它在注册更改后退出循环?

以上是关于Ruby Recursive flood-it的主要内容,如果未能解决你的问题,请参考以下文章

Ruby Recursive flood-it

RUBY:递归符号键

这个 ruby​​ 代码算作递归函数吗?

stripslashesu recursive和addslashesu recursive

recursive_mutextimed_mutex和recursive_timed_mutex

PHP stripslashes_recursive和addslashes_recursive