大家好,我刚刚完成了推箱子游戏的大部分功能,就是在选关这一步卡主了
我是这么想的,因为applet先init()后start()
而start()可以多次调用
所以我在actionPerformed里面调用start()和repaint()想来达到重新选关的目的,程序开始运行是正常(就是默认的初始关卡可以完全正常操作),可关卡更换后貌似程序就不再接收键盘的操作,即换一关我按什么推箱子的“人”都不动(但地图还是改动了的,应该是repaint()被调用),我不知道意思表达清楚没,这个推箱子写啦我几天啦,还是很想完成它,各位帮帮忙看看问题出在哪里吧.....
源码附下:
package com.java.box;import java.applet.Applet;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class Boxman extends Applet implements KeyListener,ActionListener{
public Image[] showImage; public Box[] box; 
Man man;
Map bigmap;
int[][] goals;
int totalGoal = 0;
Label prompt;
TextField input;
Button btn;



public void init(){

btn = new Button("输入");
prompt = new Label("关数:");
input = new TextField(5);
bigmap = new Map();



    


addKeyListener(this);
add(prompt);
add(input);
add(btn);

btn.addActionListener(this);
//载入图标
showImage = new Image[7];   

for(int i=0;i<bigmap.totalImage;i++)
showImage[i] = getImage(getCodeBase(),"Bmp"+i+".gif");
//创建人对象



}
public void start(){
setFocusable(true);
man = new Man(bigmap.manX,bigmap.manY);
for(int i=0;i<bigmap.m;i++)
for(int j=0;j<bigmap.n;j++){
if(bigmap.map[i][j]==5)
totalGoal++;
}
goals = new int[totalGoal][2];
//*****初始化所有箱子对象
int k=0;
box = new Box[bigmap.totalBox()];
for(int i=0;i<bigmap.m;i++)
for(int j=0;j<bigmap.n;j++){
if(bigmap.map[i][j]==3){
box[k] = new Box(i,j);
k++;}
}
int t = 0;
for(int i=0;i<bigmap.m;i++)
for(int j=0;j<bigmap.n;j++){
if(bigmap.map[i][j]==5){
goals[t][0] = j;
goals[t][1] = i;
t++;
}
}
}
public void paint(Graphics g){
int w = 0;
for(int i=0;i<bigmap.m;i++)
for(int j=0;j<bigmap.n;j++){
if(bigmap.map[i][j]==1)
g.drawImage(showImage[1],j*32,i*32,this);
if(bigmap.map[i][j]==2)
g.drawImage(showImage[2],j*32,i*32,this);   
if(bigmap.map[i][j]==3)
g.drawImage(showImage[3],j*32,i*32,this);
if(bigmap.map[i][j]==5)
g.drawImage(showImage[5],j*32,i*32,this);
}
for(int i=0;i<totalGoal;i++){
if(bigmap.map[goals[i][1]][goals[i][0]] == 2){
g.drawImage(showImage[5],goals[i][0]*32,goals[i][1]*32,this);
}
}
for(int i=0;i<totalGoal;i++){
if(bigmap.map[goals[i][1]][goals[i][0]] == 3){
w++;
}
}
if(w == totalGoal){
g.drawImage(showImage[5],10,40,this);
}
g.drawImage(showImage[6],man.x*32,man.y*32,this);


} public void actionPerformed(ActionEvent e) {
         if(e.getSource()==btn){
          System.out.println(" dfdd");
          int i = Integer.parseInt(input.getText());
          bigmap.LevelMap(i);
          start();
          repaint();
         }

}
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();


if(keycode==KeyEvent.VK_RIGHT){
System.out.println("aaa");
man.realMove(0);
repaint();
}
if(keycode==KeyEvent.VK_DOWN){
man.realMove(1);
repaint();
}
if(keycode==KeyEvent.VK_LEFT){
man.realMove(2);
repaint();
} if(keycode==KeyEvent.VK_UP){
man.realMove(3);
repaint();
}


}






public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {}
}
class Box  {
int x;
int y;
int goal = 0;
Map map = new Map();
public Box(int i, int j) {
x = i;
y = j;
}
public  Boolean move(int d){
Boolean s = true;
int flag = 0;
int flag1 = 0;

if(goal == 1){
flag1 = 1;

}
//判断是不是目标
switch(d){
case 0:
 if(map.map[y][x+1]==5)
goal = 1;

    break;
case 1:
if(map.map[y+1][x]==5)
goal = 1;
   
break;
case 2:
if(map.map[y][x-1]==5)
goal = 1;

break;
case 3:
if(map.map[y-1][x]==5)
goal = 1;

break;}





switch(d){
case 0:
 if(map.map[y][x+1]==3){
 flag = 1;
     s = false;}
    break;
case 1:
if(map.map[y+1][x]==3){
 flag = 1;
     s = false;}
break;
case 2:
if(map.map[y][x-1]==3){
 flag = 1;
 s = false;}
break;
case 3:
if(map.map[y-1][x]==3){
 flag = 1;
 s = false;}
break;}

if(flag == 0&&flag1 !=1){
 switch(d){
case 0:
map.map[y][x] = 2;
x++;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
    break;
case 1:
map.map[y][x] = 2;
y++;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;
case 2:
map.map[y][x] = 2;
x--;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;
case 3:
map.map[y][x] = 2;
y--;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;}
}


if(flag1 ==1){
System.out.println("ddd");
switch(d){
case 0:
map.map[y][x] = 5;
x++;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
    break;
case 1:
map.map[y][x] = 5;
y++;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;
case 2:
map.map[y][x] = 5;
x--;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;
case 3:
map.map[y][x] = 5;
y--;
if(map.map[y][x] != 1)
map.map[y][x] = 3;
break;}
}
//判断是不是到墙或者箱子那边去了      if(map.map[y][x]==1){
 switch(d){
case 0:
x--;
map.map[y][x] = 3;
    break;
case 1:
y--;
map.map[y][x] = 3;
break;
case 2:
x++;
map.map[y][x] = 3;
break;
case 3:
y++;
map.map[y][x] = 3;
break;}
 s = false;
 }

 
 
return s;
}
}
class Man{
int x;
int y;
Map map = new Map();
public Box[] box = new Box[map.totalBox()+10]; 
public Man(int i, int j) {
x = i;
y = j;
}
public Boolean equals(Box t){
return (x==t.x&&y==t.y);
} public void realMove(int d){ int k = 0;
for(int i=0;i<map.m;i++)
for(int j=0;j<map.n;j++){
if(map.map[i][j]==3){
box[k] = new Box(j,i);
k++;}
}

switch(d){
case 0:
this.x++;break;
case 1:
this.y++;break;
case 2:
this.x--;break;
case 3:
this.y--;break;}
//先判断是不是到墙那边去了

    for(int i=0;i<map.totalWall();i++){
     if(x==map.everyWall()[i][1]&&y==map.everyWall()[i][0]){
    
     switch(d){
     case 0:
     this.x--;break;
     case 1:
     this.y--;break;
     case 2:
     this.x++;break;
     case 3:
     this.y++;break;}
     }
    
    }
    //再判断碰到箱子没有
  
    for(int i=0;i<map.totalBox();i++){
     if(x==box[i].x&&y==box[i].y){
    
     if(box[i].move(d)==false)
    
     switch(d){
     case 0:
     this.x--;break;
     case 1:
     this.y--;break;
     case 2:
     this.x++;break;
     case 3:
     this.y++;break;}
    
     }
    }
    

       
}
}后面是地图的类,篇幅有限,放不完
class Map{
public int m = 15;   //总长度
public int n = 15;   //总宽度
public int totalImage = 7;
static int manX = 8;
static int manY = 6;
    static int[][] map =  
        {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,1,1,1,1,1,1,1,0,0,0,0},
        {0,0,0,0,1,2,2,5,5,5,1,0,0,0,0},
        {0,0,0,0,1,2,2,2,2,2,1,1,0,0,0},
        {0,0,0,1,1,1,3,2,2,2,2,1,0,0,0},
        {0,0,0,1,2,2,2,2,2,2,2,1,0,0,0},
        {0,0,0,1,2,3,2,1,3,1,2,1,0,0,0},
        {0,0,0,1,2,2,2,1,2,2,2,1,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
       };  //地图布局,1是墙,2是空地,3是箱子,5是目的地
     public int totalBox(){
      int totalBox = 0;
      for(int i=0;i<m;i++)
  for(int j=0;j<n;j++) 
  if(map[i][j]==3)
  totalBox++;
         return totalBox;
      
     }
     public int totalWall(){
      int totalWall = 0;
      for(int i=0;i<m;i++)
   for(int j=0;j<n;j++) 
   if(map[i][j]==1)
   totalWall++;
           return totalWall;
      
     }     public int[][] everyWall(){
      int k = 0;
      int everyWall[][] = new int[this.totalWall()][2];
      for(int i=0;i<m;i++)
   for(int j=0;j<n;j++) 
   if(map[i][j]==1){
   everyWall[k][0] = i;   //y
   everyWall[k][1] = j;   //x
   k++;
   }
         return everyWall;
 
     }
     
     public int[][] everyBox(){
      int k = 0;
      int everyBox[][] = new int[this.totalBox()][2];
      for(int i=0;i<m;i++)
   for(int j=0;j<n;j++) 
   if(map[i][j]==3){
   everyBox[k][0] = i;   //y
   everyBox[k][1] = j;   //x
   k++;
   }
         return everyBox;
 
     }
     public void LevelMap(int l){
     .......
         .......
         .......

解决方案 »

  1.   

    楼主应该先贴好自己的代码。格式如下:
    class Map{
    public int m = 15;  //总长度
    public int n = 15;  //总宽度
    public int totalImage = 7;
    static int manX = 8;
    static int manY = 6;
        static int[][] map = 
            {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 
      

  2.   

    因为发帖篇幅有限,后面的发布出来啦
    但后面的和我的问题确实没什么关系.......
    我主要新学java,所以对init(),start()什么的不太熟,想高手指点一下