Atölye › Satranç › 36/48. adım
Kural şu: bir rakip piyon iki kare gidip senin piyonunun yanına gelirse, senin piyonun onu sanki tek kare gitmiş gibi yiyebilir: çapraz olarak atlanan kareye gider. Ama yalnız hemen, bir sonraki hamlede.
Özel olan şey şu: yenen piyon, yiyen piyonun gittiği karede değil, onun yanında (başladığı sırada, varış
sütununda) duruyor. O yüzden makeMove onu ayrıca silmeli ve geri alınabilsin diye undo'ya yazmalı.
```js
if (enPassant && enPassant[0] === tr && enPassant[1] === tc) add(r, c, tr, tc, { ep: true })
const undo = { m, piece, captured: board[tr][tc], castling: { ...castling }, enPassant, taken: '' }
board[tr][tc] = m.promo ? piece[0] + m.promo : piece
board[fr][fc] = ''
if (m.ep) {
// The pawn taken en passant stands beside the moving pawn, not on the square it moves to.
undo.taken = board[fr][tc]
board[fr][tc] = ''
}
if (undo.m.ep) board[fr][tc] = undo.taken
```enPassant && enPassant[0] === tr && enPassant[1] === tc → geçerken alma karesi var ve bu çapraz kare o kare:
kare boş olsa da bir yeme hamlesi. Hamleye { ep: true } eklenir.taken: '' → undo'da yeni bir alan: geçerken yenen piyon (yoksa '').if (m.ep) { → geçerken almaysa:undo.taken = board[fr][tc] → yenen piyonu önce kaydet: yiyenin başladığı sırada (fr), vardığı
sütunda (tc).board[fr][tc] = '' → sonra onu tahtadan kaldır.if (undo.m.ep) board[fr][tc] = undo.taken → undoMove onu yerine koyar.pseudoMoves içinde piyonun çapraz döngüsünde, add(r, c, tr, tc, promote(tr)) ile biten yeme satırının
altına enPassant satırını yaz.makeMove içinde undo nesnesinin sonuna , taken: '' ekle.makeMove içinde board[fr][fc] = '' satırının altına if (m.ep) { ... } bloğunu yaz.undoMove içinde board[tr][tc] = undo.captured satırının altına geri koyma satırını yaz.Beceriler: Oyun durumları
← Çift adımı hatırla Mat ve pat →