如何实现2048风格的一维数组左移合并及计分功能?
问题描述
我有一个包含score计数器和任意一维数字数组的对象,示例如下:
{ score: 0, board: [4, 2, 2] }
需要实现一个函数,完成类似2048游戏中一行方块的左移操作,同时累加计分(比如合并成8则给score加8)。之前找到的函数只实现了合并功能,没有计分逻辑,求完整实现。
测试用例如下:
{ score: 0, board: [] } => { score: 0, board: [] } { score: 0, board: [2,2] } => { score: 4, board: [4] } { score: 4, board: [2,2,2] } => { score: 8, board: [4,2] } { score: 6, board: [4,2,2] } => { score: 10, board: [4,4] } { score: 0, board: [2,2,2,2] } => { score: 8, board: [4,4] } { score: 8, board: [4,4] } => { score: 16, board: [8] } { score: 2, board: [8,8] } => { score: 18, board: [16] } { score: 0, board: [16,16] } => { score: 32, board: [32] } { score: 0, board: [1024,1024] } => { score: 2048, board: [2048] }
实现方案
以下是满足需求的JavaScript函数实现,核心逻辑是先过滤空值(如果存在),再遍历合并相邻相等元素并累加得分:
function moveLeft(gameState) { // 复制原数据,避免修改输入对象 const { score: initialScore, board } = gameState; let score = initialScore; // 过滤掉数组中的0(处理2048中空位的情况) const nonZeroNums = board.filter(num => num !== 0); const newBoard = []; let i = 0; while (i < nonZeroNums.length) { // 当前元素与下一个元素相等时合并 if (i + 1 < nonZeroNums.length && nonZeroNums[i] === nonZeroNums[i + 1]) { const mergedValue = nonZeroNums[i] * 2; newBoard.push(mergedValue); score += mergedValue; i += 2; // 跳过已合并的下一个元素 } else { newBoard.push(nonZeroNums[i]); i += 1; } } return { score, board: newBoard }; }
逻辑说明
- 数据隔离:通过解构赋值复制初始分数和数组,避免修改原输入对象
- 过滤空值:移除数组中的0(对应2048中的空位),只保留有效数字
- 合并与计分:遍历有效数字数组,遇到相邻相等的元素时合并为两倍数值,将合并结果加入新数组,并把合并值累加到分数中,同时跳过已合并的元素
- 返回结果:返回包含更新后分数和数组的对象
测试验证
将所有测试用例传入函数,均可得到符合预期的结果:
- 输入
{ score: 0, board: [2,2,2] },返回{ score: 4, board: [4,2] };若初始分数为4,则返回{ score: 8, board: [4,2] },完全匹配测试用例 - 输入
{ score: 0, board: [2,2,2,2] },合并两次得到[4,4],分数累加4+4=8,符合预期
内容的提问来源于stack exchange,提问作者absolutely not the the
相关产品推荐
相关产品推荐

