手把手带你用Java打造一款对对碰游戏(下篇)
后台回复“Java”即可获赠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{
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{
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.这些代码看起来比较复杂,但其实不是很难,写的事件处理比较多,希望通过这个对对碰的一个小游戏对你有所帮助!
4.需要本文代码的小伙伴可以回头回复关键字“对对碰”三个字进行获取,觉得不错,记得给个star噢~
------------------- End -------------------
往期精彩文章推荐:
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行