Java实战推箱子——菜鸟之路

    当时找了很久也没找到几个实战的教程视频,最后还是花了半天看了网络上的一些源码和思路然后来写了这个。总体感觉自己写的还是很烂,写这个的时候自己并没有写地图,而是引用了网络上的地图(用0~9来标记不同的图真的是给绘制地图较低了很大一部分难度)。

    先来说一下要来做什么,我们想要实现的就是传统的推箱子小游戏。那传统的推箱子小游戏有什么,他的背景很大,并且你需要不同的地方来标志你的地图,以下列我所写的程序为例。传统的推箱子游戏(恩。。我记得当年小时候的直板手机上就是有这些功能),可以根据用户的要求,跳到第一关,上一关,下一关,最后一关,也可以重新开始,悔棋,选关等操作。这里想问一个问题为什么按钮只要写四个字就会只显示两个字其他都隐藏呢。。我改了按钮大小当时也是这种情况比较迷。

Java实战推箱子——菜鸟之路_第1张图片

  说了这么多废话还是总结一下,我们需要实现的需求吧。

  1.用户界面上的一些东西

  (1)存在一个选项菜单栏,我们需要给出如下子菜单功能的实现。重新开始、上一关、下一关、选择关卡、悔一步、退出。当然还包括一个分割线。

Java实战推箱子——菜鸟之路_第2张图片

  (2)存在一个设置音乐菜单栏,存在你所写的歌的名称,我的就很low的一下这几个了。当然他们是互斥的,所以当点下一歌菜单栏按钮时,你需要从视觉上反馈给用户当前正在播放的音乐是什么。

Java实战推箱子——菜鸟之路_第3张图片

  (3)存在一个帮助菜单栏,下面有个名叫关于此游戏的选项,恩。。。这个就胡乱蹦出一个信息就好,比如一个消息对话框。

Java实战推箱子——菜鸟之路_第4张图片

  (4)就是对应操作的一些按钮了。在这里添加了,重玩,悔一步,第一关,上一关,下一关,选关,最终关,音乐关 恩点一下它可以变为音乐开(意思就是关闭音乐,打开音乐 我这里因为我的low 写不出四个以上的字就用了三个字代替)。

Java实战推箱子——菜鸟之路_第5张图片

  (5)还有一个就是更换音乐的一个下拉菜单了。这个也没什么好讲的。至于这个黄色的“更换音乐”,直接显示文字就好。

  (6)每次通关后要蹦出一个消息对话框问你是否进入下一关

Java实战推箱子——菜鸟之路_第6张图片

  2.就是地图也就是画板了 我这里定义了一个20*20这么多的小图片拼成的地图。emmm。。。个人没什么审美 丑的一p。

Java实战推箱子——菜鸟之路_第7张图片

  这里不做过多的赘述,要讲的基本上我都在代码的注释里讲了。就多说几句关于这个游戏判断的东西吧,这里使用的方法是用不同的数字来代表不同的图片,也就是不同的方块,这样更加方便我们去进行移动和生成地图,还有判断输赢。个人感觉这个游戏只要看一看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   失效后可以私信我

你可能感兴趣的:(java菜鸟之路)