# -*- coding: UTF-8 -*-
import numpy as np
import random
def down(group):
#相同项相加
for j in range(0,4):
for i in range(3,-1,-1):
if group[i][j] != 0:
if (i-1 > -1) and (group[i-1][j] != 0):
if group[i][j] == group[i-1][j]:
group[i][j] *= 2
group[i-1][j] = 0
elif (i-2 > -1) and (group[i-2][j] != 0):
if group[i][j] == group[i-2][j]:
group[i][j] *= 2
group[i-2][j] = 0
elif (i-3 > -1) and (group[i-3][j] != 0):
if group[i][j] == group[i-3][j]:
group[i][j] *= 2
group[i-3][j] = 0
#将元素下移
for j in range(0,4):
for i in range(3,-1,-1):
if group[i][j] == 0:
for m in range(i-1,-1,-1):
if group[m][j] != 0:
group[i][j] = group[m][j]
group[m][j] = 0
break
#返回下移后的矩阵
return group
def left(group):
#相同项相加
for i in range(4):
for j in range(4):
if group[i][j] != 0:
if (j+1 < 4) and (group[i][j+1] != 0):
if group[i][j] == group[i][j+1]:
group[i][j] *= 2
group[i][j+1] = 0
elif (j+2 < 4) and (group[i][j+2] != 0):
if group[i][j] == group[i][j+2]:
group[i][j] *= 2
group[i][j+2] = 0
elif (j+3 < 4) and (group[i][j+3] != 0):
if group[i][j] == group[i][j+3]:
group[i][j] *= 2
group[i][j+3] = 0
#将元素左移
for i in range(4):
for j in range(4):
if group[i][j] == 0:
for m in range(j+1,4):
if group[i][m] != 0:
group[i][j] = group[i][m]
group[i][m] = 0
break
#返回左移后的矩阵
return group
def right(group):
#相同项相加
for i in range(4):
for j in range(3,-1,-1):
if group[i][j] != 0:
if (j-1 > -1) and (group[i][j-1] != 0):
if group[i][j] == group[i][j-1]:
group[i][j] *= 2
group[i][j-1] = 0
elif (j-2 > -1) and (group[i][j-2] != 0):
if group[i][j] == group[i][j-2]:
group[i][j] *= 2
group[i][j-2] = 0
elif (j-3 > -1) and (group[i][j-3] != 0):
if group[i][j] == group[i][j-3]:
group[i][j] *= 2
group[i][j-3] = 0
#将元素右移
for i in range(3,-1,-1):
for j in range(3,-1,-1):
if group[i][j] == 0:
for m in range(j-1,-1,-1):
if group[i][m] != 0:
group[i][j] = group[i][m]
group[i][m] = 0
break
#返回右移后的矩阵
return group
def up(group): #上移
#相同项相加
for j in range(4):
for i in range(4):
if group[i][j] != 0:
if (i+1 < 4) and (group[i+1][j] != 0):
if group[i][j] == group[i+1][j]:
group[i][j] *= 2
group[i+1][j] = 0
elif (i+2 < 4) and (group[i+2][j] != 0):
if group[i][j] == group[i+2][j]:
group[i][j] *= 2
group[i+2][j] = 0
elif (i+3 < 4) and (group[i+3][j] != 0):
if group[i][j] == group[i+3][j]:
group[i][j] *= 2
group[i+3][j] = 0
#将元素上移
for j in range(4):
for i in range(4):
if group[i][j] == 0:
for m in range(i,4):
if group[m][j] != 0:
group[i][j] = group[m][j]
group[m][j] = 0
break
#返回上移后的矩阵
return group
def supplement(group): #补入随机数
k = 0
for i in range(4):
for j in range(4):
if group[i][j] == 0:
m = random.randrange(0,5,2)
group[i][j] = m
if m != 0:
k += 1
if k >= 1:
break
if k >= 1:
break
return group
#随机输入一个矩阵
group = np.zeros((4,4))
k = 0
for i in range(4):
for j in range(4):
m = random.randrange(2,5,2)
group[i][j] = m
if m != 0:
k += 1
if k >= 2:
break
if k >= 2:
break
print(group)
#输入滑动方向
ori = input("输入一个方向:")
if ori == '1': #up
group = up(group)
elif ori == '2': #down
group = down(group)
elif ori == '3': #left
group = left(group)
elif ori == '4': #right
group =right(group)
while(1):
#输出result,判断游戏是否结束
#判断矩阵中是否含有0,若含有0或者相同项,a = 1
a = int(0)
for i in range(4):
for j in range(4):
if group[i][j] == 0:
a = 1
break
if a == 1:
break
#判断矩阵中的相邻项是否相同
if a == 0:
for i in range(4):
for j in range(4):
if (j+1 < 4) and (group[i][j+1] != 0):
if group[i][j] == group[i][j+1]:
a = 1
break
elif (j+2 < 4) and (group[i][j+2] != 0):
if group[i][j] == group[i][j+2]:
a = 1
break
elif (j+3 < 4) and (group[i][j+3] != 0):
if group[i][j] == group[i][j+3]:
a = 1
break
if a == 1:
break
if a == 0:
for j in range(4):
for i in range(4):
if (i+1 < 4) and (group[i+1][j] != 0):
if group[i][j] == group[i+1][j]:
a = 1
break
elif (i+2 < 4) and (group[i+2][j] != 0):
if group[i][j] == group[i+2][j]:
a = 1
break
elif (i+3 < 4) and (group[i+3][j] != 0):
if group[i][j] == group[i+3][j]:
a = 1
break
if a == 1:
break
#如果矩阵没有空格和相同项,或者包含2048,返回over,否则返回pass
if a == 0:
print('game over')
break
else:
for i in range(4):
for j in range(4):
if group[i][j] == 2048:
print('you win')
break
else:
pass
#若游戏没有结束,在空白方格随意输出0,2,4
print(supplement(group))
#输入滑动方向,输出滑动结果
ori = input("输入一个方向:")
if(ori == '1'):
group = up(group)
if(ori == '2'):
group = down(group)
if(ori == '3'):
group = left(group)
if(ori == '4'):
group =right(group)