java做的 推箱子游戏 源码 box.dat 游戏地图数据文件
MainFrame.java 游戏主程序类
BaseBox.java 界面组件类
Build.java 可独立运行的地图生成器程序另外还需要 30*30的gif文件清单如下:(没有图像文件则看不到效果了)
box.gif
ok.gif
pot.gif
qiang.gif
ren.gif打包下载地址:http://home.126disk.com/microsoftsun附源码如下:(如果下载不了,请等几小时,因为刚上传的文件在审核中)1、地图数据文件
########################## box.dat #####################
8,9
40,32
24,49
39
48,47,58,59,60,51,50,41,42,33,25,16,15,14,23,22,31,30
10,11
62,64,65,87,73,83
50,39,41,37,27,29
17
15,16,18,19,20,31,42,40,30,28,38,24,25,26,35,36,61,72,82,71,84,85,86,75,76,63,96,97
10,8
43,45,46,62,68
36,28,19,21,30
12
10,11,13,14,22,23,31,29,27,20,26,18,42,44,54,70,69,61,53,52,51,59,67,66,58,50
8,8
27,28,30,46
19,36,21,37
12
11,26,34,35,44,52,53,54,38,31,23,22,13,29
8,9
56,57,39,38,47
30,49,41,43,34
48
58,59,50,51,52,35,26,25,24,33,32,31,22,13,12,11,20,29
10,16
34,22,54,59,47,109
35,21,117,125,94,62
137
18,19,20,36,37,38,39,23,70,53,69,85,101,86,102,130,131,132,133,134,135,136,138,139,140,141,142,143,110,93,77,78,61,60,63,46,45,44,43
7,12
63,64,65,66,68,69
54,42,30,44,56,39
67
62,50,38,40,41,29,31,32,20,19,43,52,45,34,35,47,59,58,70,46
9,8
27,29,45
36,30,53
61
19,26,34,35,37,38,39,22,21,13,12,20,28,47,55,54
8,8
36,30,31
27,43,22
19
18,10,11,12,20,21,14,15,23,39,47,46,38,45,44,52,51,35
9,9
50,51,52,42
39,58,61,23
22
13,14,15,24,33,43,53,62,70,69,68,59,57,48,49,41,31,30,29,20,21
7,9
24,33,42
22,40,43
11
12,13,23,25,26,35,44,51,50,49,31,39,30,29,20,32
8,9
39,31,23,33,43,51,41,49
30,22,32,24,34,42,50,40
14
12,13,15,25,26,35,52,60,59,58,48,38,29,20,21
8,8
28,14,20
36,29,38
44
12,13,15,21,23,31,30,45,46,35,27,19
8,8
13,21,35
36,37,30
14
15,23,31,38,44,43,27,28,29,12,11,19
8,8
20,36,52
21,19,43
14
13,22,30,29,28,27,26,35,44,51,18
8,8
11,15,23
28,29,37
31
39,47,46,38,30,22,21,36,44,52,51,43,35,19,27
8,8
26,42,51
45,29,30
14
27,34,43,35,36,37,38,44,52,53,21,13,22,23,31
8,8
10,18,12
20,21,35
29
11,28,27,26,34,43,44,45,37,38,30,22
8,8
26,29,20
35,28,30
12
27,19,11,13,21,22,23,31,37,45,44,43
8,8
23,39,30
22,46,43
54
52,44,51,50,42,45,47,55,37,29,28,36,31,15,14
8,8
20,38,55
21,29,23
47
54,53,52,44,45,46,39,31,15,14,22,30,28,12,11,10,18,26,27
8,8
50,51,42
36,28,30
14
15,23,22,21,13,29,37,38,46,54,53,52,44,43,35,27
6,19
24,25,26,34,33,32
53,54,55,43,42,41
29
21,22,23,27,28,30,31,35,36,37,56,52,51,72,73,74,93,92,40,44,45,62,81,80,61,60
8,7
25,39,34
32,40,19
27
20,12,11,18,17,16,23,30,37,38,45,46,47,41,33
7,9
21,31,33,25
32,23,39,43
50
49,51,42,44,35,26,24,15,14,13,22,40,38,29,20
9,9
31,41,33,49,60
50,43,32,24,40
42
67,68,69,58,51,61,62,53,44,15,14,13,22,30,29,38,47,48
11,14
21,22,23,37,51,50,52,53,54,55,39,26,67,68,79,78
65,63,61,73,88,102,101,103,116,118,105,120,107,122,109,124
110
35,49,48,47,46,60,59,58,72,86,87,100,114,115,129,130,131,132,133,134,135,136,137,138,125,111,96,95,108,123,121,119,117,104,106,91,90,89,62,64,24,25,27,41,40
8,13
42,68,84,87,35,32
55,56,43,73,61,75
82
80,67,81,83,85,86,88,76,63,64,51,50,37,36,22,21,20,19,31,30,29,28,41,69,57,70,60,59,62,48,47,46
12,9
23,24,50,51,68,70,79
22,25,49,52,60,76,87
43
34,35,26,15,14,13,21,20,29,38,47,48,40,31,58,67,69,78,88,61,97,96,86,85
10,12
40,41,53,65,77,64,80,56,57,44
39,29,42,32,68,70,66,89,92,75
67
74,62,63,51,27,28,30,18,19,31,43,76,78,90,91,101,102,93,81,69,71,59,58,45,33
########################## 2 MainFrame.java #####################
########################## MainFrame.java #####################
########################## MainFrame.java #####################import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;public class MainFrame extends JFrame implements KeyListener,ActionListener,Runnable {
List pid = new ArrayList(); //目标地点id
List bid = new ArrayList(); //箱子id
List sid = new ArrayList(); //空间id
List qid = new ArrayList(); //墙id
String rid = "";
int rows = 0;
int cols = 0;
int px, py; //人初始位置
int x ,y ,w = 30 ,h = 30;
BaseBox ren;
int rrx, rry, bbx, bby;//撤消位置
int bindex = -1;
boolean isOver = false;
int count;
HashMap map = new HashMap(); //所有物体的集合
//集合中key是特体的序号,value是物体BoaseBox对象
int lvl = 1; //第1关
Container main ;
JButton reset = new JButton("重玩");
JButton next = new JButton("下一关");
JButton goback = new JButton("上一关");
JButton back = new JButton("后悔");
JButton exit = new JButton("退出");
JLabel mesLvl = new JLabel("第 1 关");
JLabel numlvl = new JLabel("");
JLabel timelvl = new JLabel("");
int times = 0;//时间限制
int btime = 60;
Thread thread = null;
太长了,贴子不让发。你们自己去 http://home.126disk.com/microsoftsun 下载吧。
MainFrame.java 游戏主程序类
BaseBox.java 界面组件类
Build.java 可独立运行的地图生成器程序另外还需要 30*30的gif文件清单如下:(没有图像文件则看不到效果了)
box.gif
ok.gif
pot.gif
qiang.gif
ren.gif打包下载地址:http://home.126disk.com/microsoftsun附源码如下:(如果下载不了,请等几小时,因为刚上传的文件在审核中)1、地图数据文件
########################## box.dat #####################
8,9
40,32
24,49
39
48,47,58,59,60,51,50,41,42,33,25,16,15,14,23,22,31,30
10,11
62,64,65,87,73,83
50,39,41,37,27,29
17
15,16,18,19,20,31,42,40,30,28,38,24,25,26,35,36,61,72,82,71,84,85,86,75,76,63,96,97
10,8
43,45,46,62,68
36,28,19,21,30
12
10,11,13,14,22,23,31,29,27,20,26,18,42,44,54,70,69,61,53,52,51,59,67,66,58,50
8,8
27,28,30,46
19,36,21,37
12
11,26,34,35,44,52,53,54,38,31,23,22,13,29
8,9
56,57,39,38,47
30,49,41,43,34
48
58,59,50,51,52,35,26,25,24,33,32,31,22,13,12,11,20,29
10,16
34,22,54,59,47,109
35,21,117,125,94,62
137
18,19,20,36,37,38,39,23,70,53,69,85,101,86,102,130,131,132,133,134,135,136,138,139,140,141,142,143,110,93,77,78,61,60,63,46,45,44,43
7,12
63,64,65,66,68,69
54,42,30,44,56,39
67
62,50,38,40,41,29,31,32,20,19,43,52,45,34,35,47,59,58,70,46
9,8
27,29,45
36,30,53
61
19,26,34,35,37,38,39,22,21,13,12,20,28,47,55,54
8,8
36,30,31
27,43,22
19
18,10,11,12,20,21,14,15,23,39,47,46,38,45,44,52,51,35
9,9
50,51,52,42
39,58,61,23
22
13,14,15,24,33,43,53,62,70,69,68,59,57,48,49,41,31,30,29,20,21
7,9
24,33,42
22,40,43
11
12,13,23,25,26,35,44,51,50,49,31,39,30,29,20,32
8,9
39,31,23,33,43,51,41,49
30,22,32,24,34,42,50,40
14
12,13,15,25,26,35,52,60,59,58,48,38,29,20,21
8,8
28,14,20
36,29,38
44
12,13,15,21,23,31,30,45,46,35,27,19
8,8
13,21,35
36,37,30
14
15,23,31,38,44,43,27,28,29,12,11,19
8,8
20,36,52
21,19,43
14
13,22,30,29,28,27,26,35,44,51,18
8,8
11,15,23
28,29,37
31
39,47,46,38,30,22,21,36,44,52,51,43,35,19,27
8,8
26,42,51
45,29,30
14
27,34,43,35,36,37,38,44,52,53,21,13,22,23,31
8,8
10,18,12
20,21,35
29
11,28,27,26,34,43,44,45,37,38,30,22
8,8
26,29,20
35,28,30
12
27,19,11,13,21,22,23,31,37,45,44,43
8,8
23,39,30
22,46,43
54
52,44,51,50,42,45,47,55,37,29,28,36,31,15,14
8,8
20,38,55
21,29,23
47
54,53,52,44,45,46,39,31,15,14,22,30,28,12,11,10,18,26,27
8,8
50,51,42
36,28,30
14
15,23,22,21,13,29,37,38,46,54,53,52,44,43,35,27
6,19
24,25,26,34,33,32
53,54,55,43,42,41
29
21,22,23,27,28,30,31,35,36,37,56,52,51,72,73,74,93,92,40,44,45,62,81,80,61,60
8,7
25,39,34
32,40,19
27
20,12,11,18,17,16,23,30,37,38,45,46,47,41,33
7,9
21,31,33,25
32,23,39,43
50
49,51,42,44,35,26,24,15,14,13,22,40,38,29,20
9,9
31,41,33,49,60
50,43,32,24,40
42
67,68,69,58,51,61,62,53,44,15,14,13,22,30,29,38,47,48
11,14
21,22,23,37,51,50,52,53,54,55,39,26,67,68,79,78
65,63,61,73,88,102,101,103,116,118,105,120,107,122,109,124
110
35,49,48,47,46,60,59,58,72,86,87,100,114,115,129,130,131,132,133,134,135,136,137,138,125,111,96,95,108,123,121,119,117,104,106,91,90,89,62,64,24,25,27,41,40
8,13
42,68,84,87,35,32
55,56,43,73,61,75
82
80,67,81,83,85,86,88,76,63,64,51,50,37,36,22,21,20,19,31,30,29,28,41,69,57,70,60,59,62,48,47,46
12,9
23,24,50,51,68,70,79
22,25,49,52,60,76,87
43
34,35,26,15,14,13,21,20,29,38,47,48,40,31,58,67,69,78,88,61,97,96,86,85
10,12
40,41,53,65,77,64,80,56,57,44
39,29,42,32,68,70,66,89,92,75
67
74,62,63,51,27,28,30,18,19,31,43,76,78,90,91,101,102,93,81,69,71,59,58,45,33
########################## 2 MainFrame.java #####################
########################## MainFrame.java #####################
########################## MainFrame.java #####################import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;public class MainFrame extends JFrame implements KeyListener,ActionListener,Runnable {
List pid = new ArrayList(); //目标地点id
List bid = new ArrayList(); //箱子id
List sid = new ArrayList(); //空间id
List qid = new ArrayList(); //墙id
String rid = "";
int rows = 0;
int cols = 0;
int px, py; //人初始位置
int x ,y ,w = 30 ,h = 30;
BaseBox ren;
int rrx, rry, bbx, bby;//撤消位置
int bindex = -1;
boolean isOver = false;
int count;
HashMap map = new HashMap(); //所有物体的集合
//集合中key是特体的序号,value是物体BoaseBox对象
int lvl = 1; //第1关
Container main ;
JButton reset = new JButton("重玩");
JButton next = new JButton("下一关");
JButton goback = new JButton("上一关");
JButton back = new JButton("后悔");
JButton exit = new JButton("退出");
JLabel mesLvl = new JLabel("第 1 关");
JLabel numlvl = new JLabel("");
JLabel timelvl = new JLabel("");
int times = 0;//时间限制
int btime = 60;
Thread thread = null;
太长了,贴子不让发。你们自己去 http://home.126disk.com/microsoftsun 下载吧。
main = this.getContentPane();
main.setLayout(null);
this.setTitle("Java版推箱子");
reset.setBounds(195,10,70,25);
goback.setBounds(45,10,75,25);
next.setBounds(120,10, 75,25);
back.setBounds(265,10,70,25);
exit.setBounds(340,10,70,25);
mesLvl.setBounds(200,50, 120,30);
timelvl.setBounds(320,50, 120,30);
numlvl.setBounds(100,60,100,25);
timelvl.setFont(new Font("Snap ITC",0, 25));
timelvl.setForeground(Color.red);
mesLvl.setFont(new Font("方正姚体",0, 26));
numlvl.setFont(new Font("宋体",0, 18));
numlvl.setForeground(Color.blue);
next.addActionListener(this);
back.addActionListener(this);
exit.addActionListener(this);
goback.addActionListener(this);
this.setDefaultCloseOperation(3);
reset.addActionListener(this);
reset.addKeyListener(this);
back.addKeyListener(this);
goback.addKeyListener(this);
exit.addKeyListener(this);
next.addKeyListener(this);
this.addKeyListener(this);
int w1 = 700, h1 = 500;
this.setSize(new Dimension(w1,h1));
int x1 = (Toolkit.getDefaultToolkit().getScreenSize().width - w1) / 2;
int y1 = (Toolkit.getDefaultToolkit().getScreenSize().height - h1) / 2;
setBounds(x1,y1,w1,h1);
setVisible(true);
new DialogTime(this);
init();
}
void init(){
//读取文件,获取地图数据
if ( !getMap() ){
mesLvl.setText("第 " + lvl + " 关");
return;
}
times = btime*pid.size();//每个箱子30秒
count = 0; //一共进行了多少步
main.removeAll();
main.add(reset);
main.add(goback);
main.add(next);
main.add(back);
main.add(exit);
main.add(mesLvl);
numlvl.setText("已进行" + count + "步");
main.add(numlvl);
timelvl.setText("" + times);
main.add(timelvl);
back.setEnabled(false);
reset.requestFocus(true);
mesLvl.setText("第 " + lvl + " 关");
isOver = false;
int xx = 80;
int yy = 100;
int _type = 0;
for ( int i = 0; i < rows*cols; i ++ ){
if ( pid.contains("" + (i+1)) ){
_type = 0;
}else if ( bid.contains("" + (i+1))){ //箱子
_type = 1;
}else if ( rid.equals("" + (i+1))){ //人位
_type = 2;
}else if ( sid.contains("" + (i+1))){ //空间
_type = 3;
}else if ( qid.contains("" + (i+1))){
_type = 4;
}
if ( _type != 3 ){
BaseBox b = new BaseBox(_type,xx,yy);
map.put("" + (i+1), b);
if ( rid.equals("" + (i+1))){
ren = b;
px = xx; py = yy; x = xx; y = yy;
main.add(ren);
}
}
if ( (i+1)% cols == 0 ){
yy += 30;
xx = 80;
}
else {
xx += 30;
}
}
Vector vv = new Vector(map.values());
for ( int i = 0; i < vv.size(); i ++ ){
BaseBox b = (BaseBox) vv.get(i);
if ( b.type == 1 ){
main.add(b);
}
}
for ( int i = 0; i < vv.size(); i ++ ){
BaseBox b = (BaseBox) vv.get(i);
if ( b.type == 0 ){
main.add(b);
}
}
for ( int i = 0; i < vv.size(); i ++ ){
BaseBox b = (BaseBox) vv.get(i);
if ( b.type == 3 ){
main.add(b);
}
}
for ( int i = 0; i < vv.size(); i ++ ){
BaseBox b = (BaseBox) vv.get(i);
if ( b.type == 4 ){
main.add(b);
}
}
this.repaint();
if ( thread != null && thread.isAlive() )
thread.stop();
thread = new Thread(this);
thread.start();
reset.requestFocus(true);
}
if ( lvl < 1 ){
JOptionPane.showMessageDialog(this,"这已经是第一关了!");
lvl = 1;
return false;
}
try {
InputStream in = this.getClass().getResourceAsStream("/box.dat");
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
for ( int i = 0; i < (lvl-1)*5; i ++ ){
br.readLine();
}
String[] line = br.readLine().trim().split(",");
rows = Integer.parseInt(line[0]);
cols = Integer.parseInt(line[1]);
pid.clear(); bid.clear(); sid.clear(); qid.clear(); map.clear();
line = br.readLine().trim().split(",");
for ( int i = 0; i < line.length; i ++ ){
pid.add(line[i]);
}
line = br.readLine().trim().split(",");
for ( int i = 0; i < line.length; i ++ ){
bid.add(line[i]);
}
rid = br.readLine().trim();
line = br.readLine().trim().split(",");
for ( int i = 0; i < line.length; i ++ ){
sid.add(line[i]);
}
for ( int i = 1; i <= rows*cols; i ++ ){
String si = "" + i;
if ( !rid.equals(si) && !pid.contains(si) && ! bid.contains(si) && ! sid.contains(si)){
qid.add(si);
}
}
br.close();
isr.close();
in.close();
} catch (Exception e) {
System.out.println("数据文件不存在或数据为空!");
JOptionPane.showMessageDialog(this,"这已经是最后一关了!");
lvl --; return false;
}
return true;
}
public void keyPressed(KeyEvent e) {
if ( isOver ){
back.setEnabled(false);
return;
}
int c = e.getKeyCode();
if ( c != 37 && c != 38 && c != 39 && c != 40 )
return;
int rx = x;
int ry = y;
if ( c == 37 ){
x -= 30;
}else if ( c == 38 ){
y -= 30;
}else if ( c == 39 ){
x += 30;
}else if ( c == 40 ){
y += 30;
}
bindex = -1;
Vector v = new Vector(map.values());
for ( int i = 0; i < v.size(); i ++ ){
BaseBox temp = (BaseBox) v.get(i);
if ( x == temp.getX() && y == temp.getY()){
//前面是墙走不动
if ( temp.type == 4 ){
x = rx; y = ry;
bindex = -1;
return;
}
//前面是箱子,判断箱子前面是什么
else if ( temp.type == 1 ){
int nx = 30; int ny = 30;
//先要知道用户是向左还是上还是右还是下
if ( rx > x ){
nx = -30;
ny = 0;
} else if ( rx < x ){
ny = 0;
}
if ( ry > y ){
ny = -30;
nx = 0;
} else if ( ry < y ){
nx = 0;
}
int tx = x + nx; int ty = y + ny;
boolean fg = false; //是否换图像
for ( int j = 0; j < v.size(); j ++ ){
BaseBox obj = (BaseBox) v.get(j);
if ( tx == obj.getX() && ty == obj.getY() ){
//前面是墙或箱子,推不动
if ( obj.type == 4 || obj.type == 1 ){
x = rx; y = ry;
return;
}
else if ( obj.type == 0 ){
//检查这个目的点上有没有箱子
boolean ck = false;
for ( int k = 0; k < v.size(); k ++){
if ( k == j ) continue;
BaseBox kb = (BaseBox) v.get(k);
if ( kb.getX() == obj.getX() && kb.getY() == obj.getY() && kb.type == 1){
ck = true; break;
}
}
if ( ck){
x = rx; y = ry; return;
}
fg = true;
break;
}else {
break;
}
}
}
if ( fg ) {
temp.setImg("ok.gif");
temp.repaint();
}
else if ( temp.getFileName().equals("ok.gif")){
temp.setImg("box.gif");
temp.repaint();
}
//可以移动箱子
bbx = temp.getX(); bby = temp.getY();
bindex = i;
temp.move(tx, ty);
}
}
}
ren.move(x, y);
count ++;
this.numlvl.setText("已进行" + count + "步");
rrx = rx; rry = ry;
back.setEnabled(true);
if ( check()){
isOver = true;
JOptionPane.showMessageDialog(this, "恭喜,过关!您一共推了 " + count + " 步。");
}
}
int cnt = 0;
Vector v = new Vector(map.values());
Vector bv = new Vector();
Vector pv = new Vector();
for ( int i = 0; i < v.size(); i ++ ){
BaseBox temp = (BaseBox) v.get(i);
if ( temp.type == 1){
bv.add(temp);
}else if ( temp.type == 0 ){
pv.add(temp);
}
}
for ( int i = 0; i < bv.size(); i ++ ){
BaseBox temp = (BaseBox) bv.get(i);
for ( int j = 0; j < pv.size(); j ++ ){
BaseBox tb = (BaseBox) pv.get(j);
if ( tb.getX() == temp.getX() && tb.getY() == temp.getY()){
cnt ++;
break;
}
}
}
if ( cnt == pv.size() ) return true;
return false;
} public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void actionPerformed(ActionEvent e) {
if ( e.getSource().equals(reset)){
if ( JOptionPane.showConfirmDialog(this,"你真的要重玩本关吗?","退出", JOptionPane.YES_NO_OPTION) == 0){
times = 0;
init();
}
}
else if ( e.getSource().equals(back)){
if ( bindex != -1 ){
Vector v = new Vector(map.values());
BaseBox temp = (BaseBox) v.get(bindex);
temp.move(bbx,bby);
}
ren.move(rrx, rry);
x = rrx; y = rry;
back.setEnabled(false);
}
else if ( e.getSource().equals(exit)){
if ( JOptionPane.showConfirmDialog(this,"你真的要退出吗?","退出", JOptionPane.YES_NO_OPTION) == 0){
System.exit(0);
}
}
else if ( e.getSource().equals(next)){
lvl ++;
init();
}else if ( e.getSource().equals(goback)){
lvl --;
init();
}
}
public void run() {
while ( times > -1 && !isOver ){
this.timelvl.setText("" + times);
try {
thread.sleep(1000);
times --;
} catch (Exception e) {
e.printStackTrace();
}
}
if ( times == -1 ){
JOptionPane.showMessageDialog(this,"时间到了!重新开始吧。");
isOver = true;
}
}
/**
* @param args
*/
public static void main(String[] args) {
MainFrame f = new MainFrame();
}
}