首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >手把手带你用Java实现点灯游戏(下篇)

手把手带你用Java实现点灯游戏(下篇)

作者头像
Java进阶者
发布2021-01-22 10:36:09
发布2021-01-22 10:36:09
8420
举报

前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)手把手教你用Java打造一款简单故事书(下篇)手把手教你用Java打造一款简单考试系统(上篇)手把手教你用Java打造一款简单考试系统(下篇)手把手带你用Java实现点灯游戏(上篇)手把手带你用Java打造一款对对碰游戏(下篇),今天小编继上篇文章,继续带大家完成这个游戏小项目,本文讲具体的实现。

一、项目目标

设计一款基于JAVA的游戏,显示N*N盏灯,游戏开始时,所有灯是熄灭的,每次点击其中一盏灯,会改变当前灯以及上、下、左、右几盏灯的状态从熄灭到点亮,点亮到熄灭,当所有灯都点亮为游戏结束。

二、项目实施

在实现点灯游戏功能之前,回顾一下上一节我们主要完成了点灯游戏的界面设计;

效果图如下所示:

接下来,小编继续带大家完成游戏功能!

(一)定义事件处理类,实现事件监听器

1.添加事件监听器MyListener(自己命名):

定义变量

代码语言:javascript
复制
private MyListener my = new MyListener();

2.为组件指定事件监听器

代码如下所示:

代码语言:javascript
复制
for(int i=0;i<level;i++){//行
    for(int j=0;j<level;j++){//列
    btn[i][j]=new JButton(icon_state[0]);
    btn[i][j].setBackground(Color.DARK_GRAY);
    panel02.add(btn[i][j]);
    light[i][j]=false;
  
    btn[i][j].addActionListener(my);
    }
    }

for(int i=0;i<str_level.length;i++){
    radio_level[i]=new JRadioButtonMenuItem(str_level[i]);
    group.add(radio_level[i]);
    radio_level[i].setIcon(icon_menu[3]);
    item03.add(radio_level[i]);
  
    radio_level[i].addActionListener(my);
    }

item01.addActionListener(my);
item02.addActionListener(my);
item04.addActionListener(my);
item05.addActionListener(my);

(二)实现事件处理的函数体。判断改变点击灯的上边、下边、左边、右边灯状态,重新开始按钮功能,退出游戏功能,游戏选择级别功能,游戏规则,还有关于游戏的事件处理。

1.定义两个变量一个是已经点击次数,已经点亮的次数

代码语言:javascript
复制
private int click=0;//已经点击次数(已走步数)
private int num=0;//已经点亮灯的次数

2.实现上下左右边灯状态事件处理的函数

代码如下所示:

代码语言:javascript
复制
private class MyListener implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

// 事件处理的代码
}

代码较多,此处不一一堆彻,文末有获取代码详情方式。

3.重新开始事件处理代码如下所示

代码语言:javascript
复制
if(e.getSource()==item01){//重新开始
            initGame();
            for(int i=0;i<level;i++){
                for(int j=0;j<level;j++){
                    btn[i][j].setEnabled(true);
                }
            }
        }

4.退出游戏事件处理代码如下所示

代码语言:javascript
复制
if(e.getSource()==item02){//退出游戏
            dispose();
}

5.游戏级别事件处理(入门、6x6、7x7、8x8)代码如下所示

代码语言:javascript
复制
代码语言:javascript
复制
if(e.getSource()==radio_level[0]){//入门
            beginnerLevel();
            radio_level[0].setSelected(true);
        }
        if(e.getSource()==radio_level[1]){//6*6
            setLevel(6);
            radio_level[1].setSelected(true);
        }
        if(e.getSource()==radio_level[2]){//7*7
            setLevel(7);
            radio_level[2].setSelected(true);
        }
        if(e.getSource()==radio_level[3]){//8*8
            setLevel(8);
            radio_level[3].setSelected(true);
        }

6.游戏规则和关于事件处理代码如下所示

代码语言:javascript
复制
if(e.getSource()==item04){//游戏规则
JOptionPane.showMessageDialog(getContentPane(), "点亮或关掉某一盏灯,会影响该灯及上下左右灯\n的亮灭情况,请尝试点亮所有的灯!", "游戏规则",JOptionPane.INFORMATION_MESSAGE);
}
if(e.getSource()==item05){//关于
JOptionPane.showMessageDialog(getContentPane(),"如有疑问,请查询http//www.baidu.com\n谢谢合作!","关于",JOptionPane.QUESTION_MESSAGE);
}

(三)判断游戏是否结束。设置游戏目前的进度,是否把所有灯全部点亮

代码如下所示:

代码语言:javascript
复制
public void checkFinish(){//判断游戏是否结束
num=0;
for(int i=0;i<level;i++){
        for(int j=0;j<level;j++){
            if(light[i][j]==true){
                num++;
            }
        }
}
label01.setText("目前进度:"+num+"/"+level*level+"。");
progress.setValue(num*100/level/level);
if(num>=level*level){
label01.setText("游戏成功!");
label02.setText("");
for(int i=0;i<level;i++){
        for(int j=0;j<level;j++){
            btn[i][j].setEnabled(false);
        }
    }
  }
}

(四)初始化游戏

代码如下所示:

代码语言:javascript
复制
public void initGame(){//初始化游戏
click=0;
num=0;
for(int i=0;i<level;i++){
        for(int j=0;j<level;j++){
            btn[i][j].setIcon(icon_state[0]);
            light[i][j]=false;
        }
}
label01.setText("目前进度:0/"+level*level+"。");
label02.setText("已走步数:"+click);
progress.setValue(num*100/level/level);
}

(五)入门级别beginnerLevel函数体事件处理

代码如下所示:

代码语言:javascript
复制
public void beginnerLevel(){
    click=0;
    num=level*level-3;
    for(int i=0;i<level;i++){
    for(int j=0;j<level;j++){
            if(i==level-2&&j==0 || i==level-1&&j==0 || i==level-1&&j==1){
                btn[i][j].setIcon(icon_state[0]);
                light[i][j]=false;
            }else{
                btn[i][j].setIcon(icon_state[1]);
                light[i][j]=true;
            }
    }
    }
label01.setText("目前进度:0/"+level*level+"。");
label02.setText("已走步数:"+click);
progress.setValue(num*100/level/level);
}

(六)选择游戏级别6x6、7x7、8x8的窗体大小

代码如下所示:

代码语言:javascript
复制
public void setLevel(int i){//i行数(列数)
level=i;
Point p=this.getLocation();
dispose();
LightGame g=new LightGame();
 g.setTitle("点灯游戏:尝试把所有灯点亮!");
     g.setSize(80*level, 80*level);
     g.setVisible(true);
     g.setResizable(false);
     g.setLocation(p);
}

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

入门级别:只剩左下角三盏灯熄灭,其余通过程序已设置点亮状态,用户只需点击左下角的灯,即可完成游戏。

6x6矩阵

7x7矩阵

8x8矩阵

四、总结

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

2.重点是事件处理函数的添加(判断改变点击灯的上边、下边、左边、右边灯状态,重新开始事件处理,退出游戏事件处理,游戏选择级别事件处理,游戏规则事件处理,还有关于游戏的事件处理),难点是运用理解构造函数、内部类的创建。

3.本文代码相对没那么复杂,希望对你有所帮助!

4.需要本文代码的小伙伴可以回头回复关键字“点灯游戏”四个字进行获取,觉得不错,记得给个star噢~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java进阶学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目目标
  • 二、项目实施
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档