Skip to content

Commit 8e4cd10

Browse files
committed
update premove
1 parent 6b6c87b commit 8e4cd10

8 files changed

Lines changed: 38 additions & 27 deletions

File tree

137 Bytes
Loading
0 Bytes
Loading
137 Bytes
Loading
0 Bytes
Loading

src/App.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
:is-flipped="isFlipped"
1414
:premove="premove"
1515
:last-move="lastMove"
16+
:can-premove="canPremove"
1617
:get-overlay-texture="getOverlayTexture"
1718
:get-piece-image="getPieceImage"
1819
:get-square-label="getSquareLabel"
@@ -108,6 +109,7 @@ const {
108109
dragStartSquare,
109110
mousePos,
110111
premove,
112+
canPremove,
111113
handleMouseDown,
112114
handleUndo,
113115
handleResign,

src/components/BoardPanel.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
:src="isWhiteSquare(actualRow(displayRow - 1), actualCol(displayCol - 1)) ? './texture/board/board_white.png' : './texture/board/board_black.png'"
1515
alt="" />
1616

17-
<img v-if="getOverlayTexture(board, selectedSquare, possibleMoves, isDragging, hoverSquare, actualRow(displayRow - 1), actualCol(displayCol - 1), premove, lastMove)"
17+
<img v-if="getOverlayTexture(board, selectedSquare, possibleMoves, isDragging, hoverSquare, actualRow(displayRow - 1), actualCol(displayCol - 1), premove, lastMove, canPremove)"
1818
class="square-background overlay" draggable="false"
19-
:src="getOverlayTexture(board, selectedSquare, possibleMoves, isDragging, hoverSquare, actualRow(displayRow - 1), actualCol(displayCol - 1), premove, lastMove)!" alt="" />
19+
:src="getOverlayTexture(board, selectedSquare, possibleMoves, isDragging, hoverSquare, actualRow(displayRow - 1), actualCol(displayCol - 1), premove, lastMove, canPremove)!" alt="" />
2020

2121
<img v-if="board[actualRow(displayRow - 1)]?.[actualCol(displayCol - 1)]" class="piece"
2222
draggable="false" :class="{
@@ -88,6 +88,7 @@ const props = defineProps<{
8888
isFlipped: boolean
8989
premove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null
9090
lastMove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null
91+
canPremove?: boolean
9192
getOverlayTexture: (
9293
board: Board,
9394
selectedSquare: { row: number; col: number } | null,
@@ -98,6 +99,7 @@ const props = defineProps<{
9899
col: number,
99100
premove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null,
100101
lastMove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null,
102+
canPremove?: boolean,
101103
) => string | null
102104
getPieceImage: (
103105
piece: Piece,

src/composables/useBoardDisplay.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ export function useBoardDisplay() {
3434
col: number,
3535
premove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null,
3636
lastMove?: { from: { row: number; col: number }; to: { row: number; col: number } } | null,
37-
): string | null => {
37+
canPremove?: boolean,
38+
): string | null =>{
3839
// 上一步移动的高亮(起始格和目标格),优先于其他高亮
3940
if (lastMove) {
4041
if (
@@ -47,20 +48,19 @@ export function useBoardDisplay() {
4748

4849
// Premove 高亮 - 目标格
4950
if (premove && premove.to.row === row && premove.to.col === col) {
50-
const targetPiece = board[row]?.[col] ?? null
51-
if (targetPiece !== null) {
52-
return './texture/board/board_premove_capture.png'
53-
}
54-
return './texture/board/board_premove_placeable.png'
51+
return './texture/board/board_premove_highlighted.png'
5552
}
5653

5754
// Premove 高亮 - 起始格
5855
if (premove && premove.from.row === row && premove.from.col === col) {
5956
return './texture/board/board_premove_hover.png'
6057
}
6158

59+
// 当前选中格高亮(premove 模式下使用 premove 版纹理)
6260
if (selectedSquare?.row === row && selectedSquare?.col === col) {
63-
return './texture/board/board_hover.png'
61+
return canPremove
62+
? './texture/board/board_premove_hover.png'
63+
: './texture/board/board_hover.png'
6464
}
6565

6666
const move = possibleMoves.find(
@@ -74,9 +74,13 @@ export function useBoardDisplay() {
7474

7575
const targetPiece = board[row]?.[col] ?? null
7676
if (targetPiece !== null) {
77-
return './texture/board/board_capture.png'
77+
return canPremove
78+
? './texture/board/board_premove_capture.png'
79+
: './texture/board/board_capture.png'
7880
}
79-
return './texture/board/board_placeable.png'
81+
return canPremove
82+
? './texture/board/board_premove_placeable.png'
83+
: './texture/board/board_placeable.png'
8084
}
8185

8286
return null

src/composables/useGameState.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -428,15 +428,9 @@ export function useGameState(
428428
// 走棋逻辑
429429
// ============================================================
430430
const possibleMoves = computed<Move[]>(() => {
431-
if (!canInteract.value || !selectedSquare.value) return []
432-
const { row, col } = selectedSquare.value
433-
const enPassantTarget = getEnPassantTarget(lastMove.value)
434-
return getLegalMoves(board.value, row, col, { lastMove: lastMove.value, enPassantTarget })
435-
})
436-
437-
// premove 期间选中棋子的合法走法
438-
const premovePossibleMoves = computed<Move[]>(() => {
439-
if (!canPremove.value || !selectedSquare.value) return []
431+
if (!selectedSquare.value) return []
432+
// 允许正常交互模式 或 premove 模式下计算合法走法
433+
if (!canInteract.value && !canPremove.value) return []
440434
const { row, col } = selectedSquare.value
441435
const enPassantTarget = getEnPassantTarget(lastMove.value)
442436
return getLegalMoves(board.value, row, col, { lastMove: lastMove.value, enPassantTarget })
@@ -446,15 +440,11 @@ export function useGameState(
446440
new Set(possibleMoves.value.map((move) => `${move.row}-${move.col}`)),
447441
)
448442

449-
const premoveHighlightedPositions = computed(() =>
450-
new Set(premovePossibleMoves.value.map((move) => `${move.row}-${move.col}`)),
451-
)
452-
453443
const canMoveTo = (row: number, col: number): boolean =>
454444
highlightedPositions.value.has(`${row}-${col}`)
455445

456446
const canPremoveTo = (row: number, col: number): boolean =>
457-
premoveHighlightedPositions.value.has(`${row}-${col}`)
447+
highlightedPositions.value.has(`${row}-${col}`)
458448

459449
const isSelectedSquare = (row: number, col: number): boolean =>
460450
selectedSquare.value?.row === row && selectedSquare.value?.col === col
@@ -752,6 +742,13 @@ export function useGameState(
752742
// ============================================================
753743
const handleMouseDown = (row: number, col: number, event: MouseEvent) => {
754744
if (event.button !== 0) return
745+
746+
// premove 模式下允许点击交互(但不支持拖拽)
747+
if (canPremove.value) {
748+
handleSquareClick(row, col)
749+
return
750+
}
751+
755752
if (!canInteract.value) return
756753

757754
const piece = board.value[row]?.[col]
@@ -1117,7 +1114,12 @@ export function useGameState(
11171114
cancelAIMove()
11181115
isAIThinking.value = true
11191116

1120-
// 使用 setTimeout 让 UI 先更新,避免阻塞渲染
1117+
// 模拟 AI 思考延迟(让棋钟有时间走动)
1118+
// 基础延迟 500ms + 根据难度随机追加 0~difficulty*500ms
1119+
const baseDelay = 500
1120+
const randomExtra = Math.random() * (6 - aiDifficulty.value) * 500
1121+
const thinkDelay = baseDelay + randomExtra
1122+
11211123
aiMoveTimer = window.setTimeout(() => {
11221124
aiMoveTimer = null
11231125
if (isGameOver.value) {
@@ -1149,7 +1151,7 @@ export function useGameState(
11491151
})
11501152
}
11511153
}
1152-
}, 300)
1154+
}, thinkDelay)
11531155
}
11541156

11551157
const checkAndTriggerAI = () => {
@@ -1224,6 +1226,7 @@ export function useGameState(
12241226
gameStatusMessage,
12251227
isGameOver,
12261228
canInteract,
1229+
canPremove,
12271230
isAITurn,
12281231

12291232
// 走棋

0 commit comments

Comments
 (0)