python学习笔记(五) 200行实现2048小游戏
用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏。
先将用户操作和游戏逻辑绑定。
WASD分别对应移动方向上、左、下、右

然后实现矩阵的转置和逆置,这样只要实现一个方向的移动,通过转置和逆置就可以得到其他方向
的移动。

基本的函数声明完成了,下面定义GameField类,主要实现游戏逻辑和状态转换。
GameField类和其中包含的一些函数。先看构造函数。

构造棋盘并且刷新棋盘,作为初次游戏的布局。

spawn函数为随机某个位置设置随机值。

移动函数,这个函数比较复杂,代码也比较多。


move函数内部先定义了左移的函数move_row_left,move_row_left内部定义了tighten和merge函数。
tighten函数作用是先将一行中非0的元素移动到左边排列,剩余的0元素放在右边,可以理解为压缩。
如[0,2,2,4]经过tighten调用后就变为[2,2,4,0]。merge函数的功能是将相邻的相等的元素进行合并,
比如[2,2,8,0]经过merge后变为[0,4,8,0],[0,4,8,0]经过再次tighten调用后变为[4,8,0,0]
所以move_row_left内部实现的就是先对一个队列tighten,然后merge再次tighten达到左侧都是非0,右侧都是0。
move函数最后定义了一个dict,dict的key为方向,value为二维list。这个二维list是通过lambda表达式调用
左移函数以及矩阵逆置和转置等操作生成的。
举例说明右移:通过右移要达到的效果是[2,2,4,4]=>[0,0,4,8],为达到该目的,通过逆置矩阵,左移,再次逆置矩阵即可。
先逆转矩阵
[2,2,4,4]=>[4,4,2,2]
再执行左移函数
[4,4,2,2]=>[8,4,0,0]
再执行矩阵逆置
[8,4,0,0]=>[0,0,4,8]达到最初效果
上移和下移都是类似。
move函数最后通过判断传入direction是否符合标准,如果符合再次判断元素是否可以移动,如果可以移动则取出dict中方向key对应
的value,即二维list,从而得出移动后的棋盘界面。如果所有元素都不能移动,那么判断失败。
判断某个方向是否有元素可以移动,定义了如下函数。

同样是先判断是否可以左移,其他方向能否移动可以通过左移操作和矩阵的转置,逆置判断。
row_is_left_movable是判断是否可以左移操作的函数,内部定义了change函数,
change函数的功能为判断有左右相邻元素可以合并,或者该行有含有0的元素,则返回true,表示该行可以左移。
反之为不可左移,返回false。any函数判断该行所有元素,如果都没有可移动的元素,返回false。
同样是通过check这个dict,结合逆转和转置判断其他方向是否可以移动。如果某个方向所有行都不能移动,
表示矩阵中所有元素不能按照该方向移动了。
下面是判断输赢的函数。

到此为止GameField类介绍完了,下面是main函数。


定义了几个状态,通过状态机的方式运行游戏。 curses.wrapper模块。这个函数做了一些初始化的工作,包括上面提到的和颜色的初始化。
然后再执行main函数,最后重置。
源码下载地址:
http://download.csdn.net/detail/secondtonone1/9852914
运行上述代码效果如下:

我的公众号,谢谢关注

python学习笔记(五) 200行实现2048小游戏的更多相关文章
- python学习笔记五 模块上(基础篇)
模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- Python学习笔记五
一. 递归 递归函数: def a (): print ("from b") b() def b(): print("from a ") a() a() 递推和 ...
- Python学习笔记五(读取提取写入文件)
#Python打开读取一个文件内容,然后写入一个新的文件中,并对某些字段进行提取,写入新的字段的脚本,与大家共同学习. import os import re def get_filelist(dir ...
- python学习笔记五 模块下(基础篇)
shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...
- python学习笔记五--文件
任何情况下文本文件在Python里均是字符串模式. 一.创建一个文件,并写入: 函数open(文件名,w) 二.打开一个文件,并读取: 函数open(文件名,r),“r”是默认值,可以不用写 三.使用 ...
- python学习笔记(五)、抽象
不知不觉已经快毕业一年了,想想2018年过的可真舒适!!!社会就像一锅水,不同地方温度不同,2018年的我就身处温水中,没有一丝想要进取之心. 1 抽象 抽象在程序中可谓是神来之笔,辣么什么是抽象呢? ...
- python学习笔记五——数据结构
4 . python的数据结构 数据结构是用来存储数据的逻辑结构,合理使用数据结构才能编写出优秀的代码.python提供的几种内置数据结构——元组.列表.字典和序列.内置数据结构是Python语言的精 ...
- Python学习笔记五:错误与异常
一:常见异常与错误 BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类S ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
随机推荐
- python编辑三级目录
一.需求分析 三级目录要能够实现以下要求: 显示根目录,任何子目录中都可以通过输入b字符来返回根目录 任何子目录中都可以通过输入q字符来返回上一级目录 主目录进入子目录后,系统能够打印子目录,根据指打 ...
- cinder创建volume的流程-简单梳理
1. cinder-api接收到创建的请求,入口:cinder.api.v2.volumes.VolumeController#create,该方法主要负责一些参数的重新封装和校验,然后调用cinde ...
- 当Kubernets遇上阿里云 -之七层负载均衡(一).
我们知道Kubernetes的service只能实现基于4层的负载均衡,无法提供7层之上的许多特性,诸如基于URL的负载均衡,SSL支持,三方授权等等:Ingress可以实现七层负载均衡的许多功能,唯 ...
- 第五次ScrumMeeting博客
第五次ScrumMeeting博客 本次会议于10月29日(日)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和 ...
- js操作对象属性值为字符串
今天在项目开发中遇到一个没遇到过的问题,这个问题是需要对比两个对象a和b,a是一个只有一个属性的对象,b是一个含有多个属性对象,如果b中包含和a一模一样的属性名和值,则把这个一样的属性和值从b中删除了 ...
- Spring演示及总结
一.目标 二.分工 三.回顾 发现问题: 第一个冲刺的任务以基本完成,但队友的状态相对有些疲软,主要原因可能是这两周有好几个课程大作业要赶, 有的队友还要为比赛做准备,及做一些其他是项目,时间较紧,有 ...
- c# 捕获一般获取不到的异常
1.主函数入口加异常事件,代码例如: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void M ...
- Android开发第二阶段(2)
昨天:总结了第一阶段的开发经验 今天:学习了一下java中对事件处理这块的初步了解比如设置监听器等 明天:我会走进我们的代码去看看相关的一些知识.
- 软工实践第八次作业(课堂实战)- 项目UML设计(第五组)
本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...
- UVA 10328 - Coin Toss dp+大数
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...