'''
游戏2048的中心思想:
根据键盘事件获得数组中的每一列或每一行
对获得的列或行进行精简操作
所谓精简操作就是将列表中每个元素想左侧合并
合并规则:
若紧邻的2个元素相等则叠加
列表中为0的元素被剔除
最终效果:
若传入的数组为L,长度为len(L)
则将精简后的列表末尾补0直至长度变回len(L)
'''
# 精简逻辑,出入列表和指定位置索引
def jd1(l_, j):
# 使用while使得循环中的list在不断发生变化(for循环达不到这个效果)
while j < len(l_) - 1:
# 索引位置数值和索引位置下一个数值都不为0
if l_[j] * l_[j + 1] > 0:
# 索引位置数值 == 索引位置下一个数值
if l_[j] == l_[j + 1]:
if j == 0:
# 累加至索引位置,并剔除索引位置下一个数值
l_[j] += l_[j + 1]
del l_[j + 1]
else:
# 累加至索引位置,并剔除索引位置下一个数值
l_[j] += l_[j + 1]
del l_[j + 1]
# 累加后,索引位置数值需要同索引位置上一个数值比较是否相等,这里递归
jd1(l_, j - 1)
# 索引位置数值 != 索引位置下一个数值
else:
# 退出循环,只需要检查当前索引就可以,不相等就不需要再判断了
break
# 索引位置数值和索引位置下一个数值有一个为0(默认为不会出现小于0的情况)
else:
# 索引位置数值 == 0,替换、剔除
if l_[j] == 0:
l_[j] = l_[j + 1]
del l_[j + 1]
# 索引位置下一个数值 == 0,无需替换,直接剔除
elif l_[j + 1] == 0:
del l_[j + 1]
return l_
def reduce(l_):
l_length = len(l_)
i = 0
# 对传入的列表的每个索引都进行精简,而且每次返回的都是一个新的列表,所以使用while
while i < len(l_):
l_ = jd1(l_, i)
i += 1
for j in range(l_length - len(l_)):
l_.append(0)
return l_
l = [32, 16, 16, 4, 4, 4, 2]
l = reduce(l)
print(l)