2016-04-04 28 views
0

Yani, bir Bejeweled klonunu kodluyorum ve sel dolum işlevimde bir hata yaşıyorum. 15 x 15 farklı renkte mücevher matrisi var ve taşma dolgulu fayans sayısını saymaya çalışıyorum.JavaScript'te Floating fill algoritması - çok fazla yineleme

fonksiyon buradadır:

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); 
    } 
} 

Sorun ne?

+0

İlginç. Bir tahminde aynı hücreleri tekrar tekrar tekrar saydığınızı söyleyebilirim ... önce sağdaki, sonra * solunda bir tane, sonra "GİTMEK İÇİN GİT" ve benzeri. – usr2564301

+0

Ziyaret ettiğiniz hücreleri yeniden incelemezseniz, sonsuz bir tekrarlamaya girersiniz. –

+0

@Chara sınırları, – axelduch

cevap

3

Sorununuzun, işlevinizin sayılmayan kareler ve bulunmayan kareler arasında ayrım yapmadığı anlaşılıyor gibi görünüyor. Böylece bitişik kareler birbirlerine saymaya devam edecek.

Bir çözüm, kılavuzunuzun kopyasının bir kopyasını çıkarmak ve ziyaret edilen karelerin rengini değiştirmek için tekrar sayılmayacakları bir çözümdür. Alternatif olarak, her bir hücreye bir counted özelliği ekleyebilir ve hücreyi sayarken onu sayar ve önceden sayılmış bir hücreyi saymaya çalışıyorsanız bu değeri ayarlayabilirsiniz. Daha sonra, işiniz bittiğinde counted özelliklerini sıfırladığınızdan emin olun. gibi

şey:

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

koşulunda iki mantıksal ifadeyle kontrol edilir, bir "matris [x] [y] .counted" özelliği ekledim ve karo sayıldığı zaman bu değeri true olarak ayarladım. Sonra 'cnt' değeri işlendikten sonra sıfırladım. – mkkekkonen

+0

Evet, bu da işe yarıyor. Bu sorunla başka herhangi birinin gelmesi durumunda cevabıma ekleyeceğim – StephenTG

İlgili konular