Java开发学习之用Java打造一款对对碰游戏(下篇)
小职 2021-01-13 来源 :Java进阶学习交流 阅读 1266 评论 0

摘要:本文主要向大家介绍了Java开发学习之用Java打造一款对对碰游戏,通过具体的内容向大家展现,希望对大家Java开发的学习有所帮助。

本文主要向大家介绍了Java开发学习之用Java打造一款对对碰游戏,通过具体的内容向大家展现,希望对大家Java开发的学习有所帮助。

Java开发学习之用Java打造一款对对碰游戏(下篇)

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

 

项目实施

 

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

 

效果图如下所示:

 Java开发学习之用Java打造一款对对碰游戏(下篇)

 

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

 

(一)添加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;

                }

            }

        }

}

}

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

 Java开发学习之用Java打造一款对对碰游戏(下篇)

 

五、总结

 

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

 

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

 

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



关注“职坐标在线”(Zhizuobiao_Online)公众号,免费获取学习教程资料、技术就业咨询

Java开发学习之用Java打造一款对对碰游戏(下篇)

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved