天天看點

Java 推箱子遊戲

一、java推箱子遊戲,基于swing界面開發,加入了BGM 自由控制開關,引入悔一步,跳關等功能

Java 推箱子遊戲
Java 推箱子遊戲
Java 推箱子遊戲
Java 推箱子遊戲

每一關的地圖

Java 推箱子遊戲

BGM

Java 推箱子遊戲

源碼如下

package com.company;

import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Stack;

public class Tuixiangzi {
	public static void main(String[] args) {
		new TxzGame();
//		new ReadMap(1);
	}
}
//界面類
class TxzGame extends JFrame implements ActionListener,ItemListener{
	JButton btnBack,btnFirst,btnNext,btnPrev;
	JButton btnLast,btnSelect,btnMusic,btnReset;
	JComboBox cbMusic;
	JMenuBar menuBar;
	JMenu mnuOption,mnuSet,mnuHelp;
	JMenuItem miReset,miPrev,miNext,miSelect,miExit,miBack;
	JRadioButtonMenuItem miMusic1,miMusic2,miMusic3,miMusic4,miMusic5;
	
	JMenuItem miHelp;
	final int MAXLEVEL=50;
	//音樂檔案
	String sMusicFile[]={
		"nor.mid",
		"qin.mid",
		"popo.mid",
		"guang.mid",
		"eyes on me.mid"
	};
	String sMusic[]={
			"預設",
			"琴箫合奏",
			"泡泡堂",
			"灌籃高手",
			"eyes on me"
	};
	//建立MyPanel類
	MyPanel mainPanel;
	//定義播放背景音樂的類
	Sound sound;
	
	public TxzGame() {
		super("推箱子遊戲");
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image image = toolkit.getImage("pic/3.gif");
		//設定圖示
		setIconImage(image);
		Container c = getContentPane();
		c.setLayout(null);
		c.setBackground(Color.GRAY);
		JLabel lblTitle = new JLabel("推箱子2016",JLabel.CENTER);
		lblTitle.setFont( new Font("宋體",Font.BOLD,16));
		lblTitle.setBounds(100, 20,500, 30);
		c.add(lblTitle);
		//調用建立按鈕的函數
		createButton(c);
		//調用建立菜單的函數
		createMenus();
		
		mainPanel = new MyPanel();
		mainPanel.setBounds(0, 60, 600, 600);
		c.add(mainPanel);
		setSize(720,720);
		setVisible(true);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//啟動背景音樂
		sound = new Sound();
		//設定預設焦點
		mainPanel.requestFocus();
	}
	//建立按鈕函數
	public void createButton(Container c){
		//右邊放一排按鈕
		btnReset = new JButton("重來");
		btnBack = new JButton("悔一步");
		btnFirst = new JButton("第一關");
		btnNext = new JButton("下一關");
		btnPrev = new JButton("上一關");
		btnLast = new JButton("最終關");
		btnSelect = new JButton("選關");
		btnMusic = new JButton("音樂關");
		JLabel lblMusic = new JLabel("選擇音樂");
		cbMusic = new JComboBox(sMusic);
		
		btnReset.setBounds(610,80, 80, 30);
		btnBack.setBounds(610,130, 80, 30);
		btnFirst.setBounds(610,180, 80, 30);
		btnNext.setBounds(610,230, 80, 30);
		btnPrev.setBounds(610,280, 80, 30);
		btnLast.setBounds(610,330, 80, 30);
		btnSelect.setBounds(610,380, 80, 30);
		btnMusic.setBounds(610,430, 80, 30);
		lblMusic.setBounds(610,480, 80, 20);
		cbMusic.setBounds(610,500, 80, 30);
		//監聽
		btnReset.addActionListener(this);
		btnBack.addActionListener(this);
		btnFirst.addActionListener(this);
		btnNext.addActionListener(this);
		btnPrev.addActionListener(this);
		btnLast.addActionListener(this);
		btnSelect.addActionListener(this);
		btnMusic.addActionListener(this);
		
		
		
//		cbMusic.addActionListener(this);
		//監聽下拉框
		cbMusic.addItemListener(this);
		
		c.add(btnReset);
		c.add(btnBack);
		c.add(btnFirst);
		c.add(btnNext);
		c.add(btnPrev);
		c.add(btnLast);
		c.add(btnSelect);
		c.add(btnMusic);
		c.add(lblMusic);
		c.add(cbMusic);
	}
	//建立菜單函數
	public void createMenus(){
		//建立選項子菜單
		mnuOption = new JMenu("選項");
		miBack = new JMenuItem("悔一步");
		miReset = new JMenuItem("重置");
		miPrev = new JMenuItem("上一關");
		miNext = new JMenuItem("下一關");
		miSelect = new JMenuItem("選關");
		miExit = new JMenuItem("退出");
		
		mnuOption.add(miBack);
		mnuOption.add(miReset);
		mnuOption.add(miPrev);
		mnuOption.add(miNext);
		mnuOption.add(miSelect);
		mnuOption.addSeparator();
		mnuOption.add(miExit);
		//設定子菜單
		mnuSet = new JMenu("設定");
		miMusic1 = new JRadioButtonMenuItem(sMusic[0]);
		miMusic2 = new JRadioButtonMenuItem(sMusic[1]);
		miMusic3 = new JRadioButtonMenuItem(sMusic[2]);
		miMusic4 = new JRadioButtonMenuItem(sMusic[3]);
		miMusic5 = new JRadioButtonMenuItem(sMusic[4]);
		//單選菜單分組
		ButtonGroup bg = new ButtonGroup();
		bg.add(miMusic1);
		bg.add(miMusic2);
		bg.add(miMusic3);
		bg.add(miMusic4);
		bg.add(miMusic5);
		
		//預設選擇第一首歌
//		miMusic1.setSelected(true);
//		miMusic1.setEnabled(false);
		setMenuState(0);
		mnuSet.add(miMusic1);
		mnuSet.add(miMusic2);
		mnuSet.add(miMusic3);
		mnuSet.add(miMusic4);
		mnuSet.add(miMusic5);
		//幫助子菜單
		mnuHelp = new JMenu("幫助(H)");
		mnuHelp.setMnemonic('H');
		
		miHelp = new JMenuItem("關于我們...");
		mnuHelp.add(miHelp);
		
		//監聽
		miBack.addActionListener(this);
		miReset.addActionListener(this);
		miNext.addActionListener(this);
		miPrev.addActionListener(this);
		miExit.addActionListener(this);
		miSelect.addActionListener(this);
		miMusic1.addActionListener(this);
		miMusic2.addActionListener(this);
		miMusic3.addActionListener(this);
		miMusic4.addActionListener(this);
		miMusic5.addActionListener(this);
		miHelp.addActionListener(this);
		
		menuBar = new JMenuBar();
		menuBar.add(mnuOption);
		menuBar.add(mnuSet);
		menuBar.add(mnuHelp);
		setJMenuBar(menuBar);
		
	}
	//設定選擇背景音樂的菜單狀态,并且保持與下拉框的選項同步
	public void setMenuState(int index){
		switch(index){
		case 0:
			miMusic1.setSelected(true);
			miMusic1.setEnabled(false);
			miMusic2.setEnabled(true);
			miMusic3.setEnabled(true);
			miMusic4.setEnabled(true);
			miMusic5.setEnabled(true);
			break;
		case 1:
			miMusic2.setSelected(true);
			miMusic2.setEnabled(false);
			miMusic1.setEnabled(true);
			miMusic3.setEnabled(true);
			miMusic4.setEnabled(true);
			miMusic5.setEnabled(true);
			break;
		case 2:
			miMusic3.setSelected(true);
			miMusic3.setEnabled(false);
			miMusic2.setEnabled(true);
			miMusic1.setEnabled(true);
			miMusic4.setEnabled(true);
			miMusic5.setEnabled(true);
			break;
		case 3:
			miMusic4.setSelected(true);
			miMusic4.setEnabled(false);
			miMusic2.setEnabled(true);
			miMusic3.setEnabled(true);
			miMusic1.setEnabled(true);
			miMusic5.setEnabled(true);
			break;
		case 4:
			miMusic5.setSelected(true);
			miMusic5.setEnabled(false);
			miMusic2.setEnabled(true);
			miMusic3.setEnabled(true);
			miMusic4.setEnabled(true);
			miMusic1.setEnabled(true);
			break;
		}
		//下拉框的選項與菜單的選項同步
//		cbMusic.setSelectedIndex(index);
	}
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==miHelp){
			String str = "作者:絮落錦鄉\n";
			str += "Q Q:275300091\n";
			str += "版本:推箱子最新版";
			JOptionPane.showMessageDialog(this, str,"幫助",JOptionPane.INFORMATION_MESSAGE);
		}else if(e.getSource()==miExit){
			System.exit(0);
		}else if(e.getSource()==btnFirst){
			mainPanel.setLevel(0);
		}else if(e.getSource()==btnNext || e.getSource()==miNext){
			mainPanel.setLevel(1);
		}else if(e.getSource()==btnPrev || e.getSource()==miPrev){
			mainPanel.setLevel(-1);
		}else if(e.getSource()==btnLast){
			mainPanel.setLevel(MAXLEVEL);
		}else if(e.getSource()==btnSelect || e.getSource()==miSelect){
			String slevel = JOptionPane.showInputDialog(this,"請輸入1~50之間的關卡編号","選關",JOptionPane.OK_CANCEL_OPTION);
			if(slevel !=null){
				try{
					int level = Integer.parseInt(slevel);
					if(level<=0 || level>=50){
						JOptionPane.showMessageDialog(this, "關卡不存在,請輸入1~50之間的數字");
						return;
					}
					mainPanel.setLevel(level);
				}catch(Exception ex){
					JOptionPane.showMessageDialog(this, "非法字元,請輸入1~50之間的數字");
					return;
				}
			}
			System.out.println(slevel);
		}else if(e.getSource()==btnBack || e.getSource()==miBack){//悔一步
			mainPanel.goBack();
			mainPanel.requestFocus();
		}else if(e.getSource()==btnMusic){
			//擷取按鈕文字
			String title = btnMusic.getText();
			if(title.equals("音樂關")){
				if(sound.isplay()){
					sound.mystop();
				}
				//設定按鈕标題
				btnMusic.setText("音樂開");
			}else{
				btnMusic.setText("音樂關");
				sound.loadSound();
			}
		}else if(e.getSource()==btnReset || e.getSource()==miReset){//重來
			mainPanel.setLevel();
		}else if(e.getSource()== miMusic1){
			cbMusic.setSelectedIndex(0);
		}else if(e.getSource()== miMusic2){
			cbMusic.setSelectedIndex(1);
		}else if(e.getSource()== miMusic3){
			cbMusic.setSelectedIndex(2);
		}else if(e.getSource()== miMusic4){
			cbMusic.setSelectedIndex(3);
		}else if(e.getSource()== miMusic5){
			//調用該函數時系統會自動觸發itemStateChanged事件
			cbMusic.setSelectedIndex(4);
		}
	}
	public void itemStateChanged(ItemEvent e) {
		//擷取在下拉框中選中的索引
		int index = cbMusic.getSelectedIndex();
		setMenuState(index);
		//利用索引,從數組中擷取背景音樂檔案名稱
		String sfilename = sMusicFile[index];
		sound.setMusic(sfilename);
		//如果已經在播放背景音樂,則先停止播放
		if(sound.isplay()){
			sound.mystop();
		}
		//播放音樂
		sound.loadSound();
	}
	
	//遊戲面闆
	class MyPanel extends JPanel implements KeyListener{
		private int level=1;
		private int mx;
		private int my;
		//原始資料
		private int map[][]; 
		//臨時資料
		private int tempMap[][];
		Toolkit kit = Toolkit.getDefaultToolkit();
		Image mapimg[]={
			kit.getImage("pic/0.gif"),
			kit.getImage("pic/1.gif"),
			kit.getImage("pic/2.gif"),
			kit.getImage("pic/3.gif"),
			kit.getImage("pic/4.gif"),
			kit.getImage("pic/5.gif"),
			kit.getImage("pic/6.gif"),
			kit.getImage("pic/7.gif"),
			kit.getImage("pic/8.gif"),
			kit.getImage("pic/9.gif"),
		};
		
		/*
		 * 堆棧,儲存推箱子過程中的每一個步驟
		 * 向左:
		 * 	沒有推箱子 1
		 * 	推了箱子	 11
		 * 向上:
		 * 	沒有推箱子 2
		 * 	推了箱子	 22
		 * 向右:
		 * 	沒有推箱子 3
		 * 	推了箱子	 33
		 * 向下:
		 * 	沒有推箱子 4
		 * 	推了箱子	 44
		 * 
		 *  
		 *  	
		 * 
		 * */
		Stack<Integer> step = new Stack<Integer>();
		//讀取地圖;
		public void readFile(int level){
			
			ReadMap readMap = new ReadMap(level);
			//原始資料
			this.map = readMap.getMap();
			this.mx  = readMap.getMx();
			this.my  = readMap.getMy();
			//臨時資料,推箱子的過程中,該數組的值會發生變化
			this.tempMap = new ReadMap(level).getMap();
			//重畫
			repaint();
		}
		public MyPanel() {
			//監聽鍵盤事件
			this.addKeyListener(this);
			setSize(600, 600);
			readFile(level);
		}
		@Override
		public void paint(Graphics g) {
			for(int i=0;i<20;i++){
				for(int j=0;j<20;j++){
					g.drawImage(mapimg[tempMap[j][i]], i*30, j*30, 30, 30,this);
				}
			}
			//白色RGB;255*255*255
			g.setColor(new Color(255, 0, 0));
			g.setFont(new Font("楷體_2312", Font.BOLD, 30));
			g.drawString("現在是第" +level + "關", 210, 60);
		}
		//判斷箱子是否已經全部推到位了
		public boolean isWin(){
			boolean isok=true;
			for(int i=0;i<20;i++){
				for(int j=0;j<20;j++){
					if((map[i][j]==4 || map[i][j]==9) && tempMap[i][j]!=9){
						isok=false;
						break;
					}
				}
				if(!isok)
					break;
			}
			return isok;
		}
		//設定關卡
		public void setLevel(int level) {
			if(level == 0){//第一關
				this.level=1;
			}else if(level==50){//最後一關
				this.level=50;
			}else if(level>1){//選關
				this.level = level;
			}else{
				this.level = this.level +level;
			}
			if(this.level<=0 ){
				this.level =1;	
			}else if( this.level>=50){
				this.level =50;
			}
			readFile(this.level);
			//清空上一關儲存在堆棧中的所有步驟
			step.clear();
			//設定焦點
			requestFocus();
		}
		//重來
		public void setLevel() {
			readFile(this.level);
			//清空上一關儲存在堆棧中的所有步驟
			step.clear();
			//設定焦點
			requestFocus();
		}
		public void keyPressed(KeyEvent e) {
			//方向鍵左鍵的值
			if(e.getKeyCode()==37){
				goLeft();
			}else if(e.getKeyCode()==38){//方向鍵向上鍵的值
				goUp();
			}else if(e.getKeyCode()==39){//方向鍵向右鍵的值
				goRight();
			}else if(e.getKeyCode()==40){//方向鍵向下鍵的值
				goDown();
			}
			if(isWin()){
				JOptionPane.showMessageDialog(null,"恭喜您過關了,進入下一關");
				setLevel(1);
			}
		}
		public void keyReleased(KeyEvent e) {}
		public void keyTyped(KeyEvent e) {}
		public void goLeft(){
			//人的左邊有箱子
			if(tempMap[mx][my-1]==3 || tempMap[mx][my-1]==9){
				//箱子的左邊是草地2或者4就可以左邊推箱子
				if(tempMap[mx][my-2]==2 || tempMap[mx][my-2]==4){
					if(tempMap[mx][my-2]==2){
						tempMap[mx][my-2]=3;
						tempMap[mx][my-1]=6;
					}else{
						tempMap[mx][my-2]=9;
						tempMap[mx][my-1]=6;
					}
					//原來站人的地方要與原始地圖進行比較(map數組)
					if(map[mx][my]==4 || map[mx][my]==9){
						tempMap[mx][my]=4;
					}else{
						tempMap[mx][my]=2;
					}
					my--;
					step.push(11);
				}
				//前面是草地
			}else if(tempMap[mx][my-1]==2 || tempMap[mx][my-1]==4 || tempMap[mx][my-1]==5){
				tempMap[mx][my-1]=6;
				//原來站人的地方要與原始地圖進行比較(map數組)
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=4;
				}else{
					tempMap[mx][my]=2;
				}
				my--;
				step.push(1);
			}
			repaint();

		}
		public void goUp(){
			//人的上面有箱子
			if(tempMap[mx-1][my]==3 || tempMap[mx-1][my]==9){
				//箱子的上面是草地2或者4就可以向上推箱子
				if(tempMap[mx-2][my]==2 || tempMap[mx-2][my]==4){
					if(tempMap[mx-2][my]==2){
						tempMap[mx-2][my]=3;
						tempMap[mx-1][my]=8;
					}else{
						tempMap[mx-2][my]=9;
						tempMap[mx-1][my]=8;
					}
					//原來站人的地方要與原始地圖進行比較(map數組)
					if(map[mx][my]==4 || map[mx][my]==9){
						tempMap[mx][my]=4;
					}else{
						tempMap[mx][my]=2;
					}
					mx--;
					step.push(22);
				}
				//前面是草地
			}else if(tempMap[mx-1][my]==2 || tempMap[mx-1][my]==4 || tempMap[mx-1][my]==5){
				tempMap[mx-1][my]=8;
				//原來站人的地方要與原始地圖進行比較(map數組)
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=4;
				}else{
					tempMap[mx][my]=2;
				}
				mx--;
				step.push(2);
			}
			repaint();
		}
		public void goRight(){
			//人的右邊有箱子
			if(tempMap[mx][my+1]==3 || tempMap[mx][my+1]==9){
				//箱子的右邊是草地2或者4就可以右邊推箱子
				if(tempMap[mx][my+2]==2 || tempMap[mx][my+2]==4){
					if(tempMap[mx][my+2]==2){
						tempMap[mx][my+2]=3;
						tempMap[mx][my+1]=7;
					}else{
						tempMap[mx][my+2]=9;
						tempMap[mx][my+1]=7;
					}
					//原來站人的地方要與原始地圖進行比較(map數組)
					if(map[mx][my]==4 || map[mx][my]==9){
						tempMap[mx][my]=4;
					}else{
						tempMap[mx][my]=2;
					}
					my++;
					step.push(33);
				}
				//右面是草地
			}else if(tempMap[mx][my+1]==2 || tempMap[mx][my+1]==4 || tempMap[mx][my+1]==5){
				tempMap[mx][my+1]=7;
				//原來站人的地方要與原始地圖進行比較(map數組)
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=4;
				}else{
					tempMap[mx][my]=2;
				}
				my++;
				step.push(3);
			}
			repaint();

		}
		public void goDown(){
			//人的下面有箱子
			if(tempMap[mx+1][my]==3 || tempMap[mx+1][my]==9){
				//箱子的下面是草地2或者4就可以向下推箱子
				if(tempMap[mx+2][my]==2 || tempMap[mx+2][my]==4){
					if(tempMap[mx+2][my]==2){
						tempMap[mx+2][my]=3;
						tempMap[mx+1][my]=5;
					}else{
						tempMap[mx+2][my]=9;
						tempMap[mx+1][my]=5;
					}
					//原來站人的地方要與原始地圖進行比較(map數組)
					if(map[mx][my]==4 || map[mx][my]==9){
						tempMap[mx][my]=4;
					}else{
						tempMap[mx][my]=2;
					}
					mx++;
					step.push(44);
				}
				//前面是草地
			}else if(tempMap[mx+1][my]==2 || tempMap[mx+1][my]==4 || tempMap[mx+1][my]==5){
				tempMap[mx+1][my]=5;
				//原來站人的地方要與原始地圖進行比較(map數組)
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=4;
				}else{
					tempMap[mx][my]=2;
				}
				mx++;
				step.push(4);
				System.out.println("mx"+mx+";my="+my);
			}
			repaint();
		}
//		點選悔一步的按鈕時調用的函數
		public void goBack(){
			//判斷堆棧是否為空
			if(step.isEmpty()){
				JOptionPane.showMessageDialog(null, "已經是初始狀态,不能再悔一步。");
				return;
			}
			int n = step.pop();//取出棧頂元素
			switch(n){
			case 1:
			case 11:
				backLeft(n);
				break;
			case 2:
			case 22:
				backUp(n);
				break;
			case 3:
			case 33:
				backRight(n);
				break;
			case 4:
			case 44:
				backDown(n);
				break;
			}
			requestFocus();
		}
		//悔一步的函數
		public void backLeft(int step){
			if(step==1){ //沒有推箱子
				tempMap[mx][my+1]=6;
				//原來站人的地方,現在變成草地
				if(map[mx][my]==4 || map[mx][my]==9)
					tempMap[mx][my]=4;
				else
					tempMap[mx][my]=2;
				my++;
			}else{//推了箱子
				tempMap[mx][my+1]=6;
				//原來站人的地方,現在放箱子
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=9;
				}else{
					tempMap[mx][my]=3;
				}
				//原來放箱子的地方,現在變成空地
				if(map[mx][my-1]==4 || map[mx][my-1]==9){
					tempMap[mx][my-1]=4;
				}else{
					tempMap[mx][my-1]=2;
				}
				my++;
			}
			//重畫界面
			repaint();
		}
		public void backUp(int step){
			if(step==2){ //沒有推箱子
				tempMap[mx+1][my]=8;
				//原來站人的地方,現在變成草地
				if(map[mx][my]==4 || map[mx][my]==9)
					tempMap[mx][my]=4;
				else
					tempMap[mx][my]=2;
				mx++;
			}else{//推了箱子
				tempMap[mx+1][my]=8;
				//原來站人的地方,現在放箱子
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=9;
				}else{
					tempMap[mx][my]=3;
				}
				//原來放箱子的地方,現在變成空地
				if(map[mx-1][my]==4 || map[mx-1][my]==9){
					tempMap[mx-1][my]=4;
				}else{
					tempMap[mx-1][my]=2;
				}
				mx++;
			}
			//重畫界面
			repaint();
		}
		public void backRight(int step){
			if(step==3){ //沒有推箱子
				tempMap[mx][my-1]=7;
				//原來站人的地方,現在變成草地
				if(map[mx][my]==4 || map[mx][my]==9)
					tempMap[mx][my]=4;
				else
					tempMap[mx][my]=2;
				my--;
			}else{//推了箱子
				tempMap[mx][my-1]=7;
				//原來站人的地方,現在放箱子
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=9;
				}else{
					tempMap[mx][my]=3;
				}
				//原來放箱子的地方,現在變成空地
				if(map[mx][my+1]==4 || map[mx][my+1]==9){
					tempMap[mx][my+1]=4;
				}else{
					tempMap[mx][my+1]=2;
				}
				my--;
			}
			//重畫界面
			repaint();
		}
		public void backDown(int step){
			if(step==4){ //沒有推箱子
				tempMap[mx-1][my]=5;
				//原來站人的地方,現在變成草地
				if(map[mx][my]==4 || map[mx][my]==9)
					tempMap[mx][my]=4;
				else
					tempMap[mx][my]=2;
				mx--;
			}else{//推了箱子
				tempMap[mx-1][my]=5;
				//原來站人的地方,現在放箱子
				if(map[mx][my]==4 || map[mx][my]==9){
					tempMap[mx][my]=9;
				}else{
					tempMap[mx][my]=3;
				}
				//原來放箱子的地方,現在變成空地
				if(map[mx+1][my]==4 || map[mx+1][my]==9){
					tempMap[mx+1][my]=4;
				}else{
					tempMap[mx+1][my]=2;
				}
				mx--;
			}
			//重畫界面
			repaint();
		}
	}
}

//讀取地圖檔案
class ReadMap{
	private int map[][];
	private int mx,my;
	//儲存遊戲關卡編号
	private int level;
	
	public ReadMap(int level) {
		this.level = level;
		String sfilename = "maps/"+level+".map";
		String content="";
		//用字元流讀取檔案中的地圖資料
		try {
			FileReader fr = new FileReader(sfilename);
			BufferedReader br = new BufferedReader(fr);
			String temp = "";
			//一行一行的讀取檔案的内容,如果讀到檔案的末尾,則傳回null值
			while((temp = br.readLine())!=null){
				content += temp;
			}
//			System.out.println(content);
			//轉換成位元組數組,共有400個元素
			byte b[] = content.getBytes();
//			for (byte c : b) {
//				System.out.print(c +"\t");
//			}
			map = new int[20][20];
			int c=0;
			for(int i=0;i<20;i++){
				for(int j=0;j<20;j++){
					map[i][j]=b[c]-48;
//					System.out.println(map[i][j]);
					c++;
					if(map[i][j]==5){
						mx=i;
						my=j;
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int[][] getMap() {
		return map;
	}

	public int getMx() {
		return mx;
	}

	public int getMy() {
		return my;
	}
}
//播放背景音樂
class Sound {
	
	String path = new String("musics\\");

	//預設背景音樂
	String file = new String("nor.mid");

	
	Sequence seq;

	Sequencer midi;

	//判斷是否在播放音樂
	boolean sign;

	public Sound() {
		loadSound();
	}
	//播放背景音樂的函數
	void loadSound() {
		try {
			//讀取音頻檔案
			seq = MidiSystem.getSequence(new File(path + file));
			//擷取一個音頻裝置
			midi = MidiSystem.getSequencer();
			//打開音頻裝置
			midi.open();
			//把音頻檔案設定到播放裝置中
			midi.setSequence(seq);
			//開始播放音樂
			midi.start();
			//循環播放
			midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
		}
		catch ( Exception ex ) {
			ex.printStackTrace();
		}
		//代表正在播放背景音樂
		sign = true;
	}
	//停止播放背景音樂
	void mystop() {
		midi.stop();
		midi.close();
		sign = false;
	}

	//判斷是否在播放背景音樂
	boolean isplay() {
		return sign;
	}
	//設定在下拉框中選擇的背景音樂檔案名稱
	void setMusic(String e) {
		file = e;
	}
}