实战俄罗斯方块游戏(开发思路)快速上手

964 阅读4分钟

本文主要介绍俄罗斯方块的快速上手的开发思路,不同开发编程语言可以据此了解俄罗斯方块游戏逻辑。

开发背景

正在学习Jetpack Compose,这是第二个应用。

第一个应用是Compose+无障碍开发的某信真实好友检测APP,文章请查看:Jetpack Compose+无障碍开发的某信真实好友检测APP过程分享

这个应用一开始是想参加掘金官方的活动:游戏创意投稿大赛,解析技术拿大奖,内附选题参考!

1652365102(1).jpg

不过参与时间比较晚,在活动截止时间的最后两三天才开发,4月23、24日又是周末,想来大家都在家休息了,文章阅读量也上不去,就没写文章( ̄▽ ̄)"。但是既然开发都开发了,还是分享一下吧^_^

应用效果

界面是简单了点,不过功能也基本全了:7种砖块及旋转、游戏重置、砖块左右向下移动及垂直落下、得分计算。

应用效果.gif

游戏元素与玩法

游戏元素

元素就是两种:1. 棋盘,2. 砖块(7种)

棋盘砖块
棋盘砖块

游戏玩法

随机生成砖块落下,可通过按键控制砖块的旋转及左右移动或者是使砖块快速落下,砖块接触棋盘底部或者其他砖块时停止,当棋盘上有完整的一行砖块时,则需要消除这一行,并得分。砖块无法落下时则游戏结束。

数据结构设计

1.棋盘

就是N*M的二维数组,常见的取值有10*20。数组值取0/1或false/true,0/false是默认值,1/true表示有砖块

2.砖块

7种基础砖块形状 砖块的定义与旋转是游戏的难点。先看一下掘友们的定义:

定义方式也是多种多样,各不相同。 大致分两种:
一种是用数组直接将方块表示出来,如方块一字型方块,表示为[1,1,1,1], 另外一种是以点的形式表示,一个砖块由多个点(x,y)组成。那怎样去选择适合自己的定义方式呢?

将问题简化:只考虑一个 一个方块方块的情况!

这时问题就比较简单了:棋盘用数组Board[N][M]表示,方块用点(x,y)来表示。左移右移就是x-1和x+1,下落为y+1。方块触底或落在已有的方块上时直接把位置(x,y)设置到Board数组即可,如Board[x][y]=true。方块是否能往下一个区域移动,只需判断下一个区域的Board值是否为false,是的话可以移动,不是,说明有方块,不能移动。

直接上手开发

简化版俄罗斯方块:

6v7h8-qprkp.gif

游戏已经完成一大半了,只需要把7种砖块与其旋转补充上就能完成游戏的开发。

继续砖块的定义:

我们已经基于点的形式定义砖块,在此基础上进行扩展。上文一个方块一个方块用的是(x,y)表示,那么一字型砖块 一字型方块则可以用 [ (x,y),(x+1,y),(x+2,y),(x+3,y) ] 表示。但此时砖块没有独立出来,将砖块在棋盘中的位置用另外的点offset(x,y)表示,砖块则可以写成[(0,0),(1,0),(2,0),(3,0)],也可以写成 [(-1,0),(0,0),(1,0),(2,0)]、[(-2,0),(-1,0),(0,0),(1,0)] 等等,根据原点的位置而变化。砖块在棋盘中的实际位置只需要用offset(x,y)+上每一个点的坐标即可。

一字型方块点表示方法图片对应写法为:[(-2,0),(-1,0),(0,0),(1,0)]

那砖块的旋转(Rotation)其实就是绕原点的旋转。点(0,1)绕原点(0,0)每次顺时针旋转90°的路径如下:

点绕原点旋转

分析后得到原点顺时针旋转90°的坐标变化逻辑为:(x,y)=>(y,-x)。依次对砖块里每一个点进行绕原点操作,也就是一次砖块的旋转变换了。

一字型砖块[(-2,0),(-1,0),(0,0),(1,0)],顺时针旋转一次变为[(0,2),(0,1),(0,0),(0,-1)]

不同形状的砖块原点选择如下:
原点选择
选择好原点后,可以定义出不同形状的砖块。 对于砖块1652607260(1).jpg的原点,可随意选择,旋转时判断一下,不对其进行旋转操作。

至此再在简化版的俄罗斯方块上进行改动,一个完整的俄罗斯方块就能开发出来了

总结

俄罗斯方块是一代经典游戏,本文通过由简至难的方式,介绍了砖块的定义、旋转及游戏开发

首次开发,代码不免相形见拙,如果你也在使用Compose开发,可参考下列文章源码:

爷童回!Compose + MVI 打造经典版的俄罗斯方块 - 掘金 (juejin.cn)