要找到人物位置并且实现移动,可以在map类中添加一个变量来记录人物的位置,然后在paintComponent方法中绘制出人物。
首先,在map类中添加一个变量来记录人物的行和列:
int playerRow = 3;
int playerCol = 4;
这里假设初始时人物位于第4行第5列(数组下标从0开始)。
然后在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中找到人物位置并且实现移动了。


        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                