推箱子 | 遇到的问题及解决的办法

推箱子 | 遇到的问题及解决的办法 ✨✨

推箱子 | 遇到的问题及解决的办法_第1张图片

文章目录

    • 推箱子 | 遇到的问题及解决的办法 ✨✨
      • 玩游戏界面
        • map数组的存储和读取
        • 怎么初始化map数组里面的内容
        • 怎么控制人物的移动
        • 怎么判断人物移动的模型
        • 怎么判断游戏结束
        • 地图编辑器的实现原理
      • 创新问题
        • JComboBox组件监听和游戏移动监听冲突
        • 实现音乐播放
        • Timer类的使用

玩游戏界面

map数组的存储和读取

Q: map数组的存储和读取
A: 刚开始自己是想将map直接储存在 主程序里面。但是后来发现这种思维方式,并不适合大量的存储操作反而容易出错。后来刚好学到了文件流的操作,自己就想将map数组,先存储到每一个txt文件,在通过文件的读取操作,将txt里面的数据写入到每一个map数组里面,这样就实现了整个代码的健壮性。

1墙 0空地 4箱子 12有箱子的目的地 8空目的地 2玩家
推箱子 | 遇到的问题及解决的办法_第2张图片

源代码如下:

private void ReadMap(int k) throws IOException {
     
		DataInputStream cin = new DataInputStream(new FileInputStream("src/JavaClassDesign/"+k+".txt"));
		String b = "";
		int j=0;
		while((b=cin.readLine())!=null) {
     
			char[] a=b.toCharArray();
			for(int i=0;i<a.length;i++) {
     
				wall[j][i]=a[i]-'0';
			}
			j++;
		}
		cin.close();
	}

怎么初始化map数组里面的内容

Q: 怎么初始化map数组里面的内容
A: 以墙体为例,我们可以使用对map数组遍历来实现,如果此时map数组里面内容为1,就在这里初始化墙体

怎么控制人物的移动

Q: 怎么控制人物的移动
A:对键盘实时监听,每一个方向键会有一个键值,只需要判断键值,就可以知道人物该如何移动了

怎么判断人物移动的模型

Q:怎么控制人物的移动模型
A:对每一个移动要考虑13种移动,移动情况如下所示
推箱子 | 遇到的问题及解决的办法_第3张图片

怎么判断游戏结束

Q:怎么判断游戏结束
A:设置一个全局变量flag,当箱子和目的地重合时,flag++,时时刻刻维护flag的值。这个判断标志,这里我们通过一个win函数来进行判断。

private void win() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException{
     
		if (num==boxnum){
     
			Object[] options={
     "下一关","返回"};
			 int response=JOptionPane.showOptionDialog ( null, "你的选择","接下来",JOptionPane.YES_OPTION ,JOptionPane.PLAIN_MESSAGE, null, options, options[0] ) ;
			 if(response==0) {
     
				 if(musicFlag!=null)
					 musicFlag.stop();
				 if(musicFlagtmp!=null)
					 musicFlagtmp.stop();
				 this.dispose();
				 if(k<4)
				 new PlayGameInterface();
			 }
			 if(response==1) {
     
				 k=0;
				 if(musicFlag!=null)
					 musicFlag.stop();
				 if(musicFlagtmp!=null)
					 musicFlagtmp.stop();
				 this.dispose();
				 if(k<4)
				 new PlayGameInterface();
			 }
		}
	}

地图编辑器的实现原理

Q:怎么实现地图编辑器
A:对每一个要填充的对象,设置一个监听器。在设置一个全局变量flag,当选择墙体时flag==1,再将鼠标点击编辑地图界面。将flag的值填充到map数组里面,将map数组作为一个形参,传到跑这个游戏的主界面。

创新问题

JComboBox组件监听和游戏移动监听冲突

A:我是用JComboBox组件来实现,音乐的选着播放。但是JComboBox会和那个游戏界面进行冲突,我是用在JComboBox组件上调用一个方法

comboBox.setFocusable(false);

加了组件之后,键盘的监听就已经全部实现到,JComboBox组件上面,这是调用setFoucusable,将键盘的聚焦到游戏的主界面。

实现音乐播放

Q:怎么实现音乐播放
A:1 获取你要播放的音乐文件,2、定义一个AudioInputStream用于接收输入的音频数据 3、调用AudioSystem.getClip()方法,就获得一个数据线clip。用clip.open(audioInput)函数打开数据线的接口,用clip.start()数据线开始工作。

package SwingTest;

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class ClipTestClass {
     
	String file;
	Clip clip;
	public ClipTestClass(String file) {
     
		this.file=file;
	}
	public void player() throws UnsupportedAudioFileException, IOException, LineUnavailableException {
     
		File filePath = new File(file);
		if(filePath.exists()) {
     
			AudioInputStream audioInput = AudioSystem.getAudioInputStream(filePath);
			clip = AudioSystem.getClip();
			clip.open(audioInput);
			clip.start();
			clip.loop(Clip.LOOP_CONTINUOUSLY);
			//Thread.sleep(Integer.MAX_VALUE);
		}
	}
	public void stop() {
     
		if(clip!=null)
		clip.stop();
	}
}

Timer类的使用

Q:怎么使用Timer类的使用
A:使用System.currentTimeMillis()方法,获得时间,是long型是数值,数值是与1970年1月1日的差值。在用Data对象,获得当地时间

Timer time = new Timer(1000,new ActionListener() {
     
			public void actionPerformed(ActionEvent e) {
     
				long currentTime = System.currentTimeMillis();
		        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
		        Date date = new Date(currentTime);
				jl33.setText(formatter.format(date));
				jl6.setText(String.valueOf((currentTime-currentTime1)/1000)+"秒");
			}
		});
        time.start();

你可能感兴趣的:(java学习,java,经验分享)