如何识别reduceLineLeft函数中发生合并操作的数值?
2048行合并函数的合并数值追踪实现
原合并函数代码
以下是用于处理2048游戏中行合并逻辑的Python函数:
from functools import reduce def reduceLineLeft(xs): def aux(acc, y): if len(acc) == 0: acc.append(y) elif acc[len(acc)-1] == y: acc[len(acc)-1] = y * 2 acc.append(0) else: acc.append(y) return acc res = list(filter(lambda x: x !=0, reduce(aux, filter(lambda x: x!=0, xs), []))) res.extend([0 for i in range(0, len(xs)-len(res))]) return res
函数功能
该函数接收一行数字列表(模拟2048的一行方块),按照规则向左合并相同数值:
- 输入
[4, 2, 2, 0],返回合并后的结果[4, 4, 0, 0] - 输入
[4, 4, 2, 2],返回合并后的结果[8, 4, 0, 0]
需求
现在需要在执行合并操作时,同步记录本次操作中发生合并的原始数值:
- 对应第一个例子,需得到合并数值列表
[2] - 对应第二个例子,需得到合并数值列表
[4, 2]
合并规则补充
- 两个相同数字的方块在移动碰撞时,合并为两者之和的新方块
- 合并后的方块在同一次操作中无法再次合并(需再次调用函数才可能参与合并)
实现追踪合并数值的修改版函数
在原函数基础上新增合并数值追踪逻辑,代码如下:
from functools import reduce def reduceLineLeftWithMergeTrack(xs): merged_values = [] # 存储本次操作中发生合并的原始数值 def aux(acc, y): if len(acc) == 0: acc.append(y) elif acc[-1] == y: # 触发合并,记录原始数值 merged_values.append(y) acc[-1] = y * 2 acc.append(0) else: acc.append(y) return acc # 过滤掉原始列表中的0,只处理有效数值 filtered_xs = list(filter(lambda x: x != 0, xs)) # 执行合并逻辑并过滤中间产生的0 merged_line = list(filter(lambda x: x != 0, reduce(aux, filtered_xs, []))) # 补全末尾的0,保持原列表长度 merged_line.extend([0] * (len(xs) - len(merged_line))) # 返回合并后的行数据和合并数值列表 return merged_line, merged_values
使用示例
# 示例1 line1 = [4, 2, 2, 0] result1, merged1 = reduceLineLeftWithMergeTrack(line1) print(result1) # 输出: [4, 4, 0, 0] print(merged1) # 输出: [2] # 示例2 line2 = [4, 4, 2, 2] result2, merged2 = reduceLineLeftWithMergeTrack(line2) print(result2) # 输出: [8, 4, 0, 0] print(merged2) # 输出: [4, 2]
内容的提问来源于stack exchange,提问作者Kārlis Kazāks
相关产品推荐
相关产品推荐

