Skip to content

Commit 697070b

Browse files
author
linyisonger
committed
增加简单的0.0动画效果
1 parent 38dd2a9 commit 697070b

File tree

1 file changed

+86
-24
lines changed

1 file changed

+86
-24
lines changed

103.黑白棋.html

Lines changed: 86 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
right: 0;
3939
bottom: 0;
4040
top: 0;
41-
border: 2px solid #f0f;
41+
z-index: 1;
42+
border: 3px dashed #fdad19;
4243
}
4344

4445
.reversi-board .piece {
@@ -55,6 +56,58 @@
5556
background: #000;
5657
}
5758

59+
.reversi-board .piece.B.flip {
60+
animation: PieceWTB .5s linear;
61+
}
62+
63+
.reversi-board .piece.W.flip {
64+
animation: PieceBTW .5s linear;
65+
}
66+
67+
@keyframes PieceBTW {
68+
0% {
69+
background: #000;
70+
transform: rotateY(0);
71+
}
72+
73+
49% {
74+
background: #000;
75+
transform: rotateY(90deg);
76+
}
77+
78+
50% {
79+
background: #fff;
80+
transform: rotateY(90deg);
81+
}
82+
83+
100% {
84+
background: #fff;
85+
transform: rotateY(180deg);
86+
}
87+
}
88+
89+
@keyframes PieceWTB {
90+
0% {
91+
background: #fff;
92+
transform: rotateY(0);
93+
}
94+
95+
49% {
96+
background: #fff;
97+
transform: rotateY(90deg);
98+
}
99+
100+
50% {
101+
background: #000;
102+
transform: rotateY(90deg);
103+
}
104+
105+
100% {
106+
background: #000;
107+
transform: rotateY(180deg);
108+
}
109+
}
110+
58111
.reversi-board .game-over {
59112
position: absolute;
60113
left: 0;
@@ -102,8 +155,9 @@
102155

103156
let reversiBoardDOM = document.querySelector(".reversi-board")
104157
let sideLength = (reversiBoardDOM.clientWidth - 40) / 8 // 边长
105-
let operatePlayer = 'B'; // 操作的颜色
158+
let currPlayer = 'B'; // 操作的颜色
106159
let lastPos = [] // 操作点位
160+
let lastPosDict = {} // 操作字典
107161
let reversiBoard = new Proxy({}, {
108162
get(obj, prop) {
109163
return obj[prop];
@@ -128,8 +182,11 @@
128182
pieceDOM.classList.remove('W')
129183
pieceDOM.classList.remove('B')
130184
pieceDOM.classList.add(color)
185+
pieceDOM.classList.add('flip')
186+
setTimeout(() => {
187+
pieceDOM.classList.remove('flip')
188+
}, 800);
131189
}
132-
133190
return true
134191
}
135192
})
@@ -148,15 +205,12 @@
148205
if (e.target.classList.contains("allowSelect")) { // 允许选择
149206
let x = e.target.getAttribute('data-x')
150207
let y = e.target.getAttribute('data-y')
151-
let allowSelectPos = lastPos.filter(op => op[op.length - 1] == v2ToStr(x, y))
152-
allowSelectPos.forEach((arr) => {
153-
arr.forEach(key => {
154-
reversiBoard[key] = operatePlayer;
155-
})
156-
})
208+
let key = v2ToStr(x, y);
209+
lastPosDict[key].forEach(key => reversiBoard[key] = currPlayer)
157210
reversiBoardDOM.querySelectorAll('.allowSelect').forEach(dom => dom.classList.remove('allowSelect'))
158-
operatePlayer = 'W';
159-
nextPlayerOperate()
211+
currPlayer = 'W';
212+
setTimeout(() => nextPlayerOperate(), 1000)
213+
160214
}
161215
})
162216
reversiBoardDOM.appendChild(gridDOM)
@@ -176,7 +230,7 @@
176230
showReversiBoard();
177231
let pos = []
178232
for (const key in reversiBoard) {
179-
if (reversiBoard[key] === operatePlayer) {
233+
if (reversiBoard[key] === currPlayer) {
180234
let { x, y } = strToV2(key)
181235
pos.push(...find8Direction(x, y))
182236
}
@@ -189,27 +243,23 @@
189243
return
190244
}
191245
}
192-
else if (operatePlayer === "B") { // 玩家提供可操作的点位
193-
// 渲染到页面
194-
let allowSelect = pos.map(a => a[a.length - 1])
195-
allowSelect.forEach((key) => {
246+
else if (currPlayer === "B") { // 玩家提供可操作的点位
247+
lastPosDict = doubleArrayToDictArray(pos)
248+
Object.keys(lastPosDict).forEach((key) => {
196249
let { x, y } = strToV2(key)
197250
reversiBoardDOM.querySelector(`.grid[data-x="${x}"][data-y="${y}"]`).classList.add('allowSelect')
198251
})
199252
lastPos = pos;
200253
return;
201254
}
202-
else if (operatePlayer === 'W') { // 机器人
255+
else if (currPlayer === 'W') { // 机器人
203256
let allowSelect = pos.sort((a, b) => a.length - b.length);
204257
let selected = allowSelect[allowSelect.length - 1]
205258
let key = selected[selected.length - 1]
206-
allowSelect.filter(arr => arr[arr.length - 1] === key).forEach(arr => {
207-
arr.forEach(key => {
208-
reversiBoard[key] = operatePlayer;
209-
})
210-
})
259+
lastPosDict = doubleArrayToDictArray(pos);
260+
lastPosDict[key].forEach(key => reversiBoard[key] = currPlayer)
211261
}
212-
operatePlayer = operatePlayer == "B" ? "W" : "B"
262+
currPlayer = currPlayer == "B" ? "W" : "B"
213263
lastPos = pos;
214264
nextPlayerOperate();
215265
}
@@ -222,7 +272,7 @@
222272
while (-1 < cx && cx < 8 && -1 < cy && cy < 8) {
223273
let key = v2ToStr(cx, cy)
224274
if (!reversiBoard[key]) return pos.length ? pos.concat(key) : []
225-
else if (reversiBoard[key] === operatePlayer) return []
275+
else if (reversiBoard[key] === currPlayer) return []
226276
else pos.push(key)
227277
cx += dx
228278
cy += dy
@@ -247,6 +297,18 @@
247297
].filter(a => a.length)
248298
}
249299

300+
// 将多个点位打组
301+
function doubleArrayToDictArray(da) {
302+
let dict = {}
303+
da.forEach(arr => {
304+
let last = arr[arr.length - 1];
305+
let booty = arr.slice(0, arr.length - 1);
306+
if (dict[last]) dict[last] = dict[last].concat(booty)
307+
else dict[last] = [...booty, last]
308+
})
309+
return dict
310+
}
311+
250312
// 展示游戏结束
251313
function showGameOver() {
252314
let gameOverDOM = document.createElement("div")

0 commit comments

Comments
 (0)