2016-04-04 2 views
0

Donc, je suis en train de coder un clone de Bejeweled et j'ai une erreur dans ma fonction de remplissage. J'ai une matrice de 15 x 15 de bijoux de couleur différente et j'essaie de compter le nombre de tuiles avec remplissage.Algorithme de remplissage en JavaScript - trop de récursivité

La fonction est ici:

function count(x, y, color) { 

    if(matrix[x] && matrix[x][y]) { 
    if(matrix[x][y].color != color) 
     return; 
    cnt++; 
    count(x, y+1, color); 
    count(x, y-1, color); 
    count(x-1, y, color); 
    count(x+1, y, color); 
    console.log(cnt); 
    } 
} 

Qu'est-ce qui ne va pas?

+0

Intéressant. En un clin d'œil, je dirais que vous comptez encore et encore les mêmes cellules ... d'abord celle qui se trouve à sa droite, puis * celle * qui se trouve à sa gauche, puis «ALLER À DÉBUTER» et ainsi de suite. – usr2564301

+0

Vous ne recoloriez pas les cellules que vous avez visitées, vous obtenez une récurrence infinie. –

+0

Les limites @Chara sont vérifiées par les deux premières expressions logiques dans la condition if – axelduch

Répondre

3

Votre problème semble être que votre fonction ne fait pas la distinction entre les carrés qui ont été comptés et ceux qui ne l'ont pas été. Les cases adjacentes continueront à se compter les unes les autres.

Une solution consiste à travailler sur une copie de votre grille et à modifier la couleur des carrés visités afin qu'ils ne soient plus comptés. Vous pouvez également ajouter une propriété counted à chaque cellule et la définir lorsque vous comptez la cellule, puis renvoyer si vous essayez de compter une cellule déjà comptée. Ensuite, assurez-vous de réinitialiser les propriétés counted une fois que vous avez terminé.

Quelque chose comme:

function count(x, y, color) { 

    if(matrix[x] && matrix[x][y]) { 
    if(matrix[x][y].color != color || matrix[x][y].counted) 
     return; 
    cnt++; 
    matrix[x][y].counted = true; 
    count(x, y+1, color); 
    count(x, y-1, color); 
    count(x-1, y, color); 
    count(x+1, y, color); 
    console.log(cnt); 
    } 
} 
+1

J'ai ajouté une propriété 'matrix [x] [y] .counted' et l'ai définie sur true lorsque la tuile a été comptée, cela fonctionne. Ensuite, je le réinitialise après que la valeur 'cnt' a été traitée. – mkkekkonen

+0

Ouais, ça marche aussi. Je vais ajouter cela à ma réponse au cas où quelqu'un d'autre avec ce problème vient – StephenTG