Atölye › Satranç › 33/48. adım
Rok hakkı bir kez giderse bir daha gelmez:
Bayrakları makeMove kapatacak. Ama dikkat: makeMove'u deneme için de çağırıyoruz. Bayraklar da değişen bir bilgi;
geri alınabilmesi için undo onların bir kopyasını saklamalı.
```js
const undo = { m, piece, captured: board[tr][tc], castling: { ...castling } }
// Moving the king or a rook, or capturing a rook on its first square, ends castling on that side for good.
if (piece[1] === 'K') castling[piece[0] + 'K'] = castling[piece[0] + 'Q'] = false
for (const [row, col, side] of [[7, 7, 'wK'], [7, 0, 'wQ'], [0, 7, 'bK'], [0, 0, 'bQ']]) {
if ((fr === row && fc === col) || (tr === row && tc === col)) castling[side] = false
}
castling = undo.castling
```castling: { ...castling } → { ... } içinde yayma, nesnenin alanlarıyla yeni bir nesne yapar: bir kopya.
Kopya şart: castling'in kendisini saklasaydık, birazdan değişecek aynı nesneyi saklamış olurduk ve geri alma
işe yaramazdı.castling[piece[0] + 'K'] = castling[piece[0] + 'Q'] = false → oynayan şahsa, rengin iki bayrağını birden
kapatır (a = b = false sağdan sola: önce b, sonra a).[[7, 7, 'wK'], ...] → dört köşe ve koruduğu bayrak.(fr === row && fc === col) || (tr === row && tc === col) → hamle bu köşeden çıkıyor (kale oynadı) veya
bu köşeye giriyor (kale yendi). İkisinde de bayrak kapanır.castling = undo.castling → undoMove saklanan kopyayı geri koyar.makeMove içinde undo nesnesinin sonuna, }'den önce , castling: { ...castling } ekle.makeMove içinde iki m.castle satırının altına yorumu, şah satırını ve köşe döngüsünü yaz.undoMove içinde iki undo.m.castle satırının altına castling = undo.castling yaz.Beceriler: Oyun durumları
← Kale üstünden atlar Tehditten geçerek rok yok →