java swing -----推箱子

首先展示下运行结果

(1)首界面

(2)关卡以及选关界面

(3)主要结构

接下来是代码展示

1.MainFrame.java

 

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {
	private JPanel jP;
	private Game game;
	private int level = 1;
	
	private String[] selectionValues = new String[50];
	public MainFrame() {
		// TODO Auto-generated constructor stub
		this.setTitle("我的推箱子游戏");
		this.setSize(800,600);
		int screenwidth = Toolkit.getDefaultToolkit().getScreenSize().width;
		int screenheight = Toolkit.getDefaultToolkit().getScreenSize().height;
		int windowwidth = this.getSize().width;
		int windowheight = this.getSize().height;
		this.setLocation((screenwidth-windowwidth)/2, (screenheight-windowheight)/2);
		this.jP = new Huaban();
		jP.setLayout(null);
		JButton jbstart = new JButton("开始游戏");
		jbstart.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				startGame();
			}
		});
		JButton jbend = new JButton("结束游戏");
		jbend.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
		JButton jbreadme = new JButton("操作说明");
		jbreadme.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				JOptionPane.showMessageDialog(MainFrame.this, "人物移动:方向键上下左右+\n后退一步:空格键");
			}
		});
		jbstart.setBounds(630, 350, 100, 30);
		jbend.setBounds(630, 400, 100, 30);
		jbreadme.setBounds(630, 450, 100, 30);
		jP.add(jbstart);
		jP.add(jbend);
		jP.add(jbreadme);
		this.add(jP);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		for (int i = 0; i <50; i++) {
			selectionValues[i] = "第"+(i+1)+"关";
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MainFrame();		
	}
	
	public void startGame(){
		
		this.remove(jP);
		this.setLayout(null);
		JPanel jp1 = new JPanel(){
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				ImageIcon img = new ImageIcon(this.getClass().getClassLoader().getResource("imgs/toolImg.png"));
				g.drawImage(img.getImage(), 0, 0, this);
			}
		};
		jp1.setBounds(600, 0, 200, 600);
		 
		jp1.setLayout(null);
		jp1.setBounds(600, 0, 200, 600);
		this.add(jp1);
		
		JButton jb2 = new JButton("后退一步");
		jp1.add(jb2);
		jb2.setBounds(50, 200, 100, 30);
		jb2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				
				game.Back();
			}
		});
		
		JButton jb3 = new JButton("上一关");
		jp1.add(jb3);
		jb3.setBounds(50, 250, 100, 30);
		jb3.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if(level>1)
				game.goBack(--level);
			}
		});

		JButton jb4 = new JButton("下一关");
		jp1.add(jb4);
		jb4.setBounds(50, 300, 100, 30);
		jb4.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if(level<50)
				game.goNext(++level);
				
			}
		});
		
		JButton jb5 = new JButton("选关");
		jp1.add(jb5);
		jb5.setBounds(50, 350, 100, 30);
		jb5.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
			String temp = 	(String) JOptionPane.showInputDialog(MainFrame.this, "请选择关卡",	"关卡选择", JOptionPane.WARNING_MESSAGE, null, selectionValues,selectionValues[0]);
				for(int i=0;i<50;i++){
					if(selectionValues[i].equals(temp)){
						level = i+1;
						game.choose(level);
					}
				}
			}
		});
		JButton jb6 = new JButton("重新开始");
		jp1.add(jb6);
		jb6.setBounds(50, 400, 100, 30);
		jb6.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
				game.restart();
			}
		});
		JButton jb7 = new JButton("退出游戏");
		jp1.add(jb7);
		jb7.setBounds(50, 450, 100, 30);
		
		jb7.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});		
		this.add(jp1);
		this.game = new Game(this.level);
		this.add(game);
		this.game.addKeyListener(new MykeyListener());
		this.game.requestFocus();
		this.repaint();
		
	}
	class MykeyListener extends KeyAdapter{
		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			super.keyReleased(e);
			game.add(e);
		}
	}

}


2.Huaban.java主要是用于绘制登录界面的那个图

 

 

package com.pushbox;


import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Huaban extends JPanel {

	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		ImageIcon  img = new ImageIcon(this.getClass().getClassLoader().getResource("imgs/backgroundImg.png"));
		g.drawImage(img.getImage(), 0, 0, this);
		
	}
}

 

 

3.LoadMap.java  主要是加载地图

 

package com.pushbox;

import java.io.*;



public class LoadMap {
	private int[][] map = new int[20][20];
	private int level;
	private int manx,many;
	

	public int getManx() {
		return manx;
	}

	public int getMany() {
		return many;
	}

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

	public LoadMap() {
		// TODO Auto-generated constructor stub
	}

	public LoadMap(int level) {
		// TODO Auto-generated constructor stub
		this.level = level;

		File file = new File("maps/" + this.level + ".map");

		FileReader fr = null;
		BufferedReader brf;
		try {
			fr = new FileReader(file);
			brf = new BufferedReader(fr);
			for (int i = 0; i < 20; i++) {

				String line = brf.readLine();

				for (int j = 0; j < 20; j++) {
					byte[] temp = line.getBytes();
					map [i][j] = temp[j]-48;
					if(map[i][j]==5||map[i][j]==6||map[i][j]==7||map[i][j]==8){
						this.manx = i;
						this.many = j;
					}
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(fr!=null){
				try {
					fr.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}


4.backupInfo.java 主要是实现后退一步

 

 

package com.pushbox;

public class backupInfo {
	private int [][] backupmap;
	private int manx;
	private int many;
	private int lastimg;
	public int[][] getBackupmap() {
		return backupmap;
	}
	public void setBackupmap(int[][] backupmap) {
		this.backupmap = backupmap;
	}
	public int getManx() {
		return manx;
	}
	public void setManx(int manx) {
		this.manx = manx;
	}
	public int getMany() {
		return many;
	}
	public void setMany(int many) {
		this.many = many;
	}
	public int getLastimg() {
		return lastimg;
	}
	public void setLastimg(int lastimg) {
		this.lastimg = lastimg;
	}
	public backupInfo(int[][] backupmap, int manx, int many, int lastimg) {
		super();
		this.backupmap = backupmap;
		this.manx = manx;
		this.many = many;
		this.lastimg = lastimg;
	}
	public backupInfo() {
		super();
	}
	
}


5.Game.java主要是实现游戏中移动,通关功能

 

 

package com.pushbox;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Stack;

import javax.swing.*;


@SuppressWarnings("serial")
public class Game extends JPanel {
	private LoadMap lm;
	private int level;
	private int manx, many;

	private int[][] ditu;
	private int lastimg = 2;
	
	private Stack<backupInfo> myStack = new Stack<>();
	private Image[] imgs = {
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/0.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/1.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/2.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/3.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/4.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/5.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/6.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/7.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/8.gif")),
			Toolkit.getDefaultToolkit().getImage(Game.class.getClassLoader().getResource("imgs/9.gif")),

	};

	public Game(int level) {
		this.setBounds(0, 0, 600, 600);
		this.level = level;
		this.lm = new LoadMap(this.level);
		this.ditu = this.lm.getMap();
		this.manx = this.lm.getManx();
		this.many = this.lm.getMany();

	}

	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 20; j++) {
				g.drawImage(imgs[ditu[i][j]], i * 30, j * 30, this);
			}
		}
		g.setColor(Color.RED);
		g.setFont(new Font("微软雅黑", Font.BOLD, 26));
		g.drawString("第"+this.level+"关", 50, 50);
	}

	public void add(KeyEvent e) {
		// TODO Auto-generated method stub
		switch (e.getKeyCode()) {
		case KeyEvent.VK_UP:
			MoveUp();
			if (isPass()) {
				this.lm = new LoadMap(++this.level);
				this.ditu = this.lm.getMap();
				this.manx = this.lm.getManx();
				this.many = this.lm.getMany();
				this.myStack.clear();

			}
			break;
		case KeyEvent.VK_DOWN:
			MoveDown();
			if (isPass()) {
				this.lm = new LoadMap(++this.level);
				this.ditu = this.lm.getMap();
				this.manx = this.lm.getManx();
				this.many = this.lm.getMany();
				this.myStack.clear();
			}
			break;
		case KeyEvent.VK_LEFT:
			MoveLeft();
			if (isPass()) {
				this.lm = new LoadMap(++this.level);
				this.ditu = this.lm.getMap();
				this.manx = this.lm.getManx();
				this.many = this.lm.getMany();
				this.myStack.clear();
			}
			break;
		case KeyEvent.VK_RIGHT:
			MoveRight();
			if (isPass()) {
				this.lm = new LoadMap(++this.level);
				this.ditu = this.lm.getMap();
				this.manx = this.lm.getManx();
				this.many = this.lm.getMany();
				this.myStack.clear();
			}
			break;
		default:
			break;
		}
	}

	private boolean isPass() {
		boolean isPass = true;
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 20; j++) {
				if (ditu[i][j] == 3) {
					isPass = false;
				}
			}
		}
		return isPass;
	}

	private void MoveRight() {
		if (this.ditu[manx + 1][many] == 2 || this.ditu[manx + 1][many] == 4) {
			Back1();
			this.ditu[manx][many] = this.lastimg;
			this.lastimg = this.ditu[manx + 1][many];
			this.ditu[manx + 1][many] = 7;
			this.manx++;

		} else if (this.ditu[manx + 1][many] == 3 || this.ditu[manx + 1][many] == 9) {
			Back1();
			if (this.ditu[manx + 2][many] == 2) {
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx + 1][many] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx + 2][many] = 3;
				this.ditu[manx + 1][many] = 7;
				this.manx++;

			} else if (this.ditu[manx + 2][many] == 4) {
				Back1();
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx + 1][many] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx + 2][many] = 9;
				this.ditu[manx + 1][many] = 7;
				this.manx++;

			}
		}
		this.repaint();
	}


	private void MoveLeft() {
		if (this.ditu[manx - 1][many] == 2 || this.ditu[manx - 1][many] == 4) {
			Back1();
			this.ditu[manx][many] = this.lastimg;
			this.lastimg = this.ditu[manx - 1][many];
			this.ditu[manx - 1][many] = 6;
			this.manx--;

		} else if (this.ditu[manx - 1][many] == 3 || this.ditu[manx - 1][many] == 9) {
			Back1();
			if (this.ditu[manx - 2][many] == 2) {
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx - 1][many] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx - 2][many] = 3;
				this.ditu[manx - 1][many] = 6;
				this.manx--;

			} else if (this.ditu[manx - 2][many] == 4) {
				Back1();
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx - 1][many] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx - 2][many] = 9;
				this.ditu[manx - 1][many] = 6;
				this.manx--;

			}
		}
		this.repaint();
	}

	private void MoveDown() {
		if (this.ditu[manx][many + 1] == 2 || this.ditu[manx][many + 1] == 4) {
			Back1();
			this.ditu[manx][many] = this.lastimg;
			this.lastimg = this.ditu[manx][many + 1];
			this.ditu[manx][many + 1] = 5;
			this.many++;

		} else if (this.ditu[manx][many + 1] == 3 || this.ditu[manx][many + 1] == 9) {
			Back1();
			if (this.ditu[manx][many + 2] == 2) {
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx][many + 1] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx][many + 2] = 3;
				this.ditu[manx][many + 1] = 5;
				this.many++;

			} else if (this.ditu[manx][many + 2] == 4) {
				Back1();
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx][many + 1] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx][many + 2] = 9;
				this.ditu[manx][many + 1] = 5;
				this.many++;

			}
		}
		this.repaint();
	}

	private void MoveUp() {
		if (this.ditu[manx][many - 1] == 2 || this.ditu[manx][many - 1] == 4) {
			Back1();
			this.ditu[manx][many] = this.lastimg;
			this.lastimg = this.ditu[manx][many - 1];
			this.ditu[manx][many - 1] = 8;
			this.many--;

		} else if (this.ditu[manx][many - 1] == 3 || this.ditu[manx][many - 1] == 9) {
			Back1();
			if (this.ditu[manx][many - 2] == 2) {
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx][many - 1] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx][many - 2] = 3;
				this.ditu[manx][many - 1] = 8;
				this.many--;

			} else if (this.ditu[manx][many - 2] == 4) {
				Back1();
				this.ditu[manx][many] = this.lastimg;
				if (this.ditu[manx][many - 1] == 3)
					this.lastimg = 2;
				else
					this.lastimg = 4;
				this.ditu[manx][many - 2] = 9;
				this.ditu[manx][many - 1] = 8;
				this.many--;

			}
		}
		this.repaint();
	}

	// 下一关
	public void goNext(int level) {
		// TODO Auto-generated method stub
		this.level = level;
		this.lm = new LoadMap(level);
		this.ditu = this.lm.getMap();
		this.manx = this.lm.getManx();
		this.many = this.lm.getMany();
		this.repaint();
		this.requestFocus();

	}

	// 上一关
	public void goBack(int level) {
		// TODO Auto-generated method stub
		this.level = level;
		this.lm = new LoadMap(level);
		this.ditu = this.lm.getMap();
		this.manx = this.lm.getManx();
		this.many = this.lm.getMany();
		this.repaint();
		this.requestFocus();

	}
	
	private void Back1() {
		int[][] temp = new int[20][20];
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 20; j++) {
				temp[i][j] = this.ditu[i][j];
			}
		}
		backupInfo bi = new backupInfo(temp, manx, many, lastimg);
		this.repaint();
		this.requestFocus();
		this.myStack.push(bi);
	}
	public void Back() {
		// TODO Auto-generated method stub
		if(!this.myStack.isEmpty()){
			backupInfo temp = this.myStack.pop();
			this.ditu = temp.getBackupmap();
			this.manx = temp.getManx();
			this.many = temp.getMany();
			this.lastimg = temp.getLastimg();
			this.repaint();
		}
		this.requestFocus();
	}

	public void restart() {
		// TODO Auto-generated method stub
		this.lm = new LoadMap(this.level);
		this.ditu = this.lm.getMap();
		this.manx = this.lm.getManx();
		this.many = this.lm.getMany();
		this.lastimg = 2;
		this.repaint();
		this.requestFocus();
		this.myStack.clear();
	}

	public void choose(int level) {
		// TODO Auto-generated method stub
		this.level = level;
		this.lm = new LoadMap(level);
		this.ditu = this.lm.getMap();
		this.manx = this.lm.getManx();
		this.many = this.lm.getMany();
		this.lastimg = 2;
		this.repaint();
		this.requestFocus();
		this.myStack.clear();
	}

}


最后完整代码在我的百度网盘,图片材料都在里面

 

链接:https://pan.baidu.com/s/1c2bIaSK 密码:ixjj
 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值