1. 程式人生 > >Java實戰推箱子——菜鳥之路

Java實戰推箱子——菜鳥之路

    當時找了很久也沒找到幾個實戰的教程視訊,最後還是花了半天看了網路上的一些原始碼和思路然後來寫了這個。總體感覺自己寫的還是很爛,寫這個的時候自己並沒有寫地圖,而是引用了網路上的地圖(用0~9來標記不同的圖真的是給繪製地圖較低了很大一部分難度)。

    先來說一下要來做什麼,我們想要實現的就是傳統的推箱子小遊戲。那傳統的推箱子小遊戲有什麼,他的背景很大,並且你需要不同的地方來標誌你的地圖,以下列我所寫的程式為例。傳統的推箱子游戲(恩。。我記得當年小時候的直板手機上就是有這些功能),可以根據使用者的要求,跳到第一關,上一關,下一關,最後一關,也可以重新開始,悔棋,選關等操作。這裡想問一個問題為什麼按鈕只要寫四個字就會只顯示兩個字其他都隱藏呢。。我改了按鈕大小當時也是這種情況比較迷。

  說了這麼多廢話還是總結一下,我們需要實現的需求吧。

  1.使用者介面上的一些東西

  (1)存在一個選項選單欄,我們需要給出如下子選單功能的實現。重新開始、上一關、下一關、選擇關卡、悔一步、退出。當然還包括一個分割線。

  (2)存在一個設定音樂選單欄,存在你所寫的歌的名稱,我的就很low的一下這幾個了。當然他們是互斥的,所以當點下一歌選單欄按鈕時,你需要從視覺上反饋給使用者當前正在播放的音樂是什麼。

  (3)存在一個幫助選單欄,下面有個名叫關於此遊戲的選項,恩。。。這個就胡亂蹦出一個資訊就好,比如一個訊息對話方塊。

  (4)就是對應操作的一些按鈕了。在這裡添加了,重玩,悔一步,第一關,上一關,下一關,選關,最終關,音樂關 恩點一下它可以變為音樂開(意思就是關閉音樂,開啟音樂 我這裡因為我的low 寫不出四個以上的字就用了三個字代替)。

  (5)還有一個就是更換音樂的一個下拉選單了。這個也沒什麼好講的。至於這個黃色的“更換音樂”,直接顯示文字就好。

  (6)每次通關後要蹦出一個訊息對話方塊問你是否進入下一關

  2.就是地圖也就是畫板了 我這裡定義了一個20*20這麼多的小圖片拼成的地圖。emmm。。。個人沒什麼審美 醜的一p。

  這裡不做過多的贅述,要講的基本上我都在程式碼的註釋裡講了。就多說幾句關於這個遊戲判斷的東西吧,這裡使用的方法是用不同的數字來代表不同的圖片,也就是不同的方塊,這樣更加方便我們去進行移動和生成地圖,還有判斷輸贏。個人感覺這個遊戲只要看一看JFrame基本上就不會有太大的難度。程式碼中唯一麻煩的就是移動的一些判斷了,其實只需要寫出一個來然後複製改下標就可以了。複述一句,注意我的下標,當時建立的視窗座標和自己二維陣列座標不一樣,然後自己也懶得增加修改量了,望諒解,哈哈哈。

  我的蟲子是四個方向不同的圖片。所以說你要考慮走不動時按不同的鍵位,圖片要進行重新整理。恩,先給出程式碼吧,後續我會新增詳細的關於JFrame方面的應用和理解,還有該程式碼的詳細解釋還有幾個遊戲的詳解。恩,要下課了,準備溜了溜了。。

先給出客戶端的類程式碼實現:

package xyz.lzw.box;
/**
 * 遊戲實現 客戶端
 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;


public class mainFrame extends JFrame implements ActionListener,ItemListener {
	JLabel lb;
	JLabel lb2;
	JButton renew1,last1,choose1,first1,over1,muc1,back1,next1;
	MainPanel panel;
	Sound sound;
	//選單欄
	JComboBox jc = new JComboBox();
	MenuItem renew = new MenuItem("重新開始");
	MenuItem back = new MenuItem("悔一步");
	MenuItem last = new MenuItem("上一關");
	MenuItem next = new MenuItem("下一關");
	MenuItem choose = new MenuItem("選擇關卡");
	MenuItem exit = new MenuItem("退出");
	MenuItem qin = new MenuItem("琴簫合奏");
	MenuItem guang = new MenuItem("BGM");
	MenuItem mid1 = new MenuItem("mid1");
	MenuItem mid2 = new MenuItem("mid2");
	MenuItem nor = new MenuItem("預設");
	MenuItem about = new MenuItem("關於此遊戲");
	//建構函式,實現圖形使用者介面
	mainFrame(){
		super("Puppet製作 惡搞小遊戲");
		setSize(720,720);
		setVisible(true);
		setResizable(false);  //設定窗體的大小不可隨意改變
		setLocation(320,20);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//建立一個容器 並將JFrame窗體轉換為容器
		Container conter = getContentPane();
		conter.setLayout(null);
		conter.setBackground(Color.BLACK);
		lb = new JLabel("推箱子~",SwingConstants.CENTER);
		lb2 = new JLabel("更換音樂",SwingConstants.CENTER);
		add(lb);
		add(lb2);
		lb.setBounds(100,20,400,20);
		lb.setForeground(Color.YELLOW);
		lb2.setBounds(625, 500, 55, 20);
		lb2.setForeground(Color.YELLOW);
		//按鈕
		renew1 = new JButton("重玩");
		add(renew1);
		back1 = new JButton("悔一步");
		add(back1);
		last1 = new JButton("上一關");
		add(last1);
		next1 = new JButton("下一關");
		add(next1);
		choose1 = new JButton("選關");
		add(choose1);
		first1 = new JButton("第1關");
		add(first1);
		over1 = new JButton("最終關");
		add(over1);
		muc1 = new JButton("音樂關");
		add(muc1);
		renew1.setBounds(625, 100, 80, 40);
		renew1.addActionListener(this);
		
		back1.setBounds(625, 150, 80, 40);
		back1.addActionListener(this);
		
		first1.setBounds(625, 200, 80, 40);
		first1.addActionListener(this);

		last1.setBounds(625, 250, 80, 40);
		last1.addActionListener(this);

		next1.setBounds(625, 300, 80, 40);
		next1.addActionListener(this);
		
		choose1.setBounds(625, 350, 80, 40);
		choose1.addActionListener(this);
	
		over1.setBounds(625, 400, 80, 40);
		over1.addActionListener(this);

		muc1.setBounds(625, 450, 80, 40);
		muc1.addActionListener(this);
		//更換音樂裡的下拉選單標題
		jc.setBounds(625, 530, 80, 25);
		jc.addItem("預設");
		jc.addItem("琴簫合奏");
		jc.addItem("BGM");
		jc.addItem("經典");
		jc.addItem("流行");
		jc.addItemListener(this);
		conter.add(jc);
		//子選單欄
		Menu choices = new Menu("選項");
		choices.add(renew);
		choices.add(last);
		choices.add(next);
		choices.add(choose);
		choices.add(back);
		choices.addSeparator();
		choices.add(exit);
		renew.addActionListener(this);
		last.addActionListener(this);
		next.addActionListener(this);
		choose.addActionListener(this);
		back.addActionListener(this);
		exit.addActionListener(this);
		//子選單欄
		Menu setmusic = new Menu("設定音樂");
		setmusic.add(nor);
		setmusic.add(qin);
		setmusic.add(guang);
		setmusic.add(mid1);
		setmusic.add(mid2);
		nor.addActionListener(this);
		qin.addActionListener(this);
		guang.addActionListener(this);
		mid1.addActionListener(this);
		mid2.addActionListener(this);
		Menu help = new Menu("幫助");
		help.add(about);
		about.addActionListener(this);
		//選單
		MenuBar bar = new MenuBar();
		bar.add(choices);
		bar.add(setmusic);
		bar.add(help);
		setMenuBar(bar);
		nor.setEnabled(false);
		
		sound = new Sound();
		sound.loadSound();
		panel = new MainPanel();
		add(panel);
		panel.PutBox(panel.level);
		panel.requestFocus();
		validate();
	}
	//返回畫板上按鈕的監聽,來看使用者點下了什麼按鈕,同時進行不同操作
	@Override
	public void actionPerformed(ActionEvent e) {
		//重玩
		if(e.getSource()==renew1||e.getSource()==renew) {
			panel.PutBox(panel.level);
			panel.requestFocus();
			panel.remove();
		}
		//上一關
		else if(e.getSource()==last||e.getSource()==last1) {
			panel.level--;
			//判斷是否為第一關 從而執行不同操作
			if(panel.level<1) {
				panel.level++;
			JOptionPane.showMessageDialog(this, "本關是是第一關,無法繼續返回上一關卡");
			panel.requestFocus();
			}
			else {
				panel.PutBox(panel.level);
				panel.requestFocus();
			}
			panel.remove();
		}
		//下一關
		else if(e.getSource()==next||e.getSource()==next1) {
			panel.level++;
			//判斷是否是最後一關 從而進行不同操作
			if(panel.level>panel.maxlevel()) {
				panel.level--;
				JOptionPane.showMessageDialog(this, "本關已經是最後一關 無法進入下一關");
				panel.requestFocus();
			}
			else {
				panel.PutBox(panel.level);
				panel.requestFocus();
			}
			panel.remove();
		}
		//最終關
		else if(e.getSource()==over1) {
			panel.level=panel.maxlevel();
			panel.PutBox(panel.level);
			panel.requestFocus();
			panel.remove();
		}
		//退出 結束遊戲
		else if(e.getSource()==exit) {
			System.exit(0);
		}
		//幫助
		else if(e.getSource()==about) {
			JOptionPane.showMessageDialog(this, "PUPPET製作 非完善版");
		}
		//選關
		else if(e.getSource()==choose||e.getSource()==choose1) {
			String tmpp = JOptionPane.showInputDialog(this,"請輸入您要跳轉到的關卡號:(1~50)");
			panel.level=Integer.parseInt(tmpp);
			panel.remove();
			if(panel.level>panel.maxlevel()||panel.level<1) {
				JOptionPane.showMessageDialog(this, "不存在該關卡!!!!");
				panel.requestFocus();
			}
			else {
				panel.PutBox(panel.level);
				panel.requestFocus();
			}
		}
		//第一關
		else if(e.getSource()==first1) {
			panel.level=1;
			panel.PutBox(panel.level);
			panel.requestFocus();
			panel.remove();
		}
		//音樂開/關
		else if(e.getSource()==muc1) {
			if(sound.isplay()) {
				sound.mystop();
				muc1.setLabel("音樂開");
			}
			else {
				sound.loadSound();
				muc1.setLabel("音樂關");
			}
			panel.requestFocus();
		}
		//上一步
		else if(e.getSource()==back1||e.getSource()==back) {
			if(panel.isMystackEmpty()) {
				JOptionPane.showMessageDialog(this, "你還未進行移動,無法返回上一步~~~");
			}
			else {
				switch(panel.back()) {
				case 10:panel.backup(10);break;
				case 11:panel.backup(11);break;
				case 20:panel.backdown(20);break;
				case 21:panel.backdown(21);break;
				case 30:panel.backleft(30);break;
				case 31:panel.backleft(31);break;
				case 40:panel.backright(40);break;
				case 41:panel.backright(41);break;
				}
			}
			panel.requestFocus();
		}
		//音樂下拉選單裡的預設音樂
		else if(e.getSource()==nor) {
			jc.setSelectedIndex(0);
		}
		//音樂下拉選單裡的琴簫合奏音樂
		else if(e.getSource()==qin) {
			jc.setSelectedIndex(1);
		}
		//音樂下拉選單裡的灌籃高手音樂
		else if(e.getSource()==guang) {
			jc.setSelectedIndex(2);
		}
		//音樂下拉選單裡的經典音樂
		else if(e.getSource()==mid1) {
			jc.setSelectedIndex(3);
		}
		//音樂下拉選單裡的流行音樂
		else if(e.getSource()==mid2) {
			jc.setSelectedIndex(4);
		}
	}
	//更換音樂
	@Override
	public void itemStateChanged(ItemEvent ie) {
		int numm = jc.getSelectedIndex();
		switch(numm) {
			case 0:
				sound.setMusic("nor.mid");
				if(sound.isplay()) {
					sound.mystop();
				}
				sound.loadSound();
				muc1.setLabel("音樂關");
				nor.setEnabled(false);
				qin.setEnabled(true);
				guang.setEnabled(true);
				mid1.setEnabled(true);
				mid2.setEnabled(true);
				panel.requestFocus();
				break;
			case 1: 
				sound.setMusic("qin.mid");
				if(sound.isplay()) {
					sound.mystop();
				}
				sound.loadSound();
				muc1.setLabel("音樂關");
				nor.setEnabled(true);
				qin.setEnabled(false);
				guang.setEnabled(true);
				mid1.setEnabled(true);
				mid2.setEnabled(true);
				panel.requestFocus();
				break;
			case 2: 
				sound.setMusic("guang.mid");
				if(sound.isplay()) {
					sound.mystop();
				}
				sound.loadSound();
				muc1.setLabel("音樂關");
				nor.setEnabled(true);
				qin.setEnabled(true);
				guang.setEnabled(false);
				mid1.setEnabled(true);
				mid2.setEnabled(true);
				panel.requestFocus();
				break;
			case 3: 
				sound.setMusic("mid1.mid");
				if(sound.isplay()) {
					sound.mystop();
				}
				sound.loadSound();
				muc1.setLabel("音樂關");
				nor.setEnabled(true);
				qin.setEnabled(true);
				guang.setEnabled(true);
				mid1.setEnabled(false);
				mid2.setEnabled(true);
				panel.requestFocus();
				break;
			case 4: 
				sound.setMusic("mid2.mid");
				if(sound.isplay()) {
					sound.mystop();
				}
				sound.loadSound();
				muc1.setLabel("音樂關");
				nor.setEnabled(true);
				qin.setEnabled(true);
				guang.setEnabled(true);
				mid1.setEnabled(true);
				mid2.setEnabled(false);
				panel.requestFocus();
				break;
		}
	}
}

之後是畫板類的程式碼(也就是俗稱的畫地圖的東西):

package xyz.lzw.box;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Stack;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 畫板 介面
 */
public class MainPanel extends JPanel implements KeyListener {
	int max = 50;
	int[][] map,maptmp;
	int X,Y,boxnum;
	Image[] myImage;
	Map Levelmap;
	Map Levelmaptmp;
	int len = 30;
	public int level = 1;
	Stack mystack = new Stack();
	//建構函式 將圖片匯入
	MainPanel(){
		setBounds(15,50,600,600);
		setBackground(Color.WHITE);
		addKeyListener(this);
		myImage = new Image[10];
		for(int i = 0;i < 10;i++) {
			myImage[i] = Toolkit.getDefaultToolkit().getImage("pic\\"+i+".gif");
		}
		setVisible(true);
	}
	//載入地圖
	void PutBox(int i) {
		Levelmap = new Map(i);
		Levelmaptmp = new Map(i);
		map = Levelmap.getmap();
		X = Levelmap.getX();
		Y = Levelmap.getY();
		maptmp = Levelmaptmp.getmap();
		repaint(); //重畫
	}
	//返回最高的關卡
	int maxlevel() {
		return max;
	}
	//畫地圖
	public void paint(Graphics g) {
		for(int i = 0;i < 20;i++)
			for(int j = 0;j < 20;j++) {
				g.drawImage(myImage[map[j][i]], i*len, j*len, this);
			}
		g.setColor(new Color(0,0,0));
		g.setFont(new Font("楷體_2312",Font.BOLD,30));
		g.drawString("第", 240, 40);
		g.drawString(String.valueOf(level), 310, 40);
		g.drawString("層", 360, 40);
	}
	@Override
	public void keyPressed(KeyEvent e) {
		//由鍵盤返回上下左右四個方向上的移動
		if(e.getKeyCode()==KeyEvent.VK_UP){
			moveup();
		}
		else if(e.getKeyCode()==KeyEvent.VK_DOWN) {
			movedown();
		}
		else if(e.getKeyCode()==KeyEvent.VK_LEFT) {
			moveleft();
		}
		else if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
			moveright();
		}
		//判斷過關後進行的不同操作
		if(win()) {
			//通關了則提示打通全關
			if(level == max) {
				JOptionPane.showMessageDialog(this, "恭喜您打通全關!!!");
			}
			//彈出一個對話方塊提示是否進行下一關
			else {
				String message = "恭喜您通過了第" + level +"關!\n是否要進入下一關?";
				int type = JOptionPane.YES_NO_OPTION;
				String title = "恭喜過關!!!";
				int option = JOptionPane.showConfirmDialog(null, message,title,type);
				if(option == 1)
					System.exit(0);
				else if(option == 0) {
					level++;
					PutBox(level);
				}	
			}
			mystack.removeAllElements();
		}
	}
	@Override
	public void keyReleased(KeyEvent e) {
	}
	@Override
	public void keyTyped(KeyEvent e) {
	}
	//判空
	boolean isMystackEmpty() {
		return mystack.isEmpty();
	}
	int back() {
		return (Integer)mystack.pop();
	}
	//清空
	void remove() {
		mystack.removeAllElements();
	}
	//四個方向的移動和悔步 這裡要考慮走這一步時能不能走 走過去是什麼情況
	void moveup() {
		if(map[Y-1][X]==2||map[Y-1][X]==4) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
				map[Y][X]=4;
			else
				map[Y][X]=2;
			map[Y-1][X]=8;
			repaint();
			Y--;
			mystack.push(10);
		}
		else if(map[Y-1][X]==3) {
			if(map[Y-2][X]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y-1][X]=8;
				map[Y-2][X]=9;
				repaint();
				Y--;
				mystack.push(11);
			}
			else if(map[Y-2][X]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y-1][X]=8;
				map[Y-2][X]=3;
				repaint();
				Y--;
				mystack.push(11);
			}
			else {
				map[Y][X]=8;
				repaint();
			}
		}
		else if(map[Y-1][X]==9) {
			if(map[Y-2][X]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y-1][X]=8;
				map[Y-2][X]=9;
				repaint();
				Y--;
				mystack.push(11);
			}
			else if(map[Y-2][X]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y-1][X]=8;
				map[Y-2][X]=3;
				repaint();
				Y--;
				mystack.push(11);
			}
			else {
				map[Y][X]=8;
				repaint();
			}
		}
		if(map[Y-1][X]==1) {
			map[Y][X]=8;
			repaint();
		}
	}
	void backup(int t) {
		int cnt = t;
		if(cnt == 10) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9) {
				map[Y][X]=4;
			}
			else
				map[Y][X]=2;
		}
		else if(cnt == 11) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
			{
				map[Y][X]=9;
			}
			else
				map[Y][X]=3;
			if(maptmp[Y-1][X]==4||maptmp[Y-1][X]==9) {
				map[Y-1][X]=4;
			}
			else 
				map[Y-1][X]=2;
		}
		map[Y+1][X]=8;
		repaint();
		Y++;
	}
	void movedown() {
		if(map[Y+1][X]==2||map[Y+1][X]==4) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
				map[Y][X]=4;
			else
				map[Y][X]=2;
			map[Y+1][X]=5;
			repaint();
			Y++;
			mystack.push(20);
		}
		else if(map[Y+1][X]==3) {
			if(map[Y+2][X]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y+1][X]=5;
				map[Y+2][X]=9;
				repaint();
				Y++;
				mystack.push(21);
			}
			else if(map[Y+2][X]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y+1][X]=5;
				map[Y+2][X]=3;
				repaint();
				Y++;
				mystack.push(21);
			}
			else {
				map[Y][X]=5;
				repaint();
			}
		}
		else if(map[Y+1][X]==9) {
			if(map[Y+2][X]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y+1][X]=5;
				map[Y+2][X]=9;
				repaint();
				Y++;
				mystack.push(21);
			}
			else if(map[Y+2][X]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y+1][X]=5;
				map[Y+2][X]=3;
				repaint();
				Y++;
				mystack.push(21);
			}
			else {
				map[Y][X]=5;
				repaint();
			}
		}
		if(map[Y+1][X]==1) {
			map[Y][X]=5;
			repaint();
		}
	}
	void backdown(int t) {
		int cnt = t;
		if(cnt == 20) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9) {
				map[Y][X]=4;
			}
			else
				map[Y][X]=2;
		}
		else if(cnt == 21) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
			{
				map[Y][X]=9;
			}
			else
				map[Y][X]=3;
			if(maptmp[Y+1][X]==4||maptmp[Y+1][X]==9) {
				map[Y+1][X]=4;
			}
			else 
				map[Y+1][X]=2;
		}
		map[Y-1][X]=5;
		repaint();
		Y--;
	}
	void moveleft() {
		if(map[Y][X-1]==2||map[Y][X-1]==4) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
				map[Y][X]=4;
			else
				map[Y][X]=2;
			map[Y][X-1]=6;
			repaint();
			X--;
			mystack.push(30);
		}
		else if(map[Y][X-1]==3) {
			if(map[Y][X-2]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y][X-1]=6;
				map[Y][X-2]=9;
				repaint();
				X--;
				mystack.push(31);
			}
			else if(map[Y][X-2]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y][X-1]=6;
				map[Y][X-2]=3;
				repaint();
				X--;
				mystack.push(31);
			}
			else {
				map[Y][X]=6;
				repaint();
			}
		}
		else if(map[Y][X-1]==9) {
			if(map[Y][X-2]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y][X-1]=6;
				map[Y][X-2]=9;
				repaint();
				X--;
				mystack.push(31);
			}
			else if(map[Y][X-2]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y][X-1]=6;
				map[Y][X-2]=3;
				repaint();
				X--;
				mystack.push(31);
			}
			else {
				map[Y][X]=6;
				repaint();
			}
		}
		if(map[Y][X-1]==1) {
			map[Y][X]=6;
			repaint();
		}
	}
	void backleft(int t)
	{
		int cnt=t;
		if(cnt == 30){
			if(maptmp[Y][X]==4||maptmp[Y][X]==9){
				map[Y][X]=4;
			}
			else 
				map[Y][X]=2;
		}
		else if(cnt==31){
			if(maptmp[Y][X]==4||maptmp[Y][X]==9){
				map[Y][X]=9;
			}
			else 
				map[Y][X]=3;
			if(maptmp[Y][X-1]==4||maptmp[Y][X-1]==9){
				map[Y][X-1]=4;
			}
			else 
				map[Y][X-1]=2;
		}
		map[Y][X+1]=6;
		repaint();
		X++;
	}
	void moveright() {
		if(map[Y][X+1]==2||map[Y][X+1]==4) {
			if(maptmp[Y][X]==4||maptmp[Y][X]==9)
				map[Y][X]=4;
			else
				map[Y][X]=2;
			map[Y][X+1]=7;
			repaint();
			X++;
			mystack.push(40);
		}
		else if(map[Y][X+1]==3) {
			if(map[Y][X+2]==4) {
				if(maptmp[Y][X]==4)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y][X+1]=7;
				map[Y][X+2]=9;
				repaint();
				X++;
				mystack.push(41);
			}
			else if(map[Y][X+2]==2) {
				if(maptmp[Y][X]==4)
					map[Y][X]=4;
				else 
					map[Y][X]=2;
				map[Y][X+1]=7;
				map[Y][X+2]=3;
				repaint();
				X++;
				mystack.push(41);
			}
			else {
				map[Y][X]=7;
				repaint();
			}
		}
		else if(map[Y][X+1]==9) {
			if(map[Y][X+2]==4) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y][X+1]=7;
				map[Y][X+2]=9;
				repaint();
				X++;
				mystack.push(41);
			}
			else if(map[Y][X+2]==2) {
				if(maptmp[Y][X]==4||maptmp[Y][X]==9)
					map[Y][X]=4;
				else
					map[Y][X]=2;
				map[Y][X+1]=7;
				map[Y][X+2]=3;
				repaint();
				X++;
				mystack.push(41);
			}
			else {
				map[Y][X]=7;
				repaint();
			}
		}
		else if(map[Y][X+1]==1) {
			map[Y][X]=7;
			repaint();
		}
	}
	void backright(int t)
	{
		int cnt=t;
		if(cnt == 40){
			if(maptmp[Y][X]==4||maptmp[Y][X]==9){
				map[Y][X]=4;
			}
			else 
				map[Y][X]=2;
		}
		else if(cnt == 41){
			if(maptmp[Y][X]==4||maptmp[Y][X]==9){
				map[Y][X]=9;
			}
			else 
				map[Y][X]=3;
			if(maptmp[Y][X+1]==4||maptmp[Y][X+1]==9){
				map[Y][X+1]=4;
			}
			else 
				map[Y][X+1]=2;
		}
		map[Y][X-1]=7;
		repaint();
		X--;
	}
	//判斷是否通關 遍歷以便看是否要求位置的標號是否存在即可
	boolean win() {
		boolean flag =false;
		out:for(int i = 0;i < 20;i++)
			  for(int j = 0;j< 20; j++) {
				  if(maptmp[i][j]==4||maptmp[i][j]==9)
					  if(map[i][j] == 9)
						  flag = true;
					  else {
						  flag = false;
						  break out;
					  }
			  }
		return flag;
	}
}

地圖類的程式碼:

package xyz.lzw.box;
/**
 * 地圖類
 */
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Map {
	private int level,x,y;
	private int[][] mymap = new int[20][20];
	FileReader r;
	BufferedReader br;
	String b="";
	int t = 0;
	//主要是將地圖檔案匯入到String中 然後改為int型存入到mymap中 存成一個表
	Map(int k){
		level = k;
		String s;
		try {
			File f =new File("maps\\" + level + ".map");
			r = new FileReader(f);
			br = new BufferedReader(r);
		}	catch(IOException e) {
			System.out.println(e);
		}
		
		try {
			while((s=br.readLine())!=null) {
				b = b + s;
			}
		}	catch(IOException g) {
			System.out.println(g);
		}
		byte[] db =b.getBytes();
		int len = b.length();
		int[] x1 = new int[len];
		for(int i = 0;i < b.length();i++)//轉成int型
			x1[i] = db[i] -48;
		for(int i = 0;i < 20;i++) {
			for(int j = 0;j < 20 ;j++) {
				mymap[i][j] = x1[t];
				if(mymap[i][j]==5) {//記錄蟲子當前所在位置
					x = j;
					y = i;
				}
				t++;
			}
		}
	}
	//獲得地圖
	int[][] getmap(){
		return mymap;
	}
	//獲得X
	int getX() {
		return x;
	}
	//獲得Y
	int getY() {
		return y;
	}
}

聲音類:

package xyz.lzw.box;
/**
 * 聲音類
 */
import java.io.File;

import javax.sound.midi.*;

public class Sound {
	String path = new String("musics\\");
	String file = new String("nor.mid");
	Sequence sq;
	Sequencer mid;
	boolean sign;
	//載入音樂
	void loadSound() {
		try {
			sq = MidiSystem.getSequence(new File(path + file));
			mid = MidiSystem.getSequencer();
			mid.open();
			mid.setSequence(sq);
			mid.start();
			mid.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
		}
		catch(Exception exit) {
			exit.printStackTrace();
		}
		sign = true;
	}
	//關閉音樂
	void mystop() {
		mid.stop();
		mid.close();
		sign = false;
	}
	//檢視是否開著音樂
	boolean isplay() {
		return sign;
	}
	//更改音樂
	void setMusic(String e) {
		file = e;
	}
}

測試類:

package xyz.lzw.box;
/**
 * 測試類
 * @author 欒兆威
 *
 */
public class TEXT {
		public static void main(String[] args) {
			new mainFrame();
		}
}

最後附上原始碼 別太嫌棄。。連結: https://pan.baidu.com/s/1IVIK73NbUzlK2SHtk008Yw 提取碼: xe3y   失效後可以私信我