一、java推箱子遊戲,基于swing界面開發,加入了BGM 自由控制開關,引入悔一步,跳關等功能
每一關的地圖
BGM
源碼如下
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;
}
}