這段代碼描述了一個典型的中國象棋互動程序。當玩家在棋盤上點擊並完成一次「棋子走動」時,程序會經歷驗證、動畫、數據更新和 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 (更新介面)
你想了解關於特定棋子走法邏輯(如「馬腿」或「象心」)的具體代碼實現嗎?