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  下载吧。

解决方案 »

  1.   

    public MainFrame (){

    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);
    }
      

  2.   

    public boolean getMap(){
    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  + " 步。");
    }
    }
      

  3.   

    public boolean check(){
    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();
    }
    }