2048游戏python版
来源:互联网 发布:单词社交网络 mp4 编辑:程序博客网 时间:2024/05/01 06:57
作为python初学者,再学完基本语法后,看到网上多种版本的2048游戏,想起曾痴迷于此,必须实现一波。
该游戏主要可分为以下几个模块(基本思路来源于实验楼2048教程)。
#获取用户操作get_user_action()#重置棋盘reset()#判断操作是否可行is_move_possible()#移动数字move()#画棋盘draw()#是否结束is_over()#是否胜利is_win()#随机加数spawn()
在每次移动时,实验楼采取了一种相当高效的方式。首先,定义一个矩阵逆转函数和一个矩阵转置函数。
#矩阵转置,field 为棋盘(矩阵)def transpose(field):return list(map(list,zip(*field)))#矩阵逆转,每一行反序def invert(field):return [row[::-1] for row in field]</span>这样,在写好是否可以进行向左移动的操作后,其他方向的操作就可以通过 tanspose 或invert 或组合进行实现。
def move_is_possible(self,direction):def row_is_left_movable(row): def change(i):if row[i] == 0 and row[i + 1] != 0: # 可以移动return Trueif row[i] != 0 and row[i + 1] == row[i]: # 可以合并return Truereturn Falsereturn any(change(i) for i in range(len(row) - 1)) #存在一个 即返回truecheck = {}check['Left'] = lambda field: any(row_is_left_movable(row) for row in field) #只要有一行可以向左移动,则返回Truecheck['Right'] = lambda field: check['Left'](invert(field))check['Up'] = lambda field: check['Left'](transpose(field))check['Down'] = lambda field: check['Right'](transpose(field))if direction in check:return check[direction](self.field)else:return False
而在实际的移动操作中,对矩阵各元素有改动,则需要对转置(逆转)的矩阵再次转置(逆转),以保证操作的正确性。比如,
moves = {}moves['Left'] = lambda field: [move_row_left(row) for row in field]moves['Right'] = lambda field: invert(moves['Left'](invert(field)))moves['Up'] = lambda field: transpose(moves['Left'](transpose(field)))moves['Down'] = lambda field: transpose(moves['Right'](transpose(field))
在最后整合过程,用一个while循环进行。
game_field = GameField()while True:game_field.draw()action = get_user_action()if action == 'Restart':game_field.reset()if action == 'Exit':breakflag = game_field.is_over()game_field.move(action)
结果如图:
0 0
- 2048游戏python版
- python 版猜数字游戏
- Python-弹球游戏增强版
- python版猜数字游戏
- python游戏
- python游戏
- python pygame — 2048 用python+pygame写2048游戏
- Python游戏之Trivia游戏
- Python游戏:PyGame
- 扫雷游戏 python实现
- python猜数字游戏
- Python 游戏初学
- 用python写游戏
- 报数游戏python 解答
- python 服务器 select 游戏
- Python逃生游戏
- python-猜数字游戏
- python 简单游戏制作
- RabbitMQ消息队列(六):使用主题进行消息分发
- codeforces B
- lintcode:Minimum Adjustment Cost
- RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
- poj2367
- 2048游戏python版
- hihoCoder[Offer收割]编程练习赛3题目解析
- 2010年山东省第一届ACM大学生程序设计竞赛:Hello World!
- LeetCode *** 238. Product of Array Except Self
- 【Java】分析JAVA应用CPU占用过高的问题
- 采用Memcached实现分布式Session
- binder
- RabbitMQ消息队列的小伙伴(八): ProtoBuf(Google Protocol Buffer)
- 【bzoj2124】等差子序列 权值线段树维护hash