当前位置:首页 > 应用开发

手把手带你用Java打造一款对对碰游戏(下篇)

上篇文章介绍了对对碰游戏的手把手带理论部分和介绍了JLabel、JButton、打对对JPanel、造款ImageIcon、碰游篇JTextField、戏下JProgressBar等组件的手把手带基本使用,介绍了进度条(JProgressBar)常用的打对对方法。今天小编继续带来进行具体的造款对对碰游戏功能实现。

项目实施

在实现对对碰功能之前,碰游篇回顾一下上一节我们主要完成了开始游戏按钮、戏下分数、手把手带时间进度条、打对对退出游戏按钮,造款8X8的碰游篇动物矩阵的界面设计;

效果图如下所示:

接下来,小编继续带大家完成游戏功能,戏下实现游戏功能需要了解什么是交换、消去、连锁,在游戏项目设定那里有,在这就不重复写了。

(一)添加DuiDuiPeng类的成员变量:定义一些变量

代码如下所示:

private MyListener my = new MyListener();  private Timer timer;  private int score=0;//总分  private int jindu=0;  private int x1,y1;//第一次点击按钮的坐标位置  private int x2,y2;//第二次点击按钮的坐标位置  private final int EMPTY=-1;//为空的标记  private boolean isDoubleClicked=false;//是否点击两次 

(二)在DuiDuiPeng构造函数里给指定组件添加监听

btn_start.addActionListener(my);//开始游戏 btn_exit.addActionListener(my);//退出 

(三)实现事件处理的函数体

当点击开始按钮时候,源码下载计时器启动,设置进度条,8X8动物矩阵可以互换位置,当点击退出按钮,计时器停止,8X8动物矩阵不可以互换位置。

代码如下所示:

private  class MyListener implements ActionListener{      @Override     public void actionPerformed(ActionEvent e) {          // TODO Auto-generated method stub         if(e.getSource()==btn_start){ //开始游戏             btn_start.setEnabled(false);             timer.start();             jindu=0;             progress.setValue(jindu);             score=0;             text_score.setText(""+score);             for(int i=0;i<8;i++){                  for(int j=0;j<8;j++){                      button[i][j].setEnabled(true);                 }             }             do{ initAllAnimals();//初始化动物矩阵             }while(searchAllAnimals(1));//searchAllAnimals  1为查询连接  2为去除连接     }         if(e.getSource()==btn_exit){ //退出按钮             timer.stop();             for(int i=0;i<8;i++){                  for(int j=0;j<8;j++){                      button[i][j].setEnabled(false);                 }             }             dispose();         }         for(int i=0;i<8;i++){              for(int j=0;j<8;j++){                  if(e.getSource()==button[i][j]){ //动物按钮                     System.out.println((i+1)+"行"+(j+1)+"列");                     swapAnimal(i,j);//实现交换图片                 }             }         }     } } 

(四)添加计时器

1.在DuiDuiPeng构造函数里添加计时器;

代码如下所示:

timer=new Timer(1000,new TimerListener()); 

2.进度条的值从0开始每秒加一,直到进度条的值达到100,计时器停止,不能位置交换动物头像,进度条开始加的时候,开始按钮是不能点击的,当进度条达到100的时候,我们设置开始按钮可以点击状态。

代码如下所示:

private class TimerListener implements ActionListener{      @Override     public void actionPerformed(ActionEvent e) {          // TODO Auto-generated method stub         jindu++;         progress.setValue(jindu);         if(jindu==100){              timer.stop();             for(int i=0;i<8;i++){                  for(int j=0;j<8;j++){                      button[i][j].setEnabled(false);                 }             }             btn_start.setEnabled(true);         } } } 

(五)初始化动物矩阵

代码如下所示:

public void initAllAnimals(){ //初始化动物矩阵     for(int i=0;i<8;i++){          for(int j=0;j<8;j++){              int temp=(int)(Math.random()*7);//0-6             button[i][j].setIcon(icon[temp]);             animal[i][j]=temp;         } } } 

(六)查询是否有三个或以上相同连接的图形,是返回true,不是返回false,判断水平方向上是否有三个或以上相同连接的图形,判断垂直方向上是否有三个或以上相同连接的图形

代码较多,在此就不一一呈现了,云服务器文末有获取代码的方式。

(七)把三个或以上相同连接图形设为EMPTY,判断水平方向上是否有三个或以上相同连接的图形,把水平方向上有三个或以上相同连接的图形设为EMPTY。判断垂直方向上是否有三个或以上相同连接的图形,把垂直方向上有三个或以上相同连接的图形设为EMPTY。

代码较多,在此就不一一呈现了,文末有获取代码的方式。

(八)查询所有动物头像(1为查询连接 2为去除连接)

代码如下所示:

public boolean searchAllAnimals(int flag){  //1为查询连接 2为去除连接     for(int i=0;i<8;i++){            for(int j=0;j<8;j++){               if(flag==1){                   if(isThreeLinked(i,j)){ //查询是否有三个或以上连接                      return true;                 }               }else if(flag==2){                     removeThreeLined(i,j);               }           }       }      return false; } 

(九)动物往下移动

代码如下所示:

public void downAnimal(){ //动物往下移动     int temp;     for(int y=7;y>=0;y--){          for(int x=0;x<8;x++){              if(animal[y][x]==EMPTY){                  //找到一个空的位置                 for(int k=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;                     }                 }             }         } } } 

(十)重新显示所有图形

代码如下所示:

public void showAllAnimals(){ //重新显示所有图形     for(int i=0;i<8;i++){            for(int j=0;j<8;j++){                button[i][j].setIcon(icon[animal[i][j]]);           }       }   } 

(十一)为空的重新生成随机图形

代码如下所示:

public void updateAnimal(){ //为空的重新生成随机图形     for(int i=0;i<8;i++){          for(int j=0;j<8;j++){              if(animal[i][j]==EMPTY){                  animal[i][j]=(int)(Math.random()*7);             }         } } } 

(十二)交换位置

代码如下所示

public void swapAnimal(int y,int x){ //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)){ //相邻两个按钮                 int temp;                 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.这些代码看起来比较复杂,但其实不是很难,写的事件处理比较多,希望通过这个对对碰的一个小游戏对你有所帮助!

分享到:

滇ICP备2023006006号-16