
前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)、手把手教你用Java打造一款简单故事书(下篇)、手把手教你用Java打造一款简单考试系统(上篇)、手把手教你用Java打造一款简单考试系统(下篇)、手把手带你用Java实现点灯游戏(上篇)、手把手带你用Java打造一款对对碰游戏(下篇),今天小编继上篇文章,继续带大家完成这个游戏小项目,本文讲具体的实现。
设计一款基于JAVA的游戏,显示N*N盏灯,游戏开始时,所有灯是熄灭的,每次点击其中一盏灯,会改变当前灯以及上、下、左、右几盏灯的状态从熄灭到点亮,点亮到熄灭,当所有灯都点亮为游戏结束。
在实现点灯游戏功能之前,回顾一下上一节我们主要完成了点灯游戏的界面设计;
效果图如下所示:

接下来,小编继续带大家完成游戏功能!
(一)定义事件处理类,实现事件监听器
1.添加事件监听器MyListener(自己命名):
定义变量
private MyListener my = new MyListener();2.为组件指定事件监听器
代码如下所示:
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.定义两个变量一个是已经点击次数,已经点亮的次数
private int click=0;//已经点击次数(已走步数)
private int num=0;//已经点亮灯的次数2.实现上下左右边灯状态事件处理的函数
代码如下所示:
private class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 事件处理的代码
}代码较多,此处不一一堆彻,文末有获取代码详情方式。
3.重新开始事件处理代码如下所示
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.退出游戏事件处理代码如下所示
if(e.getSource()==item02){//退出游戏
dispose();
}5.游戏级别事件处理(入门、6x6、7x7、8x8)代码如下所示
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.游戏规则和关于事件处理代码如下所示
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);
}(三)判断游戏是否结束。设置游戏目前的进度,是否把所有灯全部点亮
代码如下所示:
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);
}
}
}
}(四)初始化游戏
代码如下所示:
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函数体事件处理
代码如下所示:
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的窗体大小
代码如下所示:
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噢~