首先展示下运行结果
(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