从零开始月入百万的经典游戏俄罗斯方块开发,没落的手游能变凤凰

从零开始月入百万的经典游戏俄罗斯方块开发,没落的手游能变凤凰

俄罗斯方块1980年末期至1990年代初期风靡全世界的电脑游戏,是落下型益智游戏的始祖。这一款很经典的益智游戏,之前就做了一款桌面版的java俄罗斯方块,这次就尝试着写了一款适用于Android平台的俄罗斯方块。

整个程序设计十分简洁,只是运用了两个类而已,最终做出的效果图如下所示:

首先,要考虑的自然是游戏应该如何布局的问题了。我的想法是将手机屏幕分为上下两部分,上边用来显示游戏者的名称、所得分数以及下一个方块,称为“文字区域”,下边自然就是游戏区域了。

如图所示:

布局文件如下:

为了让游戏能够更好地适配Android众多大小不一的屏幕,需要对布局进行动态规划。在xml文件中,android:padding=”25px”,text1代表的是上方的文字区域,txet1的背景是一张半透明的图片,在运行程序时会根据手机屏幕大小动态规划其高度。text2是文字区域以及游戏区域之间的间距,我将它的高度定为固定值“30px”。而游戏区域的高度亦是会动态规划的,自定义的view将会添加在FrameLayout当中。

自定义的view组件代码如下,用来绘制并显示所有的方块:

当中,map是一个boolean类型的二维数组,因为我将游戏区域的比例设为10乘15,所以map的大小即为map[10][15],map[0][0]即为游戏区域的左上角,map[9][14]为游戏区域的右下角。如果方块落在了某个坐标点,则该坐标值设为true,否则为false。则当方块不断下落时,通过计算方块的新的坐标点并重新构建新的map,即可获得新的view对象。

BRICK_WIDTH为每个方块的宽度,在构造函数中获得。

因此,如果new一个Brick对象,且map的值均设为true,将之添加到FrameLayout当中,即可获得如下效果:

在Activity类中,通过如下代码可获得屏幕信息:

SCREEN_WIDTH 是屏幕宽度,SCREEN_HIGHT 是屏幕高度,则SCREEN_WIDTH 减去两倍PADDING,再除以十后,就可以得到方块的宽度BRICK_WIDTH,而BRICK_WIDTH乘以十五后,即游戏区域的高度了,这样就可以算出文字区域的高度了

下落方法的基本形状有如下6种,每个方块下落时的初始坐标点亦如下所示:

如正方形方块有四个点,坐标分别为(4,0)(5,0)(4,1)(5,1)。用List< Point[] >类型的listPoints来保存坐标集合。注意:每个下落方块的第一个坐标点均是有特殊作用的,这个后边会说到。

在程序中,我的想法是new两个map对象,map1用来保存所有固定不动的方块坐标点,map2用来保存还在下落的方块的坐标点,这样就能够new两个Brick对象,然后通过覆盖的方法来使之同时显示在同个区域内。这也是我将它们添加到FrameLayout布局的原因。

下落方块的移动算法如下,适用于左移还有右移

则要左移和右移时只要分别为move(int moveX, int moveY)函数传入不同参数即可实现对应操作:

变形操作要下落方块有一个固定的旋转点,这个旋转点我设为下落方块的第一个坐标点,这也是我前边所说的第一个坐标点的特殊作用。

消行操作需要在每次下落方块无法再下落时检查是否需要实行,所以检查是从第十五行开始直到第一行:

注意当中的j = j + 1语句,因为当第j行消行后上方区域需要整个“下沉”一行,所以原来的第j-1行就变成了第j行,所以还需要再从现在的第j行检查起,加一的原因是在for循环中j会减一,所以这里先加一。

下移操作是整个程序设计中的难点,在这里面要实现消行检查,map1和map2的数据更新,以便刷新新的界面,这里代码就不再贴出了。

结束导语:我从去年到现在,我根据市场技术栈的最新需求,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以关注我的头条号,并在后台私信我:Java,即可获得Java精讲视频教程。