Atölye › Puzzle Bobble Tarzı Balon Atıcı › 17/31. adım
Değen aynı renkli balonların hepsini bulmak için boya kovası gibi çalışan bir fonksiyon yazıyoruz: bir hücreden başla, komşularına yayıl, onların komşularına yayıl... Bir kuyruk (sırada bekleyen hücreler) ve bir küme (zaten gördüklerimiz) tutacağız. Bu yönteme flood fill (taşan boya) denir; resim programlarındaki boya kovası tam olarak budur.
Hangi hücrelere yayılacağını bir test fonksiyonu söyleyecek; böylece aynı fonksiyonu ileride başka işler için de kullanabileceğiz.
```js
// Flood fill: every cell connected to (r, c) through neighbours that pass the test.
function connected(starts, test) {
const seen = new Set(starts.map(([r, c]) => r * COLS + c))
const queue = [...starts]
while (queue.length) {
const [r, c] = queue.shift()
for (const [nr, nc] of neighbors(r, c)) {
if (seen.has(nr * COLS + nc) || !test(nr, nc)) continue
seen.add(nr * COLS + nc)
queue.push([nr, nc])
}
}
return [...seen].map((k) => [Math.floor(k / COLS), k % COLS])
}
```starts → başlangıç hücreleri listesi; test → "bu hücreye yayılabilir miyim?" diye soran bir fonksiyon.r * COLS + c → bir hücreyi tek sayıya çevirir: (2, 3) → 23. Kümede aramak kolaylaşır.const seen = new Set(...) → gördüğümüz hücreler; başlangıçlar zaten görülmüş sayılır.const queue = [...starts] → sırada bekleyenler (başlangıçların kopyası).while (queue.length) → kuyrukta hücre olduğu sürece dön.queue.shift() → kuyruğun başındakini al (ve kuyruktan çıkar).if (seen.has(...) || !test(nr, nc)) continue → daha önce gördüysek ya da test geçmiyorsa atla.seen.add(...), queue.push(...) → yeni hücreyi kaydet ve kuyruğun sonuna ekle; sırası gelince onun komşularına
da bakılacak.[r, c] çiftlerine çevirir: Math.floor(k / COLS) satır, k % COLS sütun.snap fonksiyonunun altına bir boş satır bırakıp yorumu ve connected fonksiyonunu yaz. Çalıştır.
Beceriler: Döngüler, Diziler ve nesneler
← Altı komşu Üç tane olunca patla →