張平華+賈萬祥+張進(jìn)+程曉蕾
摘要:當(dāng)前多數(shù)人都喜歡一些益智類的游戲,其關(guān)鍵是圖形的隨機(jī)性,圖形的旋轉(zhuǎn)與消除。通過深入研究與分析游戲中的關(guān)鍵技術(shù),文中采用JAVA SWING 作為界面的GUI框架,利用JAVA語言,對(duì)方塊游戲中的關(guān)鍵技術(shù)算法進(jìn)行研究并給出了部分實(shí)現(xiàn)算法,研究了隨機(jī)數(shù)據(jù)、坐標(biāo)確定等數(shù)學(xué)算法的應(yīng)用,并為后續(xù)的相關(guān)方面的研究提供了參考。
關(guān)鍵詞:Swing;方塊游戲;算法;形狀
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)026-0100-03
1 概述
益智游戲是目前最大的游戲市場,無論是計(jì)算機(jī)平臺(tái)還是移動(dòng)平臺(tái),都占有游戲的很大份額。然而能夠在跨平臺(tái)中實(shí)現(xiàn)程序設(shè)計(jì)的當(dāng)屬JAVA。本文采用JAVA的Swing技術(shù)作為研究基礎(chǔ),利用JAVA進(jìn)行算法的驗(yàn)證與實(shí)現(xiàn)。
2 Java Swing簡介
Swing 是Java平臺(tái)的UI(用戶界面)的開發(fā)工具,游戲中采用JAVA SWING 作為界面的GUI框架。[1,2]Swing 以抽象窗口工具包(AWT)為基礎(chǔ)擴(kuò)展了圖形化界面的外觀風(fēng)格;Swing 具豐富、靈活的模塊化組件,無需復(fù)雜的編碼就可以創(chuàng)建多功能的、優(yōu)雅的用戶界面。
3 方塊的生成與移動(dòng)算法描述
方塊游戲采用的是畫方塊與坐標(biāo)的方式,方塊有7 種不同的方塊形狀,分別可以用I、T、L、J、Z、S、O這7個(gè)不同的字母來表示。而每種形狀方塊在程序中用一個(gè)唯一的坐標(biāo)表示。為了便于在屏幕上準(zhǔn)確而又活動(dòng)地定位這些方塊,在這里每一個(gè)方塊都由兩個(gè)一維數(shù)組(X,Y)來表示,X表示方塊所在行,Y表示方塊所在列。相關(guān)方塊形狀及坐標(biāo)表示如下圖1所示:
圖1 方塊形狀及坐標(biāo)表示
3.1 游戲方塊的隨機(jī)生成
以上七種不同的形狀的方塊可以采用隨機(jī)算法來隨機(jī)生成。在JAVA中使用java.util.Random類,定義一個(gè)隨機(jī)類Random的對(duì)象R,然后再調(diào)用nextInt(N)方法生成一個(gè)大于等于0小于N(N=7)的隨機(jī)數(shù),每一個(gè)隨機(jī)數(shù)代表一個(gè)case,分別表示7種不同學(xué)形狀的游戲方塊,即所生成的隨機(jī)游戲?qū)ο?,分別用I、T、L、J、Z、S、O表示,如下圖2所示。關(guān)鍵代碼如下:
Random R = new Random ();
int M = R.nextInt(7) +1;
3.2 游戲方塊的移動(dòng)算法描述
經(jīng)過分析這七種不同形狀的方塊,在游戲變形時(shí)都會(huì)有四種不同的狀態(tài),在設(shè)計(jì)時(shí)可以用一個(gè)基點(diǎn)來表示方塊在游戲區(qū)域中的位置。這個(gè)基點(diǎn)就是方塊的左上角所在位置,基點(diǎn)的坐標(biāo)加載方塊時(shí)被加載,當(dāng)對(duì)方塊實(shí)現(xiàn)移動(dòng)或變形時(shí),基點(diǎn)也會(huì)隨著變化。在圖形坐標(biāo)裝載完后,必須先判斷在當(dāng)前方塊的下一行是否已經(jīng)存在游戲完成后的方塊,如果沒有則保存當(dāng)前方塊的坐標(biāo)(目的是為了方塊在向下移動(dòng)時(shí),原來的位置不能出現(xiàn)移動(dòng)前的方塊),當(dāng)消除當(dāng)前位置的方塊后立即在下一行顯示方塊。
圖2 方塊實(shí)現(xiàn)功能圖
4 方塊游戲關(guān)鍵算法描述
4.1 方塊旋轉(zhuǎn)流程
方塊游戲最關(guān)鍵技術(shù)的就是方塊的變形、移動(dòng)和消行。方塊在游戲界面能否變形、移動(dòng)主要兩種情況,一種是判斷是否到達(dá)邊界;一種是判斷下一行是否有方塊或重合。為了判斷方塊能否旋轉(zhuǎn),在程序中可以定義一個(gè)Tetris類,Tetris類中一個(gè)是右旋轉(zhuǎn)方法rotateRight(),一個(gè)是左旋轉(zhuǎn)方法rotateLeft()。在進(jìn)行旋轉(zhuǎn)操作時(shí)首先調(diào)用rotateRight()方法,并判斷是否到達(dá)邊界或重合。如果方塊到達(dá)邊界,則調(diào)用rotateLeft()方法,方塊回到原來位置,并繼續(xù)下降。在調(diào)用rotateRight()和rotateLeft()時(shí),要用到states數(shù)組來表示方塊的坐標(biāo),并用格子類提供的set()方法改變方塊所在的格子的坐標(biāo)。
圖3 方塊旋轉(zhuǎn)流程圖
4.2 實(shí)現(xiàn)判斷左右移動(dòng)按鍵
//按鍵判斷 以按下左移按鍵為例
Private void softDropAction(){
tetromino.moveLeft();
if(OutOfBounds()||Coincide(){ //判斷是否重合或越界
tetromino.moveRight();
}
}
4.3 關(guān)鍵實(shí)現(xiàn)代碼
游戲中采用定時(shí)器Tim來控制方塊的下落間隔,同時(shí)定時(shí)器也是與關(guān)卡數(shù)的増加有關(guān),游戲關(guān)卡數(shù)越高則速度越快(間隔時(shí)間越短)。當(dāng)定時(shí)器開始計(jì)時(shí)時(shí),游戲也就開始了,即出現(xiàn)隨機(jī)的方塊開始下落,當(dāng)游戲暫停時(shí)直接調(diào)用Timer中的暫停方法。當(dāng)在定時(shí)器調(diào)用的是下落方法時(shí),游戲可以判斷方塊能否下落,能否消除行等。當(dāng)方塊自由下落時(shí),只是改變了方塊在場景中的坐標(biāo),并進(jìn)行重畫repaint()。
4.3.1 實(shí)現(xiàn)定時(shí)器
//定時(shí)器
TimerTask task =new TimerTashk(){
@Override
Public void run(){
softDropAction();//自動(dòng)下落
repaint();
}
};
timer =new Timer();
timer.schedule(task,jiang,jiang);
4.3.2 實(shí)現(xiàn)自動(dòng)下落
Private void softDropAction(){
if (canDrop()){
tetromino.softDrop();
}
else{
landToWall();//落到底部
destoryLines();//消除行
checkGameOver();//判斷游戲是否結(jié)束
tetromino=nextOne;//出現(xiàn)下一個(gè)方塊
nextOne=tetromino.RandomOne();
}
}
4.3.3 消行判斷
對(duì)于一行是否符合消除要求,主是對(duì)每個(gè)小方塊所在行個(gè)數(shù)進(jìn)行統(tǒng)計(jì),并利用循環(huán)語句從當(dāng)前場景的最底行依次向上對(duì)有方塊的每一行進(jìn)行判斷是否滿行?如果有一行是空行,則表明已經(jīng)到達(dá)最頂行,查找終止;如果不是空行,則判斷是否滿行?如果不是滿行,則繼續(xù)檢查上一行,如果行滿,則統(tǒng)計(jì)有幾行是連續(xù)滿行,并消除相應(yīng)的滿行,上面所有行下落;最后再繼續(xù)判斷行的情況。具體消行算法實(shí)現(xiàn)如下:
//消行
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();//自動(dòng)下落 repaint(); } }; timer =new Timer(); timer.schedule(task,jiang,jiang); } } } 4 總結(jié) Swing技術(shù)是作為界面的GUI框架開發(fā)最好的一種方案,它還有很多的監(jiān)聽器,對(duì)于方塊的移動(dòng),文中采用了KeyListener監(jiān)聽器來處理按鍵事件。方塊游戲的設(shè)計(jì)關(guān)鍵思路是如何將一個(gè)具體的圖形處理問題轉(zhuǎn)化為數(shù)學(xué)問題來處理。對(duì)于方塊坐標(biāo)的判斷,主要是在程序中調(diào)用相應(yīng)的方法和坐標(biāo)數(shù)組即可。 參考文獻(xiàn): [1] 矯捷.基于JAVA SWING的辦公自動(dòng)化系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].長春:吉林大學(xué),2014. [2] 孫旗.基于Swing的居民健康檔案管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2012. [3] 袁秀蓮.基于ARM平臺(tái)的俄羅斯方塊的設(shè)計(jì)與實(shí)現(xiàn)[J].河南機(jī)電高等專科學(xué)校學(xué)報(bào),2010(9). [4] 高凌琴,陳青華.俄羅斯方塊游戲關(guān)鍵技術(shù)探討[J].信息技術(shù)與信息化,2008(2):69-71. [5] 尹友明.JAVA語言與JAVA技術(shù)概述[J].中國新技術(shù)新產(chǎn)品, 2011(6): 99-99. [6] 蘭紅,王建雄,黃云.基于Java Swing 的《中國象棋》游戲的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦開發(fā)與應(yīng)用,2006(11). [7] 蘇碧霞.探析JAVA Swing工具包在圖形用戶界面設(shè)計(jì)中的應(yīng)用[J].信息與電腦: 理論版, 2013(5). [8] 楊樺,周春容.俄羅斯方塊游戲中關(guān)鍵算法的分析與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2013(6).