本文的大概背景,可以总结为一个非科班出身的半道子码农初学python并尝试在一周之内完成一个经典的2048小游戏,然后将这一周所学所感记录成文的非专业性文章。成文的目的只是自我总结与复习、思考而后形成记录,并无意扩散或教别人什么,仅此而已。

为打开思路,梳理脉络,我做了一个简单的脑图。

因此,本文行文大概也是跟着这脉络走的。

一、主要逻辑

既然要做,首先就得想清楚做什么,怎么做。

做什么?python编写2048,那么肯定就得涉及2048的游戏规则,所谓规则,编程里更倾向于叫做“逻辑”。同样,我以展开脑图的形式来呈现我在这一周内实现的2048的逻辑骨架:

明白了要做什么,接下来自然是怎么做?

所谓怎么做,也就是怎么用代码去实现。其实知道了整体的游戏逻辑之后,代码层面该怎么展开也差不多明了了,我们所需要做的只不过是按照逻辑编写代码,然后保证它能够顺利运行而没有bug。主要代码我会在后文逐步放出,在给出参考代码前,先总结一下所需要用到的库。

二、包与模块

python,最让人陶醉的不就是丰富的第三方库吗?正是这些第三方库,让我们的编程变得简单直接、方便快捷。那么,2048需要用到些什么库呢?

首先,2048需要一个界面来放置方块、或是棋盘,顺带放些提示信息、分数之类的在里面,这就涉及到UI。python有wxpython可以实现界面,这个之前用过,总体感觉就是简单,但是低端,即我们常说的low,画面效果极其一般,反正我不太喜欢。于是,我又找了找,发现了pyglet。据我查阅资料过后,发现pyglet很强大,是一个用于Python的跨平台窗口和多媒体库,用于开发游戏和其他视觉丰富的应用程序。它支持窗口,用户界面事件处理,OpenGL图形,加载图像和视频,以及播放声音和音乐。而这些,对我来说都不重要,毕竟我能用到的只是它的窗口和界面事件而已……对我来说,它吸引我的是它!足!够!好!看!

没错,我大概是个颜值党。

于是,pyglet成为了我搭建2048界面的工具。

决定了pyglet,其实这款游戏也就可以动工了,只是在后面的开发过程中,会引入随机函数库random用来随机生成数字和随机确定位置,以及拷贝库copy来实现自定义悔棋功能。

关于这仨,random没什么好说的,pyglet的相关知识建议去官网学习,而对于copy,我想就深拷贝和浅拷贝以及等号赋值这三个概念做个记录,毕竟在这里我是踩了坑的。

【提示:可以用id(x)和==去检测】

三、代码实现

知道要做什么,并且知道有哪些包可以帮上忙后,重头戏当然就是撸代码了。理清逻辑很重要,让逻辑成功跑起来也很重要,所以才有了码农……

我写代码的思路,其实就是根据游戏逻辑来的:

1、画面呈现、界面效果

以上代码就完成了从window到提示消息和棋盘、从棋盘到棋盘上放置数字的方块的界面效果,代码还是很浅显易懂的。

2、初始时刻在棋盘上任意两个位置随机生成数字2或4

既然是初始时刻,那么肯定是放在game_init()函数内的。

3、通过上下左右四个方向的操作,移动数字

对键盘的上下左右做出反应,则是需要slideUpDown和slideLeftRight两个函数。这就涉及到下面第四点内容。

4、移动方向上,碰撞数字相等则合并

这一点可以说是整个2048小游戏逻辑的核心内容,毫不客气地说,理解了这一点的逻辑,写出整个游戏也就没什么其他的拦路虎了。在一个棋盘上,有着随机位置的2或4,伴随着不同方向上的移动,则判断该方向上依次两个数字是否相等,如果相等,则合并,不等则不操作。

逻辑这样描述,虽然已经比较清晰了,但要用代码实现出来可能还需要费些功夫。我们可以把整个棋盘当做一个二维数组,这样就能实现位置和值的对应关系。

接着,从二维数组中抽取一维向量,以便判等合并。而我们知道棋盘上要么是2要么是4,要么是2的N此方(合并过后的结果),而空位置则是0,而0是不需要判定的,所以我们分解这个逻辑的第一步就该是抽取一维非零向量。

抽取过后,该合并的合并。合并的意思是,两个位置删去一个位置,余下的位置变为原来的两倍。

合并之后,就该补0回填了……

我们可以把上下和左右分成横纵两个方向,在横方向上即左右方向,我们可以发现左移、右移的区别只不过是首尾的位置互换而已,纵向同理。

合并的实现代码如上,其实只要理清了逻辑,就能很快写出来了。

以上的代码就是整个的逻辑实现了。

5、移动过程中在棋盘任意非0位置生成2或4

它的返回值,作为我们判断游戏是否结束的标志之一。

6、游戏结束

游戏结束的规则是:当棋盘被充满,并且四个方向都无法再合并。

四、bug修复

在整个实现的过程中,其实没什么特别大的bug,那些由于对python语言不熟悉而造成的语法问题在敲出代码的同时就会知道了,所以自然不消多说。我所记录的主要是由于前期考虑不周全造成的游戏使用过程中出现的bug,2048这个小东西,我就只记录一个游戏结束判定的逻辑缺陷(当然,我在第三点中的第六小点提到的结束规则是改进过后的……)。

最初编写时,我对于游戏结束的规则制定为:当按下一个方向键,棋盘被填满并且无法合并时,即游戏结束。乍看一眼,这规则并没什么毛病啊,于是,代码写出来是这样的:运行一下,会发现棋盘被填满后立即就出现“游戏结束”的标签……

可可可……可是我一眼就能看到棋盘上还能继续玩啊……

只是并不是在该方向上而已。

于是轻而易举就知道了逻辑漏洞:当按下某个方向键时,棋盘虽然充满,但是所谓的不能移动只是在该方向上不能移动,而在其他方向上还存在继续合并的地方。

所以,完善后的代码就成了这样:

五、重要参考与总结

自学是一件比较辛苦的事儿,它不系统,不被科班认可,甚至不自信。但因为它是纯兴趣使然,所以辛苦无所谓,反而会从中收获快乐。而在我的自学过程中,最应该感谢的就是互联网上那一个又一个先行者,是他们的先行尝试,才带给了我捷径与收获。

这一周内,我主要参考和学习的内容如下:

1、https://blog.csdn.net/u011630575/article/details/78604226 (结论稍有错误)

2、https://pyglet.readthedocs.io/en/pyglet-1.3-maintenance/

3、https://study.163.com/course/courseMain.htm?courseId=1263029

代码方面,更多地参考了网易云课堂中黑板客的课程,特此致谢。

一周用python完成2048小游戏相关推荐

  1. Python学习—2048小游戏等4个小练习

    Python学习-2048小游戏等4个小练习 转载于:https://www.cnblogs.com/ChangAn223/p/10627777.html

  2. python实现2048小游戏_python—手把手教你实现2048小游戏

    相信2048这个游戏对大家来说一定不陌生,下面这篇文章就主要给大家介绍了怎么用Python实现2048小游戏,文中通过注释与示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的 ...

  3. 2048游戏python源代码,python实现2048小游戏

    python实现2048小游戏 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现2048小游戏.txt ] (友情提示:右键点上行txt文档名-&g ...

  4. python小技巧:一步步教你用Python实现2048小游戏

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 相信2048这个游戏对大家来说一定不陌生,下面这篇文章就主要给大家介绍了怎么用Python实现2048小游戏,文中通过注释与示例代 ...

  5. Python实现2048小游戏

    2048小游戏也算是一款好玩的益智休闲小游戏,下面本博主用 python 语言将该游戏复现,感兴趣的小伙伴点击 关注 哦! 同时博主还用 java 语言复现了该游戏,可点击以下链接浏览博主的另一篇文章 ...

  6. python实现2048小游戏(优化版)

    我在之前的博客用python实现2048 中,实现了一些基本的2048游戏功能.但在博客发布之后,收到部分博友留言称游戏在运行时出现了一些问题,同时为了实现在之前博客中说游戏小道具,因此本文对游戏进行 ...

  7. python2048游戏代码_【Python】用Python实现2048小游戏(源代码,1.0版本)

    #2048 用python实现 import random import math import os global score score = 0 def start():#开始 a = [[0 f ...

  8. python文字游戏源代码_【Python】用Python实现2048小游戏(源代码,1.0版本)

    #2048 用python实现 import random import math import os global score score = 0 def start():#开始 a = [[0 f ...

  9. python设计2048小游戏_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

最新文章

  1. MobileViT 网络测试
  2. Java学习lesson 09
  3. linux用不用装固态硬盘驱动,固态硬盘要不要安装驱动?总算弄明白了
  4. 设计模式使用率排行榜
  5. 深入理解Fabric环境搭建的详细过程
  6. mysql中 s命令_Mysql-概念及常用命令
  7. yii2解决资源插件路径不对应问题
  8. vue中注意watch的执行顺序
  9. 华为MUX VLAN原理和实验
  10. 诸事不顺--今日宜睡大觉
  11. Java8 实战系列-03-lambda 表达式实战
  12. 小米一键上锁工具_小米手机通用解锁教程
  13. 怎样检测人脸相似度(人脸识别技术)
  14. js 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现
  15. 微信小程序的wx.chooseImage如何把图片传给后端
  16. 一步一步实现WPF透明化窗口
  17. Double与BigDecimal 比较
  18. 数据安全--14--隐私保护治理浅析
  19. K8S太火了,花10分钟玩转它不香么?
  20. 火遍日本 IT 界的「鱼书」终出续作,原来进阶深度学习竟然那么简单

热门文章

  1. 如何使用jmeter进行MQTT压力测试?
  2. 【ucharts】uniapp -- 使用秋云 ucharts echarts高性能跨全端图表组件
  3. Linux Ubuntu 22.04安装Dash to Panel替换系统自带的dock panel
  4. 使用格式工厂转换视频为MP4(AVCH264)格式
  5. python 读入文件列表_Python将文件读入列表
  6. 2020年9月网络安全考试试题
  7. vue-simple-uploader上传组件
  8. 快速修改PDF文档中图片的方法
  9. android 模拟nfc tag,android nfc tag3 调试日记
  10. 171204之条件查询总结