大家好,我刚刚完成了推箱子游戏的大部分功能,就是在选关这一步卡主了
我是这么想的,因为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){
.......
.......
.......
我是这么想的,因为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){
.......
.......
.......
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},
但后面的和我的问题确实没什么关系.......
我主要新学java,所以对init(),start()什么的不太熟,想高手指点一下