2016-12-13 4 views
0

Я пытаюсь сделать заливку заливки, которая запрашивает ввод пользователя, начиная с верхнего правого угла произвольно сгенерированного массива, заполненного цифрами 1-6, которые представлены «цветами». Я добавил функцию oldColor/newColor только сейчас, и я получаю сообщение об ошибке, и я не совсем уверен, почему. Кроме того, алгоритм продолжает запрашивать ввод без печати того, что выглядит наводнение на каждом шаге.Ruby Рекурсивный флуд-это

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

+0

Пожалуйста, прочтите «[mcve]». Нам нужен минимальный код и входные данные, которые демонстрируют проблему, а также ваш ожидаемый результат. Какой код ошибки вы получаете? Кроме того, в Ruby мы используем snake_case для имен переменных. camelCaseIsTooHardToRead. –

+0

Этот 'oldColor = array_1' не имеет смысла. Почему вы отбрасываете аргумент и заменяете его копией изображения? – Max

+0

Мой процесс мышления состоял в том, чтобы oldColors содержали то, что изначально было там, чтобы иметь newColors для заполнения. Это не сработает? Я довольно новичок в рубине и хотел бы указать в правильном направлении, чтобы получить эту работу. – LeeKay220

ответ

1

Это короткое замыкание вашего выполнения кода:

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

После него хиты return возвращает nil из метода и ничего не будет оцениваться.

boxHeight и boxWeight никогда не инициализируется и newColor получает перезаписаны gets, которые, вероятно, не должно произойти.

И, наконец, в коде отсутствует завершающий end. Я бы рекомендовал использовать инструмент для автоматического форматирования или повторного использования кода, что действительно поможет избежать подобных проблем.

+0

Можете ли вы объяснить дальше? Как мне исправить это? Я не смог реализовать boxHeight и boxWeight, потому что сначала хотел убедиться, что функция рекурсивного заполнения работает, по крайней мере, для одного из цветов – LeeKay220

0

рубин, если заявления не работают, как в C или Java, где вы можете написать что-то вроде

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

Вы или нуждаетесь в end или вам нужно поставить, если после возвращения.

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

Итак, сделав одно из этих двух, вы сможете выйти из цикла после регистрации изменений? – LeeKay220