python看了差不多两周,今天想着就用python写一个2048,还没有学UI,就在控制台上显示。这是我参考一个教程写的,不是自己独立做的,我觉得这个这个游戏的思想十分有意思,就写出来供大家参考。
整个程序的语法十分简单,没有用到面向对象编程,基本上就是利用列表等序列和函数实现的,原教程的代码200行左右,我完善了一些功能,代码差不多300多一点,但是整个代码的复用特别多,真正核心的需要理解的也就不到100行,这100行看明白了,就可以了。
import random
points = 0
khopi_attempt = 0
game_box = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
first_position_list = [0, 1, 2, 3]
first_row_to_begin = random.choice(first_position_list)
first_column_to_begib = random.choice(first_position_list)
game_box[first_row_to_begin][first_column_to_begib] = 2
首先引用一个rondom模块,主要利用它的choic函数。这是整个程序的开头部分,作用就是随机生成2048游戏开始的矩阵。2048的棋盘就是利用列表里的加列表来表示,完全可以认为是4*4的一个矩阵,没有数字的部分用0表示。
def up_movement(game_box):
i = 0
for j in range(0, 4):
if game_box[i][j] != 0 or game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i][j] == 0:
while game_box[i][j] == 0:
game_box[i][j] = game_box[i + 1][j]
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i + 1][j] == 0:
while game_box[i + 1][j] == 0:
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i + 2][j] == 0:
while game_box[i + 2][j] == 0:
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
这是程序的第一个函数,顾名思义,是控制数字向上移动的。这个程序最巧妙的地方就是在考虑上移或者下移的时候,是按照4列来看的(左右移动的时候是看作4行),首先
i=0,j=0,来看循环。当第一列的四个数至少有一个不为0的话:如果是第一行数是0,那么就一直向上移动,直到第一个数不为0(利用赋值语句实现);第二个条件语句也是一样的道理,以此类推。这个函数实现了将数字向上移动。
def up_addition(game_box):
global points
i = 0
for j in range(0, 4):
if game_box[i][j] == game_box[i+1][j]:
game_box[i][j] = game_box[i][j] + game_box[i + 1][j]
points += game_box[i][j] ** 2
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i+1][j] == game_box[i+2][j]:
game_box[i+1][j] = game_box[i+1][j] + game_box[i + 2][j]
points += game_box[i+1][j] ** 2
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i+2][j] == game_box[i+3][j]:
game_box[i+2][j] = game_box[i+2][j] + game_box[i + 3][j]
points += game_box[i+2][j] ** 2
game_box[i + 3][j] = 0
第二个函数,控制上移时的加法运算。如果相等就合并,后面的补上就行了,这里面points变量是用来计算得分的。
def cannot_moveup(game_box):
i = 0
for j in range(0, 4):
if game_box[i][j] == 0 :
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
return True
if game_box[i + 1][j] == 0:
if game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
return True
if game_box[i + 2][j] == 0 and game_box[i + 3][j] != 0:
return True
if game_box[i][j] != 0 and game_box[i + 1][j] != 0:
if game_box[i][j]==game_box[i + 1][j]:
return True
if game_box[i][j] != 0 and game_box[i + 1][j] != 0 and game_box[i + 2][j] != 0:
if game_box[i][j]==game_box[i + 1][j] or game_box[i + 1][j]==game_box[i + 2][j] or game_box[i + 2][j]==game_box[i + 3][j]:
return True
return False
第三个函数,判断不能向上移动的情况。这个函数是我自己写的,原来的教程没有,但是2048游戏会出现这种像某一个方向移动但是不起作用的情况。
那么同理就能够写出向下,向左向右的情况了。一共12个函数包含四个方向。
while True:
print "Point>>>>>>>",str(points)
print game_box[0][0], '\t', game_box[0][1], '\t', game_box[0][2], '\t', game_box[0][3]
print game_box[1][0], '\t', game_box[1][1], '\t', game_box[1][2], '\t', game_box[1][3]
print game_box[2][0], '\t', game_box[2][1], '\t', game_box[2][2], '\t', game_box[2][3]
print game_box[3][0], '\t', game_box[3][1], '\t', game_box[3][2], '\t', game_box[3][3]
move_choice = raw_input('Make your move:')
if move_choice == 'w':
if cannot_moveup(game_box):
up_movement(game_box)
up_addition(game_box)
else:
print 'cannot move up,input again'
continue
elif move_choice == 's':
if cannot_movedown(game_box):
down_movement(game_box)
down_addition(game_box)
else:
print 'cannot move down,input again'
continue
elif move_choice == 'a':
if cannot_moveleft(game_box):
left_movement(game_box)
left_addition(game_box)
else:
print 'cannot move left,input again'
continue
elif move_choice == 'd':
if cannot_moveright(game_box):
right_movement(game_box)
right_addition(game_box)
else:
print 'cannot move right,input again'
continue
else:
khopi_attempt += 1
continue
zuobiao = []
for i in range(0,4):
for j in range(0,4):
if game_box[i][j] == 0:
zuobiao.append((i,j))
if max([max(game_box[0]),max(game_box[1]),max(game_box[2]),max(game_box[3])])>=32:
print "Congratrulations you get 32"
break
if len(zuobiao)>1:
i = range(len(zuobiao))
i = random.choice(i)
row_to_place_item = zuobiao[i][0]
column_to_place_item = zuobiao[i][1]
game_box[row_to_place_item][column_to_place_item] = 2
if len(zuobiao)==1:
row_to_place_item = zuobiao[0]
column_to_place_item = zuobiao[1]
game_box[row_to_place_item][column_to_place_item] = 2
if len(zuobiao)==0:
break
print "total points:",str(points)
print "Game Over"
。。。吃饭去了,不想写了,我把完整的程序贴在下面。
import random
points = 0
khopi_attempt = 0
game_box = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
first_position_list = [0, 1, 2, 3]
first_row_to_begin = random.choice(first_position_list)
first_column_to_begib = random.choice(first_position_list)
game_box[first_row_to_begin][first_column_to_begib] = 2
def up_movement(game_box):
i = 0
for j in range(0, 4):
if game_box[i][j] != 0 or game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i][j] == 0:
while game_box[i][j] == 0:
game_box[i][j] = game_box[i + 1][j]
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i + 1][j] == 0:
while game_box[i + 1][j] == 0:
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i + 2][j] == 0:
while game_box[i + 2][j] == 0:
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
def up_addition(game_box):
global points
i = 0
for j in range(0, 4):
if game_box[i][j] == game_box[i+1][j]:
game_box[i][j] = game_box[i][j] + game_box[i + 1][j]
points += game_box[i][j] ** 2
game_box[i + 1][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i+1][j] == game_box[i+2][j]:
game_box[i+1][j] = game_box[i+1][j] + game_box[i + 2][j]
points += game_box[i+1][j] ** 2
game_box[i + 2][j] = game_box[i + 3][j]
game_box[i + 3][j] = 0
if game_box[i+2][j] == game_box[i+3][j]:
game_box[i+2][j] = game_box[i+2][j] + game_box[i + 3][j]
points += game_box[i+2][j] ** 2
game_box[i + 3][j] = 0
def cannot_moveup(game_box):
i = 0
for j in range(0, 4):
if game_box[i][j] == 0 :
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
return True
if game_box[i + 1][j] == 0:
if game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
return True
if game_box[i + 2][j] == 0 and game_box[i + 3][j] != 0:
return True
if game_box[i][j] != 0 and game_box[i + 1][j] != 0:
if game_box[i][j]==game_box[i + 1][j]:
return True
if game_box[i][j] != 0 and game_box[i + 1][j] != 0 and game_box[i + 2][j] != 0:
if game_box[i][j]==game_box[i + 1][j] or game_box[i + 1][j]==game_box[i + 2][j] or game_box[i + 2][j]==game_box[i + 3][j]:
return True
return False
def down_movement(game_box):
i = 0
for j in range(0, 4):
if game_box[i][j] != 0 or game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i + 3][j] != 0:
if game_box[i+3][j] == 0:
while game_box[i+3][j] == 0:
game_box[i+3][j] = game_box[i + 2][j]
game_box[i + 2][j] = game_box[i + 1][j]
game_box[i + 1][j] = game_box[i][j]
game_box[i][j] = 0
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i][j] != 0:
if game_box[i + 2][j] == 0:
while game_box[i + 2][j] == 0:
game_box[i + 2][j] = game_box[i + 1][j]
game_box[i + 1][j] = game_box[i][j]
game_box[i][j] = 0
if game_box[i + 1][j] != 0 or game_box[i][j] != 0:
if game_box[i + 1][j] == 0:
while game_box[i + 1][j] == 0:
game_box[i + 1][j] = game_box[i][j]
game_box[i][j] = 0
def down_addition(game_box):
global points
i = 0
for j in range(0, 4):
if game_box[i+3][j] == game_box[i+2][j]:
game_box[i+3][j] = game_box[i+3][j] + game_box[i + 2][j]
points += game_box[i+3][j] ** 2
game_box[i + 2][j] = game_box[i + 1][j]
game_box[i + 1][j] = game_box[i][j]
game_box[i][j] = 0
if game_box[i+2][j] == game_box[i+1][j]:
game_box[i+2][j] = game_box[i+2][j] + game_box[i + 1][j]
points += game_box[i+2][j] ** 2
game_box[i + 1][j] = game_box[i][j]
game_box[i][j] = 0
if game_box[i+1][j] == game_box[i][j]:
game_box[i+1][j] = game_box[i+1][j] + game_box[i][j]
points += game_box[i+1][j] ** 2
game_box[i][j] = 0
def cannot_movedown(game_box):
i = 0
for j in range(0, 4):
if game_box[i+3][j] == 0 :
if game_box[i + 1][j] != 0 or game_box[i + 2][j] != 0 or game_box[i][j] != 0:
return True
if game_box[i + 2][j] == 0:
if game_box[i + 1][j] != 0 or game_box[i][j] != 0:
return True
if game_box[i + 1][j] == 0 and game_box[i][j] != 0:
return True
if game_box[i+3][j] != 0 and game_box[i + 2][j] != 0:
if game_box[i+3][j]==game_box[i + 2][j]:
return True
if game_box[i+3][j] != 0 and game_box[i + 1][j] != 0 and game_box[i + 2][j] != 0:
if game_box[i][j]==game_box[i + 1][j] or game_box[i + 1][j]==game_box[i + 2][j] or game_box[i + 2][j]==game_box[i + 3][j]:
return True
return False
def left_movement(game_box):
j = 0
for i in range(0, 4):
if game_box[i][j] != 0 or game_box[i][j+1] != 0 or game_box[i][j+2] != 0 or game_box[i][j+3] != 0:
if game_box[i][j] == 0:
while game_box[i][j] == 0:
game_box[i][j] = game_box[i][j+1]
game_box[i][j+1] = game_box[i][j+2]
game_box[i][j+2] = game_box[i][j+3]
game_box[i][j+3] = 0
if game_box[i][j + 1] != 0 or game_box[i][j + 2] != 0 or game_box[i][j + 3] != 0:
if game_box[i][j+1] == 0:
while game_box[i][j+1] == 0:
game_box[i][j+1] = game_box[i][j+2]
game_box[i][j+2] = game_box[i][j+3]
game_box[i][j+3] = 0
if game_box[i][j + 2] != 0 or game_box[i][j + 3] != 0:
if game_box[i][j+2] == 0:
while game_box[i][j+2] == 0:
game_box[i][j+2] = game_box[i][j+3]
game_box[i][j+3] = 0
def left_addition(game_box):
global points
j = 0
for i in range(0, 4):
if game_box[i][j] == game_box[i][j+1]:
game_box[i][j] = game_box[i][j] + game_box[i][j+1]
points += game_box[i][j] ** 2
game_box[i][j+1] = game_box[i][j+2]
game_box[i][j+2] = game_box[i][j+3]
game_box[i][j+3] = 0
if game_box[i][j+1] == game_box[i][j+2]:
game_box[i][j+1] = game_box[i][j+1] + game_box[i][j+2]
points += game_box[i][j+1] ** 2
game_box[i][j+2] = game_box[i][j+3]
game_box[i][j+3] = 0
if game_box[i][j+2] == game_box[i][j+3]:
game_box[i][j+2] = game_box[i][j+2] + game_box[i][j+3]
points += game_box[i][j+2] ** 2
game_box[i][j+3] = 0
def cannot_moveleft(game_box):
j = 0
for i in range(0, 4):
if game_box[i][j] == 0 :
if game_box[i][j+1] != 0 or game_box[i][j+2] != 0 or game_box[i][j+3] != 0:
return True
if game_box[i][j+1] == 0:
if game_box[i][j+2] != 0 or game_box[i][j+3] != 0:
return True
if game_box[i][j+2] == 0 and game_box[i][j+3] != 0:
return True
if game_box[i][j] != 0 and game_box[i][j+1] != 0:
if game_box[i][j]==game_box[i][j+1]:
return True
if game_box[i][j] != 0 and game_box[i][j+1] != 0 and game_box[i][j+2] != 0:
if game_box[i][j]==game_box[i][j+1] or game_box[i][j+1]==game_box[i][j+2] or game_box[i][j+2]==game_box[i][j+3]:
return True
return False
def right_movement(game_box):
j = 0
for i in range(0, 4):
if game_box[i][j] != 0 or game_box[i][j+1] != 0 or game_box[i][j+2] != 0 or game_box[i][j+3] != 0:
if game_box[i][j+3] == 0:
while game_box[i][j+3] == 0:
game_box[i][j+3] = game_box[i][j+2]
game_box[i][j+2] = game_box[i][j+1]
game_box[i][j+1] = game_box[i][j]
game_box[i][j] = 0
if game_box[i][j + 1] != 0 or game_box[i][j + 2] != 0 or game_box[i][j] != 0:
if game_box[i][j+2] == 0:
while game_box[i][j+2] == 0:
game_box[i][j+2] = game_box[i][j+1]
game_box[i][j+1] = game_box[i][j]
game_box[i][j] = 0
if game_box[i][j + 1] != 0 or game_box[i][j] != 0:
if game_box[i][j+1] == 0:
while game_box[i][j+1] == 0:
game_box[i][j+1] = game_box[i][j]
game_box[i][j] = 0
def right_addition(game_box):
global points
j = 0
for i in range(0, 4):
if game_box[i][j+3] == game_box[i][j+2]:
game_box[i][j+3] = game_box[i][j+3] + game_box[i][j+2]
points += game_box[i][j+3] ** 2
game_box[i][j+2] = game_box[i][j+1]
game_box[i][j+1] = game_box[i][j]
game_box[i][j] = 0
if game_box[i][j+2] == game_box[i][j+1]:
game_box[i][j+2] = game_box[i][j+2] + game_box[i][j+1]
points += game_box[i][j+2] ** 2
game_box[i][j+1] = game_box[i][j]
game_box[i][j] = 0
if game_box[i][j+1] == game_box[i][j]:
game_box[i][j+1] = game_box[i][j+1] + game_box[i][j]
points += game_box[i][j+1] ** 2
game_box[i][j] = 0
def cannot_moveright(game_box):
j = 0
for i in range(0, 4):
if game_box[i][j+3] == 0 :
if game_box[i][j+1] != 0 or game_box[i][j+2] != 0 or game_box[i][j] != 0:
return True
if game_box[i][j+2] == 0:
if game_box[i][j+1] != 0 or game_box[i][j] != 0:
return True
if game_box[i][j+1] == 0 and game_box[i][j] != 0:
return True
if game_box[i][j+3] != 0 and game_box[i][j+2] != 0:
if game_box[i][j+3]==game_box[i][j+2]:
return True
if game_box[i][j+3] != 0 and game_box[i][j+2] != 0 and game_box[i][j+1] != 0:
if game_box[i][j]==game_box[i][j+1] or game_box[i][j+1]==game_box[i][j+2] or game_box[i][j+2]==game_box[i][j+3]:
return True
return False
while True:
print "Point>>>>>>>",str(points)
print game_box[0][0], '\t', game_box[0][1], '\t', game_box[0][2], '\t', game_box[0][3]
print game_box[1][0], '\t', game_box[1][1], '\t', game_box[1][2], '\t', game_box[1][3]
print game_box[2][0], '\t', game_box[2][1], '\t', game_box[2][2], '\t', game_box[2][3]
print game_box[3][0], '\t', game_box[3][1], '\t', game_box[3][2], '\t', game_box[3][3]
move_choice = raw_input('Make your move:')
if move_choice == 'w':
if cannot_moveup(game_box):
up_movement(game_box)
up_addition(game_box)
else:
print 'cannot move up,input again'
continue
elif move_choice == 's':
if cannot_movedown(game_box):
down_movement(game_box)
down_addition(game_box)
else:
print 'cannot move down,input again'
continue
elif move_choice == 'a':
if cannot_moveleft(game_box):
left_movement(game_box)
left_addition(game_box)
else:
print 'cannot move left,input again'
continue
elif move_choice == 'd':
if cannot_moveright(game_box):
right_movement(game_box)
right_addition(game_box)
else:
print 'cannot move right,input again'
continue
else:
khopi_attempt += 1
continue
zuobiao = []
for i in range(0,4):
for j in range(0,4):
if game_box[i][j] == 0:
zuobiao.append((i,j))
if max([max(game_box[0]),max(game_box[1]),max(game_box[2]),max(game_box[3])])>=32:
print "Congratrulations you get 32"
break
if len(zuobiao)>1:
i = range(len(zuobiao))
i = random.choice(i)
row_to_place_item = zuobiao[i][0]
column_to_place_item = zuobiao[i][1]
game_box[row_to_place_item][column_to_place_item] = 2
if len(zuobiao)==1:
row_to_place_item = zuobiao[0]
column_to_place_item = zuobiao[1]
game_box[row_to_place_item][column_to_place_item] = 2
if len(zuobiao)==0:
break
print "total points:",str(points)
print "Game Over"