我是 JavaScript 新手,正在编写一款 2048 游戏。我有一个矩阵,每次按下箭头键时都会修改它。我想在修改矩阵之前在变量 originalBoard 中保存一个版本的矩阵,以便稍后可以将其与修改后的矩阵进行比较。以下是我在按下向上箭头并成功运行时使用的功能:
function slideUp() {
originalBoard = board
board = board[0].map((val, index) => board.map(row => row[row.length-1-index]));
for (let r = 0; r < rows; r++) {
let row = board[r]
row = slide(row)
board[r] = row
}
board = board[0].map((val, index) => board.map(row => row[index]).reverse())
if (notEqual(board, originalBoard)) {
addNewNum()
}
tileUI()
}
但是我有以下用于左键的功能:
function slideLeft() {
originalBoard = board
for (let r = 0; r < rows; r++) {
let row = board[r]
row = slide(row)
board[r] = row
}
if (notEqual(board, originalBoard)) {
addNewNum()
}
tileUI()
}
每当按下左键时,保存到变量 originalBoard 的矩阵与修改后的矩阵相同,即使在修改矩阵之前保存了 originalBoard。以下是用于更新矩阵的滑动函数:
function slide(row) {
row = filterZero(row)
for (let i = 0; i < row.length - 1; i ++) {
if (row[i] == row[i + 1]) {
row[i] = row[i] + row[i + 1]
row[i + 1] = 0
score += row[i]
}
}
row = filterZero(row)
while(row.length < 4) {
row.push(0)
}
return row
}
为什么在调用slide()函数之前声明的originalBoard变量修改后保存为矩阵? originalBoard 变量已为 slideUp() 和 slideDown() 函数正确保存。只有 slideLeft() 和 slideRight() 函数会发生这种情况。
我尝试在记录击键时立即记录 board 变量:
document.addEventListener('keyup', (e) => {
if (e.code == 'ArrowLeft') {
console.log(board)
slideLeft()
}
if(e.code == 'ArrowRight') {
console.log(board)
slideRight()
}
if(e.code == 'ArrowUp') {
console.log(board)
slideUp()
}
if(e.code == 'ArrowDown') {
console.log(board)
slideDown()
}
})
在左右击键时,在应用 slideLeft() 和 slideRight() 函数后,board 仍然被记录为矩阵,即使它们是在调用这些函数之前被记录的。然而,在向下和向上击键时,板变量被正确记录并且控制台在应用滑动功能之前显示矩阵。