Atölye › Candy Crush Tarzı Üçlü Eşleştirme › 10/29. adım
Oyunun kalbi: tahtada aynı renkten üç ya da daha fazla yan yana ya da alt alta dizilmiş mücevherleri bulmak.
findMatches (eşleşmeleri bul) böyle bir sıranın parçası olan her hücreyi bulacak.
Yöntem: her hücreden iki yöne bakarız, sağa ve aşağı. O yönde aynı renk kaç hücre devam ediyor, sayarız; 3 ya da fazlaysa hepsini listeye ekleriz. Bir incelik: bir sırayı yalnız ilk mücevherinden sayarız; sıranın ortasındaki bir hücreden yeniden saymayız.
Ekranda bir şey değişmeyecek; kontroller fonksiyonu deniyor.
```js
// Every cell that is part of three or more of the same color in a row or a column.
function findMatches() {
const cells = new Set()
for (let r = 0; r < N; r++) {
for (let c = 0; c < N; c++) {
const gem = board[r][c]
for (const [dr, dc] of [[0, 1], [1, 0]]) {
// Only start counting at the first gem of a run.
const pr = r - dr
const pc = c - dc
if (pr >= 0 && pc >= 0 && board[pr][pc] === gem) continue
let length = 1
while (r + dr * length < N && c + dc * length < N && board[r + dr * length][c + dc * length] === gem) length++
if (length >= 3) for (let i = 0; i < length; i++) cells.add((r + dr * i) * N + (c + dc * i))
}
}
}
return cells
}
```const cells = new Set() → boş bir küme (Set). Kümeye aynı şeyi iki kez eklesen de bir kez tutar. Bir mücevher
hem yatay hem dikey bir sıranın parçası olabilir (L ya da T şekli); küme onu bir kez sayar.for (const [dr, dc] of [[0, 1], [1, 0]]) → iki yön: [0, 1] sağa (satır aynı, sütun +1), [1, 0] aşağı.
Her turda çiftin ilk sayısı dr (satır farkı), ikincisi dc (sütun farkı).const pr = r - dr, const pc = c - dc → o yönde bir önceki hücre. Tahtanın içinde ve aynı renkse bu hücre
zaten saydığımız bir sıranın ortası: continue ile atla.let length = 1 → bu mücevher 1.while (... && board[r + dr * length][c + dc * length] === gem) length++ → while koşul doğru olduğu sürece tekrar
eder: tahtanın içinde kaldıkça ve renk aynı gittikçe length'i 1 artır. r + dr * length o yönde length adım
ötedeki satır.if (length >= 3) for (...) cells.add(...) → sıra en az 3 ise bütün hücrelerini kümeye ekle.(r + dr * i) * N + (c + dc * i) → hücreyi tek bir sayı olarak sakla: satır × 8 + sütun (satır 2, sütun 3 →
19). Neden nesne değil? Küme iki nesneyi içerikleriyle değil kimlikleriyle karşılaştırır; { r: 2, c: 3 } başka
bir { r: 2, c: 3 }'e asla eşit sayılmaz. Geri çevirmek kolay: satır Math.floor(19 / 8) = 2, sütun 19 % 8 = 3.return cells → eşleşen bütün hücreler. cells.size kaç tane olduğunu verir.findMatches fonksiyonunu function swap(a, b) { satırının üstüne yaz; altında bir boş
satır kalsın.while satırını dikkatle yaz: tek satır.Beceriler: Diziler ve nesneler, Döngüler
← İki komşuyu takas et Eşleşme yoksa takas yok →