张平华+贾万祥+张进+程晓蕾
摘要:当前多数人都喜欢一些益智类的游戏,其关键是图形的随机性,图形的旋转与消除。通过深入研究与分析游戏中的关键技术,文中采用JAVA SWING 作为界面的GUI框架,利用JAVA语言,对方块游戏中的关键技术算法进行研究并给出了部分实现算法,研究了随机数据、坐标确定等数学算法的应用,并为后续的相关方面的研究提供了参考。
关键词:Swing;方块游戏;算法;形状
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2015)026-0100-03
1 概述
益智游戏是目前最大的游戏市场,无论是计算机平台还是移动平台,都占有游戏的很大份额。然而能够在跨平台中实现程序设计的当属JAVA。本文采用JAVA的Swing技术作为研究基础,利用JAVA进行算法的验证与实现。
2 Java Swing简介
Swing 是Java平台的UI(用户界面)的开发工具,游戏中采用JAVA SWING 作为界面的GUI框架。[1,2]Swing 以抽象窗口工具包(AWT)为基础扩展了图形化界面的外观风格;Swing 具丰富、灵活的模块化组件,无需复杂的编码就可以创建多功能的、优雅的用户界面。
3 方块的生成与移动算法描述
方块游戏采用的是画方块与坐标的方式,方块有7 种不同的方块形状,分别可以用I、T、L、J、Z、S、O这7个不同的字母来表示。而每种形状方块在程序中用一个唯一的坐标表示。为了便于在屏幕上准确而又活动地定位这些方块,在这里每一个方块都由两个一维数组(X,Y)来表示,X表示方块所在行,Y表示方块所在列。相关方块形状及坐标表示如下图1所示:
图1 方块形状及坐标表示
3.1 游戏方块的随机生成
以上七种不同的形状的方块可以采用随机算法来随机生成。在JAVA中使用java.util.Random类,定义一个随机类Random的对象R,然后再调用nextInt(N)方法生成一个大于等于0小于N(N=7)的随机数,每一个随机数代表一个case,分别表示7种不同学形状的游戏方块,即所生成的随机游戏对象,分别用I、T、L、J、Z、S、O表示,如下图2所示。关键代码如下:
Random R = new Random ();
int M = R.nextInt(7) +1;
3.2 游戏方块的移动算法描述
经过分析这七种不同形状的方块,在游戏变形时都会有四种不同的状态,在设计时可以用一个基点来表示方块在游戏区域中的位置。这个基点就是方块的左上角所在位置,基点的坐标加载方块时被加载,当对方块实现移动或变形时,基点也会随着变化。在图形坐标装载完后,必须先判断在当前方块的下一行是否已经存在游戏完成后的方块,如果没有则保存当前方块的坐标(目的是为了方块在向下移动时,原来的位置不能出现移动前的方块),当消除当前位置的方块后立即在下一行显示方块。
图2 方块实现功能图
4 方块游戏关键算法描述
4.1 方块旋转流程
方块游戏最关键技术的就是方块的变形、移动和消行。方块在游戏界面能否变形、移动主要两种情况,一种是判断是否到达边界;一种是判断下一行是否有方块或重合。为了判断方块能否旋转,在程序中可以定义一个Tetris类,Tetris类中一个是右旋转方法rotateRight(),一个是左旋转方法rotateLeft()。在进行旋转操作时首先调用rotateRight()方法,并判断是否到达边界或重合。如果方块到达边界,则调用rotateLeft()方法,方块回到原来位置,并继续下降。在调用rotateRight()和rotateLeft()时,要用到states数组来表示方块的坐标,并用格子类提供的set()方法改变方块所在的格子的坐标。
图3 方块旋转流程图
4.2 实现判断左右移动按键
//按键判断 以按下左移按键为例
Private void softDropAction(){
tetromino.moveLeft();
if(OutOfBounds()||Coincide(){ //判断是否重合或越界
tetromino.moveRight();
}
}
4.3 关键实现代码
游戏中采用定时器Tim来控制方块的下落间隔,同时定时器也是与关卡数的増加有关,游戏关卡数越高则速度越快(间隔时间越短)。当定时器开始计时时,游戏也就开始了,即出现随机的方块开始下落,当游戏暂停时直接调用Timer中的暂停方法。当在定时器调用的是下落方法时,游戏可以判断方块能否下落,能否消除行等。当方块自由下落时,只是改变了方块在场景中的坐标,并进行重画repaint()。
4.3.1 实现定时器
//定时器
TimerTask task =new TimerTashk(){
@Override
Public void run(){
softDropAction();//自动下落
repaint();
}
};
timer =new Timer();
timer.schedule(task,jiang,jiang);
4.3.2 实现自动下落
Private void softDropAction(){
if (canDrop()){
tetromino.softDrop();
}
else{
landToWall();//落到底部
destoryLines();//消除行
checkGameOver();//判断游戏是否结束
tetromino=nextOne;//出现下一个方块
nextOne=tetromino.RandomOne();
}
}
4.3.3 消行判断
对于一行是否符合消除要求,主是对每个小方块所在行个数进行统计,并利用循环语句从当前场景的最底行依次向上对有方块的每一行进行判断是否满行?如果有一行是空行,则表明已经到达最顶行,查找终止;如果不是空行,则判断是否满行?如果不是满行,则继续检查上一行,如果行满,则统计有几行是连续满行,并消除相应的满行,上面所有行下落;最后再继续判断行的情况。具体消行算法实现如下:
//消行
private void destoryLines(){
int lines=0;
for(int row =0 ; row if (fullCells(row)){ deleteLine(row); lines++; } } this.lines=lines; this.score+=scoreTable[lines]; if(jiang!=100){ if(this.score>=scoreif[scores]){ jiang-=100; grade+=1; scores+=1; timer.cancel(); TimerTask task=new TimerTask(){ @Override Public void run(){ softDropAction();//自动下落 repaint(); } }; timer =new Timer(); timer.schedule(task,jiang,jiang); } } } 4 总结 Swing技术是作为界面的GUI框架开发最好的一种方案,它还有很多的监听器,对于方块的移动,文中采用了KeyListener监听器来处理按键事件。方块游戏的设计关键思路是如何将一个具体的图形处理问题转化为数学问题来处理。对于方块坐标的判断,主要是在程序中调用相应的方法和坐标数组即可。 参考文献: [1] 矫捷.基于JAVA SWING的办公自动化系统设计与实现[D].长春:吉林大学,2014. [2] 孙旗.基于Swing的居民健康档案管理系统的设计与实现[D].成都:电子科技大学,2012. [3] 袁秀莲.基于ARM平台的俄罗斯方块的设计与实现[J].河南机电高等专科学校学报,2010(9). [4] 高凌琴,陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化,2008(2):69-71. [5] 尹友明.JAVA语言与JAVA技术概述[J].中国新技术新产品, 2011(6): 99-99. [6] 兰红,王建雄,黄云.基于Java Swing 的《中国象棋》游戏的设计与实现[J].电脑开发与应用,2006(11). [7] 苏碧霞.探析JAVA Swing工具包在图形用户界面设计中的应用[J].信息与电脑: 理论版, 2013(5). [8] 杨桦,周春容.俄罗斯方块游戏中关键算法的分析与实现[J].电脑编程技巧与维护,2013(6).