文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 13:39

关注

项目实施

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

效果图如下所示:


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

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

代码如下所示:

  1. private MyListener my = new MyListener(); 
  2.  
  3.  private Timer timer; 
  4.  
  5.  private int score=0;//总分 
  6.  
  7.  private int jindu=0; 
  8.  
  9.  
  10.  private int x1,y1;//第一次点击按钮的坐标位置 
  11.  
  12.  private int x2,y2;//第二次点击按钮的坐标位置 
  13.  
  14.  private final int EMPTY=-1;//为空的标记 
  15.  
  16.  private boolean isDoubleClicked=false;//是否点击两次 

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

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

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

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

代码如下所示:

  1. private  class MyListener implements ActionListener{ 
  2.     @Override 
  3.     public void actionPerformed(ActionEvent e) { 
  4.         // TODO Auto-generated method stub 
  5.         if(e.getSource()==btn_start){//开始游戏 
  6.             btn_start.setEnabled(false); 
  7.             timer.start(); 
  8.             jindu=0; 
  9.             progress.setValue(jindu); 
  10.             score=0; 
  11.             text_score.setText(""+score); 
  12.             for(int i=0;i<8;i++){ 
  13.                 for(int j=0;j<8;j++){ 
  14.                     button[i][j].setEnabled(true); 
  15.                 } 
  16.             } 
  17.             do{initAllAnimals();//初始化动物矩阵 
  18.             }while(searchAllAnimals(1));//searchAllAnimals  1为查询连接  2为去除连接 
  19.     } 
  20.         if(e.getSource()==btn_exit){//退出按钮 
  21.             timer.stop(); 
  22.             for(int i=0;i<8;i++){ 
  23.                 for(int j=0;j<8;j++){ 
  24.                     button[i][j].setEnabled(false); 
  25.                 } 
  26.             } 
  27.             dispose(); 
  28.         } 
  29.         for(int i=0;i<8;i++){ 
  30.             for(int j=0;j<8;j++){ 
  31.                 if(e.getSource()==button[i][j]){//动物按钮 
  32.                     System.out.println((i+1)+"行"+(j+1)+"列"); 
  33.                     swapAnimal(i,j);//实现交换图片 
  34.  
  35.                 } 
  36.             } 
  37.         } 
  38.     } 

(四)添加计时器

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

代码如下所示:

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

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

代码如下所示:

  1. private class TimerListener implements ActionListener{ 
  2.     @Override 
  3.     public void actionPerformed(ActionEvent e) { 
  4.         // TODO Auto-generated method stub 
  5.         jindu++; 
  6.         progress.setValue(jindu); 
  7.         if(jindu==100){ 
  8.             timer.stop(); 
  9.             for(int i=0;i<8;i++){ 
  10.                 for(int j=0;j<8;j++){ 
  11.                     button[i][j].setEnabled(false); 
  12.                 } 
  13.             } 
  14.             btn_start.setEnabled(true); 
  15.         } 

(五)初始化动物矩阵

代码如下所示:

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

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

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

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

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

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

代码如下所示:

  1. public boolean searchAllAnimals(int flag){ 
  2.  
  3. //1为查询连接 2为去除连接 
  4.     for(int i=0;i<8;i++){ 
  5.           for(int j=0;j<8;j++){ 
  6.              if(flag==1){ 
  7.                  if(isThreeLinked(i,j)){//查询是否有三个或以上连接 
  8.                      return true
  9.                 } 
  10.               }else if(flag==2){ 
  11.                    removeThreeLined(i,j); 
  12.               } 
  13.           } 
  14.       } 
  15.      return false

(九)动物往下移动

代码如下所示:

  1. public void downAnimal(){//动物往下移动 
  2.     int temp
  3.     for(int y=7;y>=0;y--){ 
  4.         for(int x=0;x<8;x++){ 
  5.             if(animal[y][x]==EMPTY){ 
  6.                 //找到一个空的位置 
  7.                 for(int k=y-1;k>=0;k--){ 
  8.                     if(animal[k][x]!=EMPTY){//找到上面一个非空的 
  9.                         temp=animal[k][x]; 
  10.                         animal[k][x]=animal[y][x]; 
  11.                         animal[y][x]=temp
  12.                         break; 
  13.                     } 
  14.                 } 
  15.             } 
  16.         } 

(十)重新显示所有图形

代码如下所示:

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

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

代码如下所示:

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

(十二)交换位置

代码如下所示

  1. public void swapAnimal(int y,int x){//y为行,x为列 
  2.     if((x>=0 && x<8)&&(y>=0 && y<8)){ 
  3.         if(!isDoubleClicked){ 
  4.             //第一次单击 
  5.             x1=x; 
  6.             y1=y; 
  7.             isDoubleClicked=true
  8.             System.out.println("第一次单击的坐标=("+(y1+1)+","+(x1+1)+")"); 
  9.         }else
  10.             x2=x; 
  11.             y2=y; 
  12.             isDoubleClicked=false
  13.             System.out.println("第一次单击的坐标=("+(y2+1)+","+(x2+1)+")"); 
  14.  
  15.             if((Math.abs(x2-x1)==1 &&(y1==y2)) 
  16.                     ||(x1==x2)&&(Math.abs(y2-y1)==1)){//相邻两个按钮 
  17.                 int temp
  18.                 temp=animal[y2][x2];//交换 
  19.                 animal[y2][x2]=animal[y1][x1]; 
  20.                 animal[y1][x1]=temp
  21.  
  22.                 if(isThreeLinked(y1,x1)|| isThreeLinked(y2,x2)){//有三个或以上连接 
  23.                     if(isThreeLinked(y1,x1)){ 
  24.                         removeThreeLined(y1,x1); 
  25.                     } 
  26.                     if(isThreeLinked(y2,x2)){ 
  27.                         removeThreeLined(y2,x2); 
  28.                     } 
  29.                     downAnimal();//动物往下移动 
  30.                     updateAnimal();//为空的重新生成随机图形 
  31.                     showAllAnimals();//重新显示所有图形 
  32.                     while(searchAllAnimals(1)){ 
  33.                         searchAllAnimals(2);//去除连接 
  34.                         downAnimal(); 
  35.                         updateAnimal(); 
  36.                         showAllAnimals(); 
  37.                     } 
  38.                 }else{//没有三个相邻的 
  39.                     temp=animal[y2][x2];//交换 
  40.                     animal[y2][x2]=animal[y1][x1]; 
  41.                     animal[y1][x1]=temp
  42.                 } 
  43.             } 
  44.         } 

完成事件处理效果图如下图所示:


五、总结

本文主要介绍了JLabel、JButton、JPanel、ImageIcon、JTextField、JProgressBar、Timer等组件的基本使用,以及相应的事件处理。

讲解事件处理函数的添加,难点是运用理解构造函数、内部类的创建。完成事件处理开始游戏按钮,退出功能、实现进度条计时、初始化动物矩阵、在水平方向或垂直方向是否有三个或三个以上的相同连接图形在、动物往下移、重新显示所有图形、为空的重新生成随机图形,最后交换位置。

这些代码看起来比较复杂,但其实不是很难,写的事件处理比较多,希望通过这个对对碰的一个小游戏对你有所帮助!

 

来源: Java进阶学习交流内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯