思路:2048游戏棋盘为4*4的矩阵,用列表[[x1,x2,x3,x4],[x1,x2,x3,x4],[x1,x2,x3,x4],[x1,x2,x3,x4],]形式存储游戏数据。其中最关键的部分就是使用移动操作之后数据的合并问题。例如:0 0 2 0; 0 4 2 0; 0 0 4 4; 2 0 2 0;的左移之后的结果。
#传入游戏矩阵,返回左移之后的矩阵
def moveleft(GameMatrix):
...
return GM
对每一列来说,
指针 [ j ] 指向第一个值
(一):判断 j 之后的值有没有非 0 的,若没有则执行第三步,若有则执行第二步;
(二):找出指针之后第一个不为 0 的值,记为NextI,判断指针 [j] 所指的值:①若 [j] 为0则交换 [j] 与 [NextI] 的值,将 [NextI] 的值置为0,指针 [j] 减1(是为了再判断此位置一次);②若 [j] 与 [NextI]值相同,则将 [j] 值乘2,[NextI]值置为0;
(三):指针 [j] 加1,执行第一步。
代码:
def moveleft(GameMatrix):
GM = GameMatrix
##对每一列定义merge函数
def merge(array):
array = array
j = 0
while j < 4:
nextI = -1
for m in range(j+1, 4):
if array[m] != 0:
nextI = m
break
##说明后面有不为0的值
if nextI != -1:
if array[j] == 0:
array[j] = array[nextI]
array[nextI] = 0
j = j-1
if array[j] == array[nextI]:
array[j] = array[j]*2
array[nextI] = 0
j = j + 1
return (array)
for i in range(4):
GM[i] = merge(GM[i])
return GM