上一篇介绍了连拍游戏的理论部分,介绍了JLabel、JButton、JPanel、ImageIcon、JTextField、JProgressBar等组件的基本使用,介绍进度条(JProgressBar)的常用方法。今天小编继续带来配对游戏功能的具体实现。在项目实施之前,在实现匹配功能之前,回顾一下上一节。我们主要完成了开始游戏按钮、分数、时间进度条、退出游戏按钮、8X8动物矩阵的界面设计;效果图如下:接下来,小编继续带大家了解游戏功能。要实现游戏功能,你需要了解什么是交换、消除和连锁。还有游戏道具设置,这里不再赘述。(1)添加DuiDuiPeng类的成员变量:定义一些变量代码如下:privateMyListenermy=newMyListener();privateTimertimer;privateintscore=0;//总分privateintjindu=0;privateintx1,y1;//点击第一个按钮time坐标位置privateintx2,y2;//第二次按钮点击的坐标位置privatefinalintEMPTY=-1;//空标记privatebooleanisDoubleClicked=false;//是否点击两次(2)在DuiDuiPeng构造函数中对指定组件添加监听btn_start.addActionListener(my);//开始游戏btn_exit.addActionListener(my);//退出(3)事件处理的函数体当点击开始按钮时,开始计时,设置进度条,8X8动物矩阵可以互换位置,当点击退出按钮时,计时停止,8X8动物矩阵不能互换位置。代码如下:privateclassMyListenerimplementsActionListener{@OverridepublicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubif(e.getSource()==btn_start){//开始游戏btn_start.setEnabled(false);timer.start();jindu=0;progress.setValue(jindu);score=0;text_score.setText(""+score);for(inti=0;i<8;i++){for(intj=0;j<8;j++){button[i][j].setEnabled(true);}}do{initAllAnimals();//初始化动物矩阵}while(searchAllAnimals(1));//searchAllAnimals1为查询连接2为移除连接}if(e.getSource()==btn_exit){//退出按钮timer.stop();for(inti=0;i<8;i++){for(intj=0;j<8;j++){button[i][j].setEnabled(false);}}dispose();}for(inti=0;i<8;i++){for(intj=0;j<8;j++){if(e.getSource()==button[i][j]){//AnimalbuttonSystem.out.println((i+1)+"row"+(j+1)+"column");swapAnimal(i,j);//实现交换图片}}}}}(四)添加定时器1.在DuiDuiPeng构造函数中添加一个定时器;代码如下:timer=newTimer(1000,newTimerListener());2、进度条的数值从0开始,每秒递增1,直到进度条的数值达到100,停止计时,不能调换动物头的位置。当进度条开始增加时,开始按钮无法点击。当进度条达到100时,我们将开始按钮设置为可点击。代码如下:privateclassTimerListenerimplementsActionListener{@OverridepublicvoidactionPerformed(ActionEvente){//TODOAuto-generatedmethodstubjindu++;progress.setValue(jindu);if(jindu==100){timer.stop();for(inti=0;i<8;i++){for(intj=0;j<8;j++){button[i][j].setEnabled(false);}}btn_start.setEnabled(true);}}}(5)初始化代码动物矩阵如下显示:publicvoidinitAllAnimals(){//初始化动物矩阵for(inti=0;i<8;i++){for(intj=0;j<8;j++){inttemp=(int)(Math.random()*7);//0-6button[i][j].setIcon(icon[temp]);animal[i][j]=temp;}}}(6)查询是否有三个或三个以上图形同连,是返回true,不返回false,判断水平方向是否有三个或三个以上图形同连,判断是否有三个或三个以上图形同连在垂直方向。代码方式。(7)将三个或三个以上同连图形置为EMPTY,判断水平方向是否有三个或三个以上同连图形,将三个或三个以上同连图形置水平方向为EMPTY。判断垂直方向是否存在3个或3个以上同连图形,将垂直方向3个或3个以上同连图形置为EMPTY。代码很多,这里就不一一介绍了。文末有获取代码的方法。(8)查询所有动物头像(1为查询连接,2为移除连接)代码如下:publicbooleansearchAllAnimals(intflag){//1为查询连接2为移除连接for(inti=0;i<8;i++){for(intj=0;j<8;j++){if(flag==1){if(isThreeLinked(i,j)){//查询是否有三个或三个以上连接返回true;}}elseif(flag==2){removeThreeLined(i,j);}}}returnfalse;}(9)动物向下移动代码如下:publicvoiddownAnimal(){//动物向下移动inttemp;for(inty=7;y>=0;y--){for(intx=0;x<8;x++){if(animal[y][x]==EMPTY){//为(intk=y-1;k>=0;k--){if(animal[k][x]!=EMPTY){//找一个非空的temp=animal[k][x];animal[k][x]=animal[y][x];animal[y][x]=temp;break;}}}}}}(10)重新显示所有图形代码如下:publicvoidshowAllAnimals(){//重新显示所有图形for(inti=0;i<8;i++){for(intj=0;j<8;j++){button[i][j].setIcon(icon[animal[i][j]]);}}}(十一)为空的重新生成随机图形的代码是如下:publicvoidupdateAnimal(){//为空的重新生成随机图形for(inti=0;i<8;i++){for(intj=0;j<8;j++){if(animal[i][j]==EMPTY){animal[i][j]=(int)(Math.random()*7);}}}}(12)兑换位置代码如下publicvoidswapAnimal(inty,intx){//y是行,x是列if((x>=0&&x<8)&&(y>=0&&y<8)){if(!isDoubleClicked){//第一次点击x1=x;y1=y;isDoubleClicked=true;System.out.println("第一次点击的坐标=("+(y1+1)+","+(x1+1)+")");}else{x2=x;y2=y;isDoubleClicked=false;System.out.println("第一次点击的坐标=("+(y2+1)+","+(x2+1)+")");if((Math.abs(x2-x1)==1&&(y1==y2))||(x1==x2)&&(Math.abs(y2-y1)==1)){//两个相邻的按钮inttemp;temp=animal[y2][x2];//交换animal[y2][x2]=animal[y1][x1];animal[y1][x1]=temp;if(isThreeLinked(y1,x1)||isThreeLinked(y2,x2)){//存在三个或更多连接if(isThreeLinked(y1,x1)){removeThreeLined(y1,x1);}if(isThreeLinked(y2,x2)){removeThreeLined(y2,x2);}downAnimal();//动物向下移动updateAnimal();//为空重新生成随机图形showAllAnimals();//重新显示所有图形while(searchAllAnimals(1)){searchAllAnimals(2);//去掉连接downAnimal();updateAnimal();showAllAnimals();}}else{//没有三个相邻的temp=animal[y2][x2];//交换animal[y2][x2]=animal[y1][x1];animal[y1][x1]=temp;}}}}}完成事件处理效果图如下图:五、总结1.本文主要介绍JLabel、JButton、JPanel、ImageIcon、JTextField、JProgressBar、Timer等组件的基本使用,以及对应的事件处理2.解释事件处理函数的增加。难点在于使用和理解构造函数和内部类的创建。完成事件处理并开始游戏按钮,退出函数,实现进度条计时,初始化动物矩阵,水平或垂直方向是否有三个或三个以上相同的相连图形,将动物向下移动,重新显示所有图形,并为空重新生成随机图形,最后交换位置。3.这些代码看起来很复杂,其实并不难。里面写了很多事件处理。希望这个配对小游戏对你有所帮助!
