根据你提供的代码,可以看出地图数据已经定义在了box1接口中,并且map类继承自JPanel类用于绘制地图。
为了找到人物位置并且实现移动,需要在map类中添加一个变量来记录人物的位置。可以添加以下代码:
int playerRow = 0;
int playerCol = 0;
for (int i = 0; i < box.length; i++) {
for (int j = 0; j < box[i].length; j++) {
if (box[i][j] == 5) { // 找到人物所在的格子
playerRow = i;
playerCol = j;
}
}
}
这段代码会遍历整个地图数据,找到值为5(代表人物)的格子,并将其行和列存储起来。
然后,在paintComponent方法中绘制出人物。可以使用另外一张图片来表示人物。例如:
Image playerImage = new ImageIcon("D:\\推箱子1\\imge\\player.png").getImage();
g.drawImage(playerImage, playerCol*size, playerRow*size, size, size, this);
这段代码将playerImage图片绘制在当前人物所处的格子上。
接下来就是如何实现人物移动了。可以通过监听键盘事件来控制人物的移动。
首先,在map类中添加一个方法用于更新地图数据和重绘界面:
public void movePlayer(int rowOffset, int colOffset) {
// 计算新的行列值
int newRow = playerRow + rowOffset;
int newCol = playerCol + colOffset;
// 判断新位置是否可达
if (box[newRow][newCol] == 0 || box[newRow][newCol] == 3) {
// 更新地图数据
box[playerRow][playerCol] = box[playerRow][playerCol] == 2 ? 0 : 3;
playerRow = newRow;
playerCol = newCol;
box[playerRow][playerCol] = 2;
// 重绘界面
repaint();
}
}
这个方法接受两个参数,分别表示行和列的偏移量。例如,如果要向上移动,则传入(-1, 0);如果要向右移动,则传入(0, 1)。
在这个方法中,首先计算出新的行列值。然后判断新位置是否可达。如果是空白格子或者终点位置砖块,则更新地图数据,将人物从原来位置删除并添加到新位置,并且重新绘制界面。
最后,在map类中添加一个KeyListener监听器来响应键盘事件:
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
movePlayer(-1, 0);
break;
case KeyEvent.VK_DOWN:
movePlayer(1, 0);
break;
case KeyEvent.VK_LEFT:
movePlayer(0, -1);
break;
case KeyEvent.VK_RIGHT:
movePlayer(0, 1);
break;
}
}
});
这段代码使用了Java8的Lambda表达式语法来创建一个匿名内部类,并且覆写了其中的keyPressed方法。根据按下的键不同,调用movePlayer方法来控制人物移动。
注意:由于KeyListener需要监听键盘事件,因此必须将焦点设置在当前组件上。可以在map类的构造方法中添加一行代码来设置焦点:
setFocusable(true);
requestFocusInWindow();
这样就可以实现在Java中找到人物位置并且实现移动了。




