使用200行Python代码编写2048游戏
2048 是我读大学的时候火起来的一门游戏,没有玩过的童鞋可以亲自体验一下:http://gabrielecirulli.github.io/2048/
前一段时间又出来了个 博士版,嗯,玩起来很有代入感,完美诠释了读博生活的苦逼和不易:http://www.cl.cam.ac.uk/~yf261/2048/?from=timeline
那么今天,我们就用200行左右的Python代码,自己实现一下2048吧!
游戏逻辑
首先不妨考虑一下游戏的运行逻辑。
游戏有以下4个状态:初始化、游戏中、胜利、游戏结束、退出。
- 初始化是指游戏刚开始,屏幕上只有两个2的状态;
- 游戏中是指用户可以继续操作的状态;
- 胜利是指成功合成了一个2048的状态;
- 游戏结束是指用户已经无法操作、屏幕上的数字无法进一步合成的状态;
- 退出是指用户选择了退出、程序退出的状态。
所以游戏的运行逻辑可以用一个有限状态机(FSM)来描述,从初始化出发,根据用户的当前操作进入下一状态,直到退出。
用户可以执行6种操作:上、下、左、右、重置、退出。
- 上、下、左、右会触发相应的移动和合并操作,并随机再生成一个2或4;
- 重置会将游戏变为初始化状态;
- 退出会直接结束游戏。
想清楚了以上的主逻辑,我们再来讨论下应该实现哪些功能性模块。
棋盘存储
如果游戏界面是一个4行4列的棋盘,那么我们需要用一个4*4的二维矩阵记录棋盘上当前的数字,用0表示对应位置为空,用2、4、8等值表示对应位置存在相应的数字。
随机生成一个2或4
不妨写一个函数,用于在当前棋盘上的随机一个空余位置生成一个2或4。游戏初始化时调用两次该函数,用户每次操作之后也需要再调用一次。
移动和合并
当用户执行操作之后,棋盘上的数字需要全部往该方向上移动,并且进行可能的合并。
举个例子,用户往左划之后,每一行的数字都需要向左移动和合并,可以分解为以下三个步骤:
- 将非零块全部“压”到左边;
- 如果相邻的块大小相同,则合并,一个用0代替,另一个用2倍数字代替;
- 再次把非零块全部“压”到左边。
想清楚了这些,另外三个方向上的操作也是类似的。
是否成功
处理完用户的操作之后,判断棋盘上是否已经有2048,如果已经合成了,表示用户成功,重开一盘。
是否失败
处理完用户的操作之后,判断棋盘在上、下、左、右四个方向上,是否还存在任何移动可能。
举个例子,对于左,判断每一行:
- 是否存在0,即存在空余位置;
- 是否存在两个相邻且大小相同的数字。
以上两个条件只要成立一个,就可以认为在该方向上仍有移动可能。
最高分
每次合成数字时记录总分数,例如合成一个4加4分。当Gameover时,比较总数据是否超过最高分,如果超过了则更新最高分即可。
游戏界面
写一些代码在屏幕上画一个4*4的棋盘,并且在每次处理完用户操作之后,根据棋盘矩阵的数值,在相应的位置填写数字或保留空白即可。
最后的样子
想清楚以上各个模块的功能之后,我们用200行左右的代码,就可以自己实现一个2048。
界面当然不好看,但是都是进一步润色和修改的事情了。如果有兴趣的话,还可以再实现一个网页版,毕竟游戏的主逻辑都是一样的~
博士版 把纯数字换成了想法、代码、深度学习、见导师、实验、paper、会议、答辩、博士、薄厚等,并且加入了垃圾、恋爱、分手等元素,很有创意、直达人心!
那么,你有别的想法吗?快去实现一个属于自己的独具特色的2048吧~
整理自实验楼(www.shiyanlou.com)课程
推荐阅读
-
使用cocos creator编写2048小游戏,并发布为微信小游戏
-
使用200行Python代码编写2048游戏
-
python 练习 2048 python编写2048游戏
-
Python初学者如何编写2048小游戏
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
使用JavaScript编写2048小游戏
-
2048小游戏代码的每步解析python 2048游戏代码及详解
-
使用Python和Pygame实现2048游戏
-
《使用JavaScript代码实现的2048小游戏》
-
使用C++编写的五子棋小游戏及其源代码