- 找到人物位置
在地图中找到人物的位置,可以使用两个变量记录人物所在行和列。例如:
int playerRow = 3; // 人物所在行 int playerCol = 4; // 人物所在列
当然,如果需要动态修改人物位置,可以将这些变量声明为成员变量。
- 实现移动
实现移动可以通过监听键盘事件来实现。在map类中添加KeyListener,并重写keyPressed方法:
public class map extends JPanel implements KeyListener {
// 省略其他代码
public map() {
// 添加键盘事件监听器
addKeyListener(this);
setFocusable(true);
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch (keyCode) {
case KeyEvent.VK_UP:
moveUp();
break;
case KeyEvent.VK_DOWN:
moveDown();
break;
case KeyEvent.VK_LEFT:
moveLeft();
break;
case KeyEvent.VK_RIGHT:
moveRight();
break;
default:
break;
}
}
private void moveUp() {
if (box[playerRow - 1][playerCol] == 0 || box[playerRow - 1][playerCol] == 3) { // 上方为空或终点位置砖块
box[playerRow][playerCol] -= 5; // 原位置减去5,表示空出来了
playerRow--;
box[playerRow][playerCol] += 5; // 新位置加上5,表示有人站着了
} else if (box[playerRow - 1][playerCol] == 2) { // 上方有箱子
if (box[playerRow - 2][playerCol] == 0 || box[playerRow - 2][playerCol] == 3) { // 箱子上方为空或终点位置砖块
box[playerRow][playerCol] -= 5; // 原位置减去5,表示空出来了
playerRow--;
box[playerRow][playerCol] += 5; // 新位置加上5,表示有人站着了
box[playerRow - 1][playerCol] = 0; // 箱子移动到新位置
box[playerRow - 1][playerCol] += 2;
}
}
repaint(); // 更新地图显示
}
private void moveDown() {
// 类似moveUp方法的实现,略去不表
}
private void moveLeft() {
// 类似moveUp方法的实现,略去不表
}
private void moveRight() {
// 类似moveUp方法的实现,略去不表
}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyTyped(KeyEvent e) {}
}
在移动时需要判断人物所在位置和目标位置是否合法,并进行相应处理。如果目标位置是箱子,则还需要判断箱子能否移动,并进行相应处理。
最后别忘了调用repaint()方法更新地图显示。




