Atölye › Satranç › 25/48. adım
Satrancı satranç yapan kural: kendi şahını asla saldırı altında (şahta) bırakamazsın. Bunun için önce "bu kare saldırı altında mı?" sorusunu cevaplamalıyız.
Rakibin bütün hamlelerini üretmek yerine daha akıllı bir yol var: kareden dışarı bak. Desenler iki yöne de işler: bu kareden bir at sıçraması uzakta rakip at varsa, o at da bu kareye sıçrayabilir demektir. Hamle desenlerini tersten kullanıyoruz.
Bu adımda sabit mesafeden saldıranlar: piyon, at, şah. Kayan taşlar bir sonraki adımda.
```js
// Is the square (r, c) attacked by a piece of color `by`? Look outwards from the square for each kind of attacker.
function attacked(r, c, by) {
const pawnRow = r + (by === 'w' ? 1 : -1) // a white pawn attacks upwards, so it stands one row below
for (const dc of [-1, 1]) {
if (inside(pawnRow, c + dc) && board[pawnRow][c + dc] === by + 'P') return true
}
for (const [list, kind] of [[KNIGHT, 'N'], [KING, 'K']]) {
for (const [dr, dc] of list) {
if (inside(r + dr, c + dc) && board[r + dr][c + dc] === by + kind) return true
}
}
return false
}
```attacked(r, c, by) → (r, c) karesine by renginden bir taş saldırıyor mu? Cevap true ya da false.const pawnRow = r + (by === 'w' ? 1 : -1) → beyaz piyon yukarı doğru yer; yani bu kareye saldıran beyaz piyon
bir sıra aşağıda (r + 1) durur. Siyahınki bir sıra yukarıda.by + 'P' (ör. 'wP') var mı?return true → saldıran bulundu; fonksiyon hemen biter, gerisine bakmaya gerek yok.for (const [list, kind] of [[KNIGHT, 'N'], [KING, 'K']]) → her eleman bir çift: sıçrama listesi ve onu
kullanan taş. Aynı döngü önce atları, sonra şahı arar.board[r + dr][c + dc] === by + kind → o sıçrama kadar ötede rakibin atı (ya da şahı) mı duruyor?return false → hiçbir saldıran bulunamadı.function play(m) { satırının üstüne yorum satırını ve attacked fonksiyonunu yaz; altında bir boş satır
kalsın.Beceriler: Fonksiyonlar, Oyun durumları
← Piyon vezir olur Uzaktan saldırılar →