Atölye › Kule Savunması › 7/42. adım
Köşeli bir yolda bir şeyi nasıl yürütürsün? "Köşeye kadar sağa git, sonra aşağı dön" diye yönlendirmek çabucak
karışır. Çok daha basit bir fikir var: her düşmana tek bir sayı ver: d, yol boyunca yürüdüğü mesafe (kare
olarak). Yürümek sadece d'yi büyütmek olur.
pointAt(d) bu mesafeyi haritada bir noktaya çevirir: yolun düz parçalarını sırayla dener; d o parçaya
sığıyorsa oradaki noktayı verir, sığmıyorsa parçanın boyunu düşüp sonrakine geçer. Yolun sonunu geçtiyse null.
Bu fikre yolu parametrelemek denir ve çok işe yarar: "geçmeye en yakın düşman hangisi?" en büyük d'dir; "geçip
gitti mi?" ise pointAt(d) === null.
```js
// Where on the road an enemy is after walking `d` tiles (null once it is past the end).
function pointAt(d) {
for (let i = 1; i < PATH.length; i++) {
const [ax, ay] = PATH[i - 1]
const [bx, by] = PATH[i]
const length = Math.abs(bx - ax) + Math.abs(by - ay)
if (d <= length) return { x: ax + Math.sign(bx - ax) * d, y: ay + Math.sign(by - ay) * d }
d -= length
}
return null
}
```for (let i = 1; i < PATH.length; i++) → yolun her düz parçası: a köşesinden (PATH[i - 1]) b köşesine.const length = Math.abs(bx - ax) + Math.abs(by - ay) → parçanın boyu. Farklardan biri hep 0; Math.abs eksiyi
atar.if (d <= length) return { ... } → d bu parçaya sığıyorsa: a'dan b'ye doğru d kare ötesi.
ax + Math.sign(bx - ax) * d → yatayda (parça dikeyse Math.sign 0 verir, x sabit kalır).d -= length → sığmıyorsa bu parçayı "yürümüş say" ve kalan mesafeyle sonrakini dene.return null → bütün parçalar bitti: düşman yolun sonunu geçti.reset fonksiyonunun kapanan }'sinin altında bir boş satır bırakıp yorumu ve pointAt'i yaz.Beceriler: Fonksiyonlar
← Yolu çiz Yoldaki düşmanlar →