Atölye › Satranç › 35/48. adım
Son özel hamle geçerken alma (en passant). Önce ihtiyacı olan bilgiyi hazırlayalım: "az önce bir piyon iki kare mi gitti, gittiyse üstünden atladığı kare hangisi?"
double: true ile işaretlensin.makeMove böyle bir hamlede atlanan kareyi enPassant değişkenine yazsın; başka her hamlede null yapsın.
Böylece bilgi yalnız bir hamle yaşar.enPassant da hamleyle değişen bir bilgi: undo onu saklasın, undoMove geri koysun.```js
let enPassant // the square a pawn could capture onto en passant right now, or null
enPassant = null
if (r === start && !board[r + 2 * dir][c]) add(r, c, r + 2 * dir, c, { double: true })
const undo = { m, piece, captured: board[tr][tc], castling: { ...castling }, enPassant }
if (m.castle === 'Q') [board[fr][3], board[fr][0]] = [board[fr][0], '']
enPassant = m.double ? [(fr + tr) / 2, fc] : null
castling = undo.castling
enPassant = undo.enPassant
```let enPassant → geçerken alınabilecek kare ya da null. reset onu null yapar.{ double: true } → iki kare gitme hamlesine eklenen işaret (yine add'in fazladan alanları).enPassant = m.double ? [(fr + tr) / 2, fc] : null → çift adımsa atlanan kare: başlangıç ve varış sırasının tam
ortası (6 ile 4'ün ortası 5), aynı sütun. Değilse null.undo içindeki enPassant → enPassant: enPassant kısaltması: değişmeden önceki değer.enPassant = undo.enPassant → undoMove onu geri koyar.let castling ... satırının altına let enPassant ... satırını; reset içinde castling = { ... } satırının
altına enPassant = null satırını yaz.pseudoMoves içinde iki kare gitme satırının sonundaki add(r, c, r + 2 * dir, c) çağrısına , { double: true }
ekle.makeMove içinde undo nesnesinin sonuna , enPassant ekle.makeMove içinde if (m.castle === 'Q') ... satırının altına enPassant = ... satırını yaz.undoMove içinde castling = undo.castling satırının altına enPassant = undo.enPassant yaz.Beceriler: Oyun durumları
← Tehditten geçerek rok yok Geçerken alma →