【发布时间】:2021-05-17 23:33:09
【问题描述】:
我正在尝试使用 JavaScript 实现 the game 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,也不了解函数式编程范式。如果有人可以take a look at it 看看是否可以将其翻译成 JavaScript,我将不胜感激
【问题讨论】:
-
您没有正确处理 startindex ...如果没有发生合并,它也应该增加...唯一不增加的情况是当您处理空白空间时
标签: javascript algorithm oop ecmascript-6 2048