象棋程式棋子走動函式分析

這段代碼描述了一個典型的中國象棋互動程序。當玩家在棋盤上點擊並完成一次「棋子走動」時,程序會經歷驗證、動畫、數據更新和 UI 紀錄四個階段。

以下是按執行順序調用的主要函式及其作用:

1. 觸發階段 (事件監聽)

  • svgElement.addEventListener('click', ...):
    一切動作的起點。它負責計算點擊的座標,並判斷當前是「選取棋子」還是「移動棋子」。

2. 驗證階段 (判斷走法是否合法)

當你選中一顆棋子並點擊目標格子時,會調用:

  • isValidMove(pieceId, startX, startY, endX, endY):
    主控驗證函式,內部會進一步調用:
  • checkMoveGeometry(...): 檢查棋子的基本幾何走法(例如:馬走日、田字象、炮需隔子吃子等)。
  • checkKingsFacing(...): 檢查移動後是否會造成「王見王」。
  • isSquareAttacked(...): 檢查移動後自己的將軍(帥/將)是否會被對方吃掉(即「自殺」行為)。

3. 執行與動畫階段

如果驗證通過,則進入實體移動:

  • movePieceWithAnimation(pieceId, targetX, targetY, eatenId):
    負責處理移動的核心邏輯。
  • requestAnimationFrame(animate): 瀏覽器原生 API,用於實現平滑的位移動畫。
  • setPickup(pieceId, false): 移動完成後,取消棋子的「選中」高亮狀態。

4. 數據更新與紀錄階段 (動畫結束後的回調)

在動畫完成的瞬間,會執行以下操作:

  • getMoveNotation(...):
    根據移動的前後座標,生成中文棋譜術語(例如:「炮二平五」、「馬 8 進 7」)。
  • pushHistory(moveText):
    將這次移動存入歷史紀錄,它會接著調用:
  • boardToFEN(): 將當前棋盤狀態轉換為 FEN 字串(一種表達棋局的標準格式)。
  • addMoveToRecordUI(text, index): 在右側或下方的棋譜紀錄欄中新增一列文字。
  • highlightActiveStep(index): 在 UI 上高亮顯示目前正在進行的步數。

總結流程圖

點擊 → isValidMove (驗證) → movePieceWithAnimation (動畫) → getMoveNotation (生成棋譜) → pushHistory (存檔) → addMoveToRecordUI (更新介面)

你想了解關於特定棋子走法邏輯(如「馬腿」或「象心」)的具體代碼實現嗎?