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
,并且不会评估其他任何内容。
boxHeight
和 boxWeight
永远不会初始化,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的主要内容,如果未能解决你的问题,请参考以下文章
stripslashesu recursive和addslashesu recursive