学习了Python有一段时间了,之前写过爬虫来练(打)练(发)手(时)感(间),这次把目标转向2048
这款游戏是我在高中时曾经沉迷过的游戏,这个游戏是真的有毒 ,操作方式就时简单的上下左右滑动手机屏幕,以控制4 * 4方格中的数字移动,已组成2048这个数字。
如何用Python来实现这个游戏呢?
游戏的主界面,一个4*4的格局,这个可以用Python的list来实现,用列表来做一个4*4的数组。
接下来就是实现上下左右滑动的效果了,这里上下和左右分别做一个就可以了,剩下分别镜像就可以了。
以向上滑动为例:
def slide_up(array):
flag = False
for j in range(4):
flag = False
for i in range(4):
if array[i][j] == 0:
for down in range(i, 4):
if down+1 < 4:
array[down][j] = array[down+1][j]
if down == 3:
array[down][j] = 0
if i-1>=0 and array[i-1][j] == 0:
for down in range(i, 4):
array[down-1][j] = array[down][j]
if flag == True and i+1<4:
array[i][j] = array[i+1][j]
if i == 3 and flag == True:
array[i][j] = 0
if i+1 < 4 and array[i][j] == array[i+1][j] and flag == False:
array[i][j] *= 2
flag = True
return array
然后向下滑动就镜像向上滑动的就可以了:
def up2down(array):
new_array = [[array[3-i][j] for j in range(4)] for i in range(4)]
#print_array(new_array)
return new_array
def slide_down(array):
array = up2down(array)
flag = False
for j in range(4):
flag = False
for i in range(4):
"""
if flag == True and i+1<4:
array[i][j] = array[i+1][j]
if i == 3 and flag == True:
array[i][j] = 0
if i+1 < 4 and array[i][j] == array[i+1][j] and flag == False:
array[i][j] *= 2
flag = True
"""
if array[i][j] == 0:
for down in range(i,4):
if down+1 < 4:
array[down][j] = array[down+1][j]
if down == 3:
array[down][j] = 0
if i-1>=0 and array[i-1][j] == 0:
for down in range(i,4):
array[down-1][j] = array[down][j]
if flag == True and i+1<4:
array[i][j] = array[i+1][j]
if i == 3 and flag == True:
array[i][j] = 0
if i+1 < 4 and array[i][j] == array[i+1][j] and flag == False:
array[i][j] *= 2
flag = True
array = up2down(array)
return array
向左向右和上面一样(就是我懒得写了)
还有判断是否GAMEOVER:
这个其实很简单,满足两个条件就一定GAMEOVER了
1、4*4中没有空格了
2、相邻的方格中没有相同的
def fail(array):
zero = False
same = False
for row in range(4):
for column in range(4):
if array[row][column] == 0:
zero = True
if column + 1 < 4:
if array[row][column] == array[row][column+1]:
same = True
if row + 1 < 4:
if array[row][column] == array[row+1][column]:
same = True
if same or zero:
return False #游戏没有概述
else:
return True #游戏概述
由于没有写界面,所以暂时就是用数字来模拟整个游戏,0代表空,有数字代表方块。
写了一个run函数来测试各个方案
def run(array):
array_pre = list()
while(1):
print_array(array)
print('\n')
choice = input()
if choice == 'w':
array = slide_up(array)
print("slide up:")
elif choice == 's':
array = slide_down(array)
print("slide down:")
elif choice == 'a':
array = slide_left(array)
print("slide left:")
elif choice == 'd':
array = slide_right(array)
print("slide right")
else:
print("end")
break
index = random.randint(1, 2)
count = 0
if len(array_pre) == 0 or equal(array_pre, array):
for i in range(0, index):
row = random.randint(0, 3)
colum = random.randint(0, 3)
if (array[row][colum] == 0):
array[row][colum] = random.randint(1, 2) * 2
else:
i -= 1
count += 1
if count == 5:
break
array_pre = copy(array)
return array