Atölye › Mayın Tarlası › 15/26. adım
Gerçek oyunda bir 0'a tıklayınca koca bir alan birden açılır. Çünkü 0 "çevremde hiç mayın yok" demek: bütün
komşularını açmak güvenli. O komşulardan biri de 0 ise onun komşuları da güvenli... Böyle yayılır gider. Buna
taşma dolgusu (flood fill) denir; resim programlarındaki boya kovası aynı şeyi yapar.
Açılacak hücreleri bir yapılacaklar listesinde biriktireceğiz: bir yığın (stack). Masadaki kâğıt yığını gibi:
en üste koyarsın (push), en üsttekini alırsın (pop). Liste boşalana kadar: bir hücre al, aç, 0 ise komşularını
listeye ekle.
```js
// Flood fill with our own stack: open the cell, and keep opening around every empty (0) cell.
const stack = [start]
while (stack.length > 0) {
const cell = stack.pop()
if (cell.revealed) continue
cell.revealed = true
if (cell.count === 0) {
for (const next of neighbors(cell)) {
if (!next.revealed && !next.mine) stack.push(next)
}
}
}
```const stack = [start] → liste tıklanan hücreyle başlar.while (stack.length > 0) { ... } → while döngüsü: koşul doğru olduğu sürece tekrar eder. "Listede hâlâ hücre
var" demek.stack.pop() → listenin son elemanını çıkarır ve verir.if (cell.revealed) continue → zaten açıksa (listeye iki kez girmiş olabilir) atla, sonrakine geç.cell.revealed = true → hücreyi aç.if (cell.count === 0) → sadece 0 hücreler yayılır. Sayılı hücre açılır ama yayılmayı durdurur; açılan alanın
kenarında sayıların dizilmesinin sebebi bu.for komşuları gezer; kapalı (!next.revealed) ve mayınsız (!next.mine) olanları listeye ekler.reveal kendini çağırmıyor? Küçük tahtada çalışırdı; ama her çağrı bir öncekinin bitmesini bekler ve çok büyük
boş bir tahtada binlerce iç içe çağrı tarayıcının sınırını aşabilir. Kendi listemizi tutmak bu sorunu yaşamaz.reveal içindeki start.revealed = true satırını sil, yerine yorum satırını ve taşma dolgusunu yaz. Çalıştır
ve bir hücreye tıkla: ilk tıklamada koca bir alan açılmalı, kenarında sayılar dizilmeli.
Beceriler: Döngüler, Diziler ve nesneler
← Mayınları göster Sağ tuşla bayrak →