欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python小记:5.2048核心算法注意:切片索引的产生新列表与定位列表元素

程序员文章站 2022-06-22 08:34:33
在写2048核心算法时发现了一点小注意:列表的切片在 = 右侧时,是为了左侧的变量引用,开辟了一个新列表。而切片在 = 左侧时,是为了右侧的赋值能按照切片的索引和顺序定位到列表元素下面是示例的内存图:下面是具体的代码:""" 2048 游戏核心算法 16:50"""list_merge = None# 练习1:零元素移至末尾#   [2,0,2,0] --> [2,2,0,0]# [2,0,0,2] --> [2,2,0,0]#...

在写2048核心算法时发现了一点小注意:

  • 列表的切片在 = 右侧时,是为了左侧的变量引用,开辟了一个新列表。
  • 而切片在 = 左侧时,是为了右侧的赋值能按照切片的索引和顺序定位到列表元素

下面是示例的内存图:
Python小记:5.2048核心算法注意:切片索引的产生新列表与定位列表元素下面是具体的代码:

"""
    2048 游戏核心算法
    16:50
"""

list_merge = None


# 练习1:零元素移至末尾
#   [2,0,2,0]  --> [2,2,0,0]
#    [2,0,0,2]  --> [2,2,0,0]
#    [2,4,0,2]  --> [2,4,2,0]

def zero_to_end():
    """
        零元素移动到末尾.
    """

    # 思想:从后向前,如果发现零元素,删除并追加.
    for i in range(-1, -len(list_merge) - 1, -1):
        if list_merge[i] == 0:
            del list_merge[i]
            list_merge.append(0)


# 测试...
# zero_to_end()
# print(list_merge)


# 练习2:将相同数字合并 14:38
#   [2,2,0,0]  --> [4,0,0,0]
#    [2,0,0,2]  --> [4,0,0,0]
#    [2,0,4,0]  --> [2,4,0,0]
#    [2,2,2,2]  --> [4,4,0,0]
#    [2,2,2,0]  --> [4,2,0,0]
def merge():
    """
        合并
    """
    # 先将中间的零元素移到末尾
    # 再合并相邻相同元素
    zero_to_end()

    for i in range(len(list_merge) - 1):
        if list_merge[i] == list_merge[i + 1]:
            # 将后一个累加前一个之上
            list_merge[i] += list_merge[i + 1]
            del list_merge[i + 1]
            list_merge.append(0)


# 测试...
# merge()
# print(list_merge)

# 练习3:地图向左移动
map = [
    [2, 0, 0, 2],
    [4, 4, 2, 2],
    [2, 4, 0, 4],
    [0, 0, 2, 2],
]


def move_left():
    """
        向左移动
    """
    # 思想:将二维列表中每行交给merge函数进行操作
    for line in map:
        global list_merge
        list_merge = line
        merge()
        print(line)


move_left()
print(map)

def move_right():
    """
        向右移动
    """
    # 思想:将二维列表中每行(从右向左)交给merge函数进行操作
    for line in map:
        global list_merge
        # 从右向左取出数据 形成 新列表
        list_merge = line[::-1]
        merge()
        # 从右向左接受 合并后的数据 
        line[::-1] = list_merge


# move_right()
# print(map)

# 练习4:向上移动  向下移动
def move_up():
    square_matrix_transpose(map)
    move_left()
    square_matrix_transpose(map)


def move_down():
    square_matrix_transpose(map)
    move_right()
    square_matrix_transpose(map)


# 提示:利用方阵转置函数
def square_matrix_transpose(sqr_matrix):
    """
        方阵转置
    :param sqr_matrix: 二维列表类型的方阵
    """
    for c in range(1, len(sqr_matrix)):
        for r in range(c, len(sqr_matrix)):
            sqr_matrix[r][c - 1], sqr_matrix[c - 1][r] = sqr_matrix[c - 1][r], sqr_matrix[r][c - 1]


# move_down()
# print(map)

本文地址:https://blog.csdn.net/weixin_44671418/article/details/107239494