使用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就显示成功,退出游戏,可以在代码里面改动。
- 使用pyton写2048游戏
- Pyton——使用list和tuple
- 使用C#写游戏--推箱子
- 使用away3d引擎写的游戏
- javascript写的2048游戏
- pyton random
- pyton: subprocess
- Pyton 线程
- pyton阶乘
- 利用Flex写的2048游戏
- 用AngularJS写2048游戏(一)
- 用AngularJS写2048游戏(二)
- 一个C语言写的2048游戏
- 使用jsp和servlet写的一猜数字游戏
- 使用cocos2dx的lua脚本写游戏逻辑
- 使用Swift和SpriteKit写一个忍者游戏
- 使用cocos2dx的lua脚本写游戏逻辑
- 使用JavaScript写的剪刀石头布的游戏!
- 设计模式之简单工厂模式
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
- Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_WKWebView", referenced from: objc-
- 关于事务(Transaction)的几个概念
- ReactNative 中 ListView实现GridView效果
- 使用pyton写2048游戏
- linux,Vim和vi基本指令与使用
- 类的大小——sizeof 的研究
- mac 配置eclipse
- Ubuntu安装mysql
- JDBC从入门到熟练(一)
- 触摸java常量池
- 音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)
- solr 学习