欢迎光临散文网 会员登陆 & 注册

31步学会写《俄罗斯方块》

2023-08-25 09:15 作者:英雄哪里出来  | 我要投稿

前言

       本期视频点赞目标达成,已经把分步拆解的文字版本和视频版本发到知识星球(英雄算法联盟)里,但是有同学反馈免费体验券无法查看(其实是需要下载app,如果不想下载app,可以跟着这篇文章进行学习,如果执意要在星球里学习,可以尝试下扫下文末的免费体验券,注意无需付费!!!由于B站文章的代码格式不支持,所以代码的部分采用图片的方式,这样也可以避免大家复制粘贴,逼着大家自己写,何尝不是一种倒逼。

       B站不能上传文件,所以源码可以在公众号:夜深人静写算法,回复 tetris 直接获取。


第01步、安装编码环境

1、下载Python

       百度输入 "Python3下载",右键打开官网,找到一个相对较新的版本,点击下载,看到 recommended 字样,不由自主的选择了这个,右键打开,等它下载完。

2、安装Python

       双击安装,不要点取消,安装完成。

3、下载安装VSCode

       百度输入 "vscode",点击官网,点击下载,点击 windows,就下载好了,直接双击,咦怎么没有找到?嘶……哦哦哦哦哦,点击保留,点击打开文件,点击我愿意,下一步,下一步,创建桌面快捷方式,下一步,安装,完成。

4、第一个Python程序

       新建一个文件,选择Python类型,随便写一段代码,按 F5 运行,调出来的框选择确认,安装Python解释器,选它,第一个Python程序就出来了。

       分步视频:https://t.zsxq.com/117C1FekV


第02步、安装游戏环境

        找到Python的安装目录,右键打开命令行,把 pip3 拖进来,紧接着输入 "install pygame",看到绚丽的进度条,我的内心泛起了涟漪,至此我们的游戏环境就搭好了。

       分步视频:https://t.zsxq.com/11GDpn3TK


第03步、运行例子

       按住 shift,右键窗口空白处,打开 Power Shell 控制台,把 Python 的可执行文件拖进来,输入:pygame.examples.aliens,按下回车:

       分步视频:https://t.zsxq.com/11oPrEMgU


第04步、新建文件夹

        接下来我们自己来做一个游戏。右键新建文件夹,输入pic用来放图片。再新建一个文件夹,输入code用来放代码,把老婆给我们准备好的图片,Ctrl+C, Ctrl+V。

      没有老婆的话可以找女朋友要。在 code 目录中新建一个文件,选择Python,Ctrl + S,命名 main.py 代表游戏主文件。

       分步视频:https://t.zsxq.com/11VH2swXp


第05步、初始化pygame

       分步视频:https://t.zsxq.com/11AnfcLzZ


第06步、主循环

       分步视频:https://t.zsxq.com/110jZesoz


第07步、创建画面

       分步视频:https://t.zsxq.com/11rsA6ReC


第08步、显示图片

       分步视频:https://t.zsxq.com/11CylfiAR


第09步、让图片动起来

       分步视频:https://t.zsxq.com/11IFaReOB


第10步、去掉残影

       分步视频:https://t.zsxq.com/11sRZuvBa


第11步、控制移动

       分步视频:https://t.zsxq.com/1104ZVHvx


第12步、增加上下方向

       分步视频:https://t.zsxq.com/111e7uCEM


第13步、实现方块类

       现在只有一个方块,想要有多个方块,最好的方法就是把方块设计成一个类,利用面向对象的思想,接下来我们实现一个方块类 Block,处理好图片和它的位置,以及玩家控制的代码,再封装一个渲染的函数,像这样:

生成一个类的实例,删掉刚才的测试代码,调用更新和渲染的函数。

       分步视频:https://t.zsxq.com/11HVnWQJn


第14步、多实例

1、定义方块类型

       既然已经封装成了类,自然就可以多个实例运行,定义 blockType,红橙黄绿青蓝紫,像这样:

2、定义方块资源路径

       每种类型的资源位置写下来,一气呵成,没有技巧,全是感情,唯手熟尔,你也可以:

3、方块初始化参数

        对 Block 加入初始化参数,方块类型和位置,把原有的常量,替换成变量:

4、实例化方块

        生成两个方块的实例(也就是对象的意思),像这样:

5、调用更新和渲染函数

        调用方块的 update 和 draw 函数。

       分步视频:https://t.zsxq.com/11DrHRwC2


第15步、拆分文件

       分步视频:https://t.zsxq.com/114prI5hu


第16步、逻辑和表现分离

      重新实现block的初始化函数,可以根据类型、行坐标、列坐标、宽高,以及相对位置来实现多态,根据传参来确定采用哪张图片、实际的尺寸、以及确定位置。把之前的初始化函数删掉。

       分步视频:https://t.zsxq.com/11hSGSoaw


第17步、组合方块

1、增加方块配置

       在 const 文件中,增加四种形状的配置,放在 BLOCK_SHAPE 中,用局部坐标来表示,有方形、长条形、z字型、飞机型,像这样:

2、随机生成方块组

       然后新建一个文件 blockGroup.py,实现通过配置实例化方块组的接口,一个blockGroup代表一个方块组:

3、实例化方块组

       将方块组存储在 blocks 列表中,实现渲染函数,遍历blocks进行渲染。

       分步视频:https://t.zsxq.com/11oUTfLOS


第18步、模拟下落

       分步视频:https://t.zsxq.com/11qZF4tvO


第19步、框架代码

       分步视频:https://t.zsxq.com/11HjoTcnd



第20步、确定游戏主逻辑

       抽象来说,俄罗斯方块这个游戏就是:一个静态的 BlockGroup 和 一个下落的 BlockGroup完成碰撞的过程,下落的 BlockGroup 在和静态的 BlockGroup 产生碰撞以后,就会被合并到静态的 BlockGroup 去,而静态的 BlockGroup 从下往上判断。是否有一整行填充的方块,播放一个消去的动画,直到找不到整行的为止,则继续生成下落的方块的过程。

        当静态的 blockGroup 到达一定高度,则游戏失败。

       分步视频:https://t.zsxq.com/1106GAXIK


第21步、BlockGroup 的多态

1、增加 BlockGroup 类型

         在 const.py 文件中添加两种类型,一种是静态的,一种是下落的:

2、定义方块宽高

       方块的宽高定义成常量,都是32像这样。

3、初始化 BlockGroup

       给每个方块组加上类型,像这样:

4、下落调整

        如果类型是下落类型,才执行时间判定。

5、游戏逻辑调整

       在 game 文件中,将 固定类型方块组 fixedBlockGroup 以及 下落类型方块组 dropBlockGroup 都实例化出来,update 函数就是执行两者的 update,并且如果没有下落类型,则随机生成一个。渲染函数也是类似写就可以了。

       分步视频:https://t.zsxq.com/11uqzAUGW


第22步、模拟碰撞

1、碰撞的概念

       在这个场景下,碰撞的概念其实就是:计算固定的 blockGroup 和 下落的 blockGroup 的交集,如果两个方块集合才产生交集,则认为发生了碰撞。

2、block 坐标封装

      对每个 block 实现 获取当前坐标 和 获取下落后的坐标 的函数,像这样:

3、blockGroup 坐标封装

      在 blockGroup 中用列表进行一次封装,像这样:

4、blockGroup 增删改接口

       再实现一些增删改的函数,以便不时之需:

5、碰撞检测

       在 game.py 文件中,实现碰撞检测,首先将固定的  blockGroup 中所有的方块映射到 哈希表中,然后取下落的 blockGroup 中所有方块,下落后的位置,去哈希表中进行查询,一旦找到,这个函数返回 True;否则如果超过游戏给定的行数,也返回 True,都代表产生了碰撞。

       分步视频:https://t.zsxq.com/11XOLtzAE


第23步、控制左右移动

1、左右移动接口

       将之前 block 中控制方块移动的代码去掉,定义一些边界值以及控制方块左右移动时需要修改的变量,比如左边界判定,右边界判定,方块左移和方块右移。

2、左右移动按键响应

       然后在blockGroup 中实现左右移动。如果方块组中有任意一个方块在左边界,则无法左移,否则可以,直接执行;如果方块组中有任意一个方块在右边界,则无法右移,否则可以。

3、按键调用

       在 blockGroup 的 update 函数中,调用按键相应接口,像这样:

       分步视频:https://t.zsxq.com/11ypi1oje


第24步、控制左右移动速度

1、增加时间函数

        新建一个 utils.py 文件,写一个基础获取时间的函数,获取毫秒级别的时间像这样:

2、增加时间检测函数

       然后实现一个检测上次按下时间的函数,这样的话,会更加的流畅:

3、调用事件检测函数

       在按键按下的同时,调用这个函数:

       分步视频:https://t.zsxq.com/114uD07pC


第25步、控制下落速度

       分步视频:https://t.zsxq.com/11hkC9Fmm


第26步、方块旋转

1、旋转多维列表

       由于传给 block 的是实际的下标,相当于在世界坐标系做操作,而旋转最好是局部坐标系,所以 block 应该记录局部坐标。我们把 BLOCK_SHAPE 进行改造

       第一维代表形状,第二维代表各种旋转的情况,第三维代表局部坐标

       方形旋转90度还是它本身、长条旋转90度变成这样、z字型旋转交换后变成这样、而飞机旋转四次是四种形状,自己画个图就明白了。

2、改造 block 初始化

       通过 形状、旋转 以及相对下标就可以确定每个方块的绝对下标,左右移动,下落都应该是操作 相对下标。

3、修改方块的坐标获取

4、处理左移和右移

5、处理下落

6、修改生成配置的函数

7、实现旋转函数

       分步视频:https://t.zsxq.com/11GXvlJYx


第27步、方块消除

1、记录闪烁状态和次数

        消除的时候,需要让方块进行闪烁,所以给每个 block 增加一个闪烁状态,记录闪烁的次数。

2、实现闪烁接口

       实现一个开始闪烁的接口,并且在 update 的时候更新闪烁次数。

3、执行更新函数

       在 blockGroup 中遍历所有的方块,执行 update 函数。

4、执行渲染函数

       并且在 block 的渲染函数中,判断如果是闪烁状态,并且闪烁次数为奇数,则不进行绘制,这样就能看到 bilibili 的效果啦。

5、实现消除的逻辑

        然后实现一个执行消除的逻辑,传参是第 row 行,将第 row 行的所有方块,映射到哈希表中,如果发现某个方块的下标在哈希表中,则执行闪烁效果。

       分步视频:https://t.zsxq.com/11SbjBs4y

第28步、结束消除

       分步视频:https://t.zsxq.com/11W2NnE0x



第29步、失败判定

       分步视频:https://t.zsxq.com/11X8za27U


第30步、计分规则

       分步视频:https://t.zsxq.com/11mPFbLEh


第31步、下个方块

       分步视频:https://t.zsxq.com/11UW7VWpz


      英雄算法联盟免费体验券,免费扫码,可查看分步视频:




31步学会写《俄罗斯方块》的评论 (共 条)

分享到微博请遵守国家法律