【趁热打铁】python基础综合练习(二)
前一个购物车练习主要掌握重构的思想,今天的算法掌握降维的思想
2048游戏核心算法
""" 2048 游戏核心算法 降维思想"""# 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]# [0,4,0,2] -->[4,2,0,0]list_merge = [0,2,2,0]def zero_to_end(): """ 零元素移至末尾 """ # 从后向前,如果发现零元素,删除并追加 # -1-2 -3 -4 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, 2, 0, 0]# 2.将相同数字合并# [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)#[4, 0, 0, 0]#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()move_left()print(map)#[[4, 0, 0, 0], [8, 4, 0, 0], [2, 8, 0, 0], [4, 0, 0, 0]]#4.地图向右移动map = [ [2,0,0,2], [4,4,2,2], [2,4,0,4], [0,0,2,2],]def move_right(): """ 向右移动 """ # 思想:将二维列表中每行(从右向左)交给merge函数进行操作 for line in map: global list_merge # 从右向左取出数据形成新列表 list_merge = line[::-1] merge() # 从右向左接受合并后的数据 line[::-1] = list_mergemove_right()print(map)#[[0, 0, 0, 4], [0, 0, 8, 4], [0, 0, 2, 8], [0, 0, 0, 4]]#5:向上移动或者向下移动map = [ [2,0,0,2], [4,4,2,2], [2,4,0,4], [0,0,2,2],]#提示:利用方阵转置函数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 r in range(1, len(sqr_matrix)): for c in range(r, len(sqr_matrix)): sqr_matrix[c][r - 1], sqr_matrix[r - 1][c] = sqr_matrix[r - 1][c], sqr_matrix[c][r - 1]move_up()print(map)#[[2, 8, 4, 4], [4, 0, 0, 4], [2, 0, 0, 2], [0, 0, 0, 0]]# move_down()# print(map)#[[0, 0, 0, 0], [2, 0, 0, 4], [4, 0, 0, 4], [2, 8, 4, 2]]
后移的内存图: