在应用函数之前更新矩阵

问题描述 投票:0回答:0

我是 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 仍然被记录为矩阵,即使它们是在调用这些函数之前被记录的。然而,在向下和向上击键时,板变量被正确记录并且控制台在应用滑动功能之前显示矩阵。

javascript variables matrix game-development
© www.soinside.com 2019 - 2024. All rights reserved.