摘要:基本的规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
《俄罗斯方块》是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏, 基本的规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
我们大多数人应该都玩过这款游戏吧,下面将详细讲解如何用Java实现一个《俄罗斯方块》游戏,实现的最终效果如下图1所示:
图1 俄罗斯方块

游戏的元素
对于《俄罗斯方块》游戏来说,最重要是控制方块的移动和消行。由图1我们可以知道,实现的这个游戏有两个主要元素:
  • 方块(A)
  • 地图(面板,M)

每一个方块都是由四个方格块组成的,按是否可移动划分有两种类型:
  • 一种可以移动的,用A1表示,A1可以被方向键左右下控制在地图中移动,A1总共有七种形状的方块,分别命名为:I、S、Z、J、O、L、T,A1也可以被方向键上控制变换形态;
  • 一种不能移动的,用A2表示,A2只能显示在地图中,多个A2的方格块如果排列成完整的一行或者多行,游戏会消行并且加分;

地图是一个长方形的面板,可划分为以下几个区域:
  • 边框区,固定不变的,图中灰色方格组成的区域;
  • 方块区,4*4方格组成,由方块和空白方格组成;
  • 活动区,移动方块区可以自由移动和变换的区域;
  • 堆积区,移动方块区最终停留的地方,游戏会在该区域消行;

元素的映射
经过上面的分析,我们可以确定的游戏的主要元素以及元素拥有的属性,要用编程实现这个游戏,那么我们还需要把这些元素用编程的语言描述出来,即实体到符号的映射。
我们可以看到图1左边所有的元素都是由一个个方格组成的,如:移动方块由四个方格构成,边框区由灰色的方格构成,堆积区也是方格构成的。这样我们可以认为整个区域或者元素都是由方格构成的,只要我们能够用符号来标识这些方格,那么我们就能够标识游戏中的这些元素。
由于图中的边框区是不变的,我们可以在实现中预先初始化,在此处可以忽略。现在我们对图1中深蓝色的区域方格进行标识,用数字从左到右、从上到下分别标记为0-9、0-19,并且填充方格为0,表示该方格没有元素。若有元素出现在深蓝色区域,我们对元素覆盖的方格填充为1,表示该方格存在元素,如下图2所示:
图2 元素的映射
上图中空白的部分表示地图,填充为0。绿色部分是一个Z的方块,那么Z方块可以描述为:方格(3,3)、方格(4,2)、方格(3,4)、方格(4,3),并且这四个方格填充为1。
假如控制上图Z方块向右移动一格,那么移动后Z方块应该描述为:方格(4,3)、方格(5,2)、方格(4,4)、方格(5,3),并且这四个方格填充为1 ;
假如控制上图Z方块向下移动一格,那么移动后Z方块应该描述为:方格(3,4)、方格(4,3)、方格(3,5)、方格(4,4),并且这四个方格填充为1 ;
可以看出用方格已经可以描述出方块Z的所有位置的信息,这个过程就是如何把一个方块映射到地图的区域。

但是Z方块的其它形态怎么描述呢?
其实每个方块都可以认为有四种形态,每次通过顺时针旋转90度变换成下一种形态,但无论是哪一种形态,方块横向最多只占四个方格,纵向最多也只占四个方格。
那么我们可以用一个4*4方格组成的区域表示所有的方块形态,如图2中红色线条围住的方格,称这个区域叫做方块区
以Z方块为例子,一开始,方块区所有方格填充为0,当Z方块出现时,按从左到右再从上到下的顺序,Z方块覆盖的方格填充为1,那么图2中Z方块可以表示为(0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0)。再把图2中的Z方块顺时针旋转90度后,Z方块可以表示为(1,1,0,0, 0,0,1,1, 0,0,0,0, 0,0,0,0),这个过程就是如何把方格映射为一个方块的形态。

结合上面的两个映射,我们可以这样描述一个Z方块在图2的位置:坐标为(3,2),形态为(0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0)。

游戏的控制
游戏需要产生随机形状的方块,需要控制方块的下落,需要消行得分,需要判断游戏的开始、暂停、结束状态。那么如何实现游戏的这些控制呢?
  • 在游戏开始后,可以启动一个定时器,定时更新方块的下落坐标,即定时给组成方块的方格横坐标加1;
  • 产生方块可以用一些随机数,分别用1-7表示I、S、Z、J、O、L、T方块,然后再通过随机数,用1-4分别表示选中的某种类型的方块的某种形态;
  • 我们可能需要保存地图中有哪些方格被方块覆盖的,然后移动方块的每一个动作后,我们都应该判断堆积区是否有填充为全1的行,如果有就消去,并把上面的方格纵坐标加1,表示向下移动一格;
  • 游戏的开始、暂停、结束可以通过按钮事件来判断,结束的状态还可能由上面的定时器触发。
其实,在这个游戏实现过程中,方块的产生、下落、消行、结束都是离不开定时器,游戏的所有流程控制都是通过定时器来实现的,定时器就是这个游戏的引擎。


游戏的具体实现请参考《俄罗斯方块小游戏的实现(二)》。

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:俄罗斯方块小游戏的Java实现(一)

本文地址:http://www.wolfbe.com/detail/201609/356.html

本文标签: 游戏 java

相关文章

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部