我正在尝试使用 JavaScript实现游戏 2048 。我正在使用二维数组来表示板。对于每一行,它使用一个整数数组来表示。
在这里,我专注于实现左合并功能,即在用户敲击键盘左键后发生的合并。
这是我想出的一组测试用例
const array1 = [2, 2, 2, 0] // [4,2,0,0]
const array2 = [2, 2, 2, 2] // [4,4,0,0]
const array3 = [2, 0, 0, 2] // [4,0,0,0]
const array4 = [2, 2, 4, 16] // [4,4,16,0]
注释部分是发生后的预期结果merge left
。
这是我的尝试
const arrays = [
[2, 2, 2, 0], // [4,2,0,0]
[2, 2, 2, 2], // [4,4,0,0]
[2, 0, 0, 2], // [4,0,0,0]
[2, 2, 4, 16] // [4,4,16,0]
];
function mergeLeft(array) {
let startIndex = 0
let endIndex = 1
while (endIndex < array.length) {
if (array[startIndex] === array[endIndex]) {
array[startIndex] = array[startIndex] + array[endIndex]
array[endIndex] = 0
startIndex++
}
endIndex++
}
return shift(array, 'left')
}
function shift(array, dir) {
if (dir === 'left') {
for (let i = 0; i < array.length - 1; i++) {
if (array[i] === 0) {
[array[i], array[i + 1]] = [array[i + 1], array[i]]
}
}
}
// omitting when dir === 'right', 'up', 'down' etc.
return array
}
arrays.forEach(a => console.log(mergeLeft(a)));
所以这里的想法是我合并了数组,然后将非零项向左移动。
对于这种特殊情况,我当前的解决方案是错误的-当数组是时[2, 2, 2, 2]
,输出是[4,2,2,0]
预期输出时[4,4,0,0]
我知道我的实现也不优雅。所以我很想看看如何以(更好)的方式实现这一点。
顺便说一句,我在代码审查堆栈交换中发现了一个似乎正在工作的 python 实现。但是,我并不真正了解 Python,也不了解函数式编程范式。如果有人可以看看它,看看它是否可以翻译成 JavaScript,我将不胜感激