Pygame2048算法总结

'''
    游戏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)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值