Atölye › Puzzle Bobble Tarzı Balon Atıcı › 20/31. adım
Bir grup patlayınca, altındaki bazı balonlar tavana bağlı kalmayabilir. Onlar da düşsün ve her biri 20 puan getirsin: oyunun en tatlı anı budur.
Tavana bağlı olanları bulmak için aynı flood fill fonksiyonunu kullanıyoruz: bu sefer en üst satırdaki bütün balonlardan başlayıp herhangi bir balona yayılıyoruz. Ulaşılamayan her balon boşlukta asılı demektir.
```js
// Whatever no longer hangs from the ceiling drops, worth double.
const top = []
for (let c2 = 0; c2 < cols(0); c2++) if (grid[0][c2] >= 0) top.push([0, c2])
const held = new Set(connected(top, (nr, nc) => grid[nr][nc] >= 0).map(([hr, hc]) => hr * COLS + hc))
const loose = []
for (let r2 = 0; r2 < ROWS; r2++) for (let c2 = 0; c2 < cols(r2); c2++) {
if (grid[r2][c2] >= 0 && !held.has(r2 * COLS + c2)) loose.push([r2, c2])
}
remove(loose, 20)
```const top = [] ve sonraki satır → en üst satırdaki (tavana değen) balonları topla.connected(top, (nr, nc) => grid[nr][nc] >= 0) → bu balonlardan başla, herhangi bir renkteki balona yayıl
(>= 0 boş değil demek). Ulaşılan her balon tavana bağlı..map(([hr, hc]) => hr * COLS + hc) ve new Set(...) → hızlı arama için tek sayılık bir küme.loose → dolu ama held içinde olmayan balonlar: boşlukta asılı.remove(loose, 20) → hepsini düşür, her biri 20 puan (patlayanın iki katı).c2, r2 adları → fonksiyonun kendi r, c parametreleriyle (yeni balonun yeri) karışmasın diye.attach içinde, if (group.length >= 3) bloğunda remove(group, 10) satırının altına yeni satırları yaz. Çalıştır: bir grubu alttan patlat, altındakiler düşsün.
Beceriler: Döngüler, Diziler ve nesneler
← Düşen balonlar Skoru göster →