Atölye › Kule Savunması › 5/42. adım
Şimdi köşelerin arasını dolduruyoruz. findRoad (yolu bul) her köşeden bir sonrakine kare kare yürür ve geçtiği
her kareyi bir listeye koyar.
İki köşe arasında bir sayı sabit kalır, öbürü hedefe doğru birer birer ilerler. Hangi yöne? Math.sign(tx - x) tam
atılacak adımı verir: 1, -1 ya da 0. Böylece aynı döngü dört yön için de çalışır.
Yol karelerini bir Set (küme) içinde '3,4' gibi anahtarlarla tutuyoruz; ileride "bu kare yol mu?" sorusu tek
bir has olacak.
```js
let road // keys of the tiles the road covers
const key = (col, row) => col + ',' + row
// Every tile between two corners, corner included.
function findRoad() {
road = new Set()
for (let i = 1; i < PATH.length; i++) {
let [x, y] = PATH[i - 1]
const [tx, ty] = PATH[i]
while (true) {
road.add(key(x, y))
if (x === tx && y === ty) break
x += Math.sign(tx - x)
y += Math.sign(ty - y)
}
}
}
function reset() {
findRoad()
}
reset()
requestAnimationFrame(loop)
```let road → yol karelerinin anahtarları.const key = (col, row) => col + ',' + row → kareyi yazıya çevirir: key(3, 4) → '3,4'. Kümede bir dizi ([3, 4])
tekrar bulunamazdı (her dizi ayrı bir nesne); yazı bulunur.road = new Set() → boş bir küme. Kümede her değer en fazla bir kez bulunur; add ekler, has "var mı?" diye
sorar. Köşeler iki parçada da geçse bir kez sayılır.for (let i = 1; i < PATH.length; i++) → her köşe çifti: PATH[i - 1]'den PATH[i]'ye.let [x, y] = PATH[i - 1] → yürüyüşe ilk köşeden başla (let, çünkü değişecek). const [tx, ty] = PATH[i] → hedef.while (true) { → break gelene kadar tekrar eden döngü:road.add(key(x, y)) → bulunduğun kareyi ekle.if (x === tx && y === ty) break → hedefe vardıysan dur.x += Math.sign(tx - x) → Math.sign sayının işaretini verir: artıysa 1, eksiyse −1, sıfırsa 0. Hedef
sağdaysa bir sağa, soldaysa bir sola, aynı sütundaysa hiç. y için de aynısı.function reset() { findRoad() } → oyunu kuran fonksiyon; en alttaki reset() onu bir kez çağırır.PATH'in kapanan ] satırının altında bir boş satır bırak; let road, key, yorum, findRoad ve reset'i yaz.requestAnimationFrame(loop) satırının üstüne reset() yaz.Beceriler: Diziler ve nesneler, Döngüler