2016-12-13 3 views
0

Je suis en train de faire un remplissage d'inondation qui demande l'entrée d'utilisateur à partir du coin supérieur droit d'un tableau généré aléatoirement rempli de numéros 1-6 qui sont représentés par « couleurs ». J'ai ajouté la fonction oldColor/newColor juste maintenant et j'ai un message d'erreur et je ne sais pas exactement pourquoi. Autre que cela, l'algorithme continue à demander des entrées sans imprimer à quoi ressemble le nouveau remplissage à chaque étape.Ruby récursive inondation il

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) 

Je ne peux pas directement publier des images, mais voici ce que ma sortie ressemble actuellement et le message d'échec http://imgur.com/a/88UrK

+0

Veuillez lire "[mcve]". Nous avons besoin du code minimal et des données d'entrée qui démontrent le problème, ainsi que de votre sortie attendue. Quel code d'erreur obtenez-vous? De plus, dans Ruby, nous utilisons snake_case pour les noms de variables. camelCaseIsTooHardToRead. –

+0

Cette 'oldColor = array_1' n'a aucun sens. Pourquoi rejetez-vous l'argument et le remplacez par une copie de l'image? – Max

+0

Mon processus de pensée était de faire en sorte que oldColors contienne ce qui était à l'origine, alors que newColors ait la responsabilité du remplissage. Cela ne fonctionnera-t-il pas? Je suis assez nouveau à ruby ​​et voudrais être pointé dans la bonne direction pour que cela fonctionne – LeeKay220

Répondre

1

Ce court-circuite votre exécution de code:

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

Une fois hits return il renvoie nil de la méthode et rien d'autre ne sera évalué.

boxHeight et boxWeight ne sont jamais initialisées et newColor sera écrasé par la gets qui ne devrait probablement pas se produire.

Et enfin, le code manque un end arrière. Je recommanderais d'utiliser un outil pour reformater ou réindexer votre code automatiquement, ce qui aidera vraiment à éviter de tels problèmes.

+0

Pouvez-vous expliquer plus loin? Comment ferais-je pour le corriger? Je nai eu l'occasion de la mise en œuvre boxHeight et boxWeight parce que je voulais d'abord vous assurer que la fonction de remplissage récursive fonctionne pour au moins l'une des couleurs – LeeKay220

0

Ruby si les déclarations ne fonctionnent pas comme en C ou Java où vous pouvez écrire quelque chose comme

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

Vous avez besoin soit un end ou vous avez besoin de mettre le si après le retour.

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

Ce faisant un de ces deux sera ensuite permettre de sortir de la boucle une fois qu'il enregistre le changement? – LeeKay220