使用pyton写2048游戏

来源:互联网 发布:mac外接光驱 编辑:程序博客网 时间:2024/06/08 15:33

       python看了差不多两周,今天想着就用python写一个2048,还没有学UI,就在控制台上显示。这是我参考一个教程写的,不是自己独立做的,我觉得这个这个游戏的思想十分有意思,就写出来供大家参考。

       整个程序的语法十分简单,没有用到面向对象编程,基本上就是利用列表等序列和函数实现的,原教程的代码200行左右,我完善了一些功能,代码差不多300多一点,但是整个代码的复用特别多,真正核心的需要理解的也就不到100行,这100行看明白了,就可以了。

import randompoints = 0khopi_attempt = 0game_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:        breakprint "total points:",str(points)print "Game Over"

。。。吃饭去了,不想写了,我把完整的程序贴在下面。

import randompoints = 0khopi_attempt = 0game_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] = 2def 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] = 0def 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] = 0def 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 Falsedef 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] = 0def 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] = 0def 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 Falsedef 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] = 0def 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] = 0def 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 Falsedef 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] = 0def 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] = 0def 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 Falsewhile 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:        breakprint "total points:",str(points)print "Game Over"

这里面我为了测试程序设定的是得到32就显示成功,退出游戏,可以在代码里面改动。


0 0
原创粉丝点击