Q: map数组的存储和读取
A: 刚开始自己是想将map直接储存在 主程序里面。但是后来发现这种思维方式,并不适合大量的存储操作反而容易出错。后来刚好学到了文件流的操作,自己就想将map数组,先存储到每一个txt文件,在通过文件的读取操作,将txt里面的数据写入到每一个map数组里面,这样就实现了整个代码的健壮性。
1墙 0空地 4箱子 12有箱子的目的地 8空目的地 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();
}
Q: 怎么初始化map数组里面的内容
A: 以墙体为例,我们可以使用对map数组遍历来实现,如果此时map数组里面内容为1,就在这里初始化墙体
Q: 怎么控制人物的移动
A:对键盘实时监听,每一个方向键会有一个键值,只需要判断键值,就可以知道人物该如何移动了
Q:怎么控制人物的移动模型
A:对每一个移动要考虑13种移动,移动情况如下所示
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数组作为一个形参,传到跑这个游戏的主界面。
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();
}
}
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();