为什么按左键,运行的2048界面向上移动



```java
package com.itcast;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class MainFrame extends JFrame implements KeyListener {
    int arr[][] = {
            {0, 2, 2, 4},
            {2, 4, 2, 4},
            {4, 4, 2, 8},
            {2, 8, 4, 8}
    };

    public MainFrame() {
        cjFrame();
        paintView();
        setVisible(true);
        //为窗口添加监听器
        this.addKeyListener(this);
    }

    public void cjFrame() {
        setTitle("2048游戏");
        setSize(514, 538);
        setLocationRelativeTo(null);
        //设置窗口在所有页面上
        setAlwaysOnTop(true);
        //窗体关程序停
        setDefaultCloseOperation(3);
        setLayout(null);
    }

    public void paintView() {
        //移除掉页面中所有的内容
        getContentPane().removeAll();

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                JLabel lab1 = new JLabel(new ImageIcon("C:\\Users\\hh12j\\Desktop\\2048\\image\\A-" + arr[i][j] + ".png"));
                lab1.setBounds(50 + 100 * i, 50 + 100 * j, 100, 100);
                getContentPane().add(lab1);
            }
        }
        JLabel background = new JLabel(new ImageIcon("C:\\Users\\hh12j\\Desktop\\2048\\image\\A-Background.jpg"));
        background.setBounds(40, 40, 420, 420);
        getContentPane().add(background);
        getContentPane().repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) {
        //此方法无法监听到上下左右按键,无需关注
    }

    @Override
    public void keyPressed(KeyEvent e) {
        //此方法是键盘按下时所触发的方法,区分上下左右按键
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //此方法在键盘被松开时所触发的方法
        int keycode = e.getKeyCode();
        if (keycode == 37) {
            moveTolest();
        }
        if (keycode == 38) {
            System.out.println("执行数据上移逻辑");
        }
        if (keycode == 39) {
            System.out.println("执行数据右移逻辑");
        }
        if (keycode == 40) {
            System.out.println("执行数据下移逻辑");
        }
    }

    private void moveTolest() {
        //此方法用于数据左移移动
        for (int i = 0; i < arr.length; i++) {
            int newarr[] = new int[4];
            int index = 0;
            //取出原数组中的每一个元素并判断是否为0
            for (int x = 0; x < arr[i].length; x++) {
                if (arr[i][x] != 0) {
                    newarr[index] = arr[i][x];
                    index++;
                }
            }
            arr[i] = newarr;
            for (int x = 0; x < 3; x++) {
                if (arr[i][x] == arr[i][x + 1]) {
                    arr[i][x] *= 2;
                    //后面元素前移,并在末尾补0
                    for (int j = x + 1; j < 3; j++) {
                        arr[i][j] = arr[i][j + 1];
                    }
                    arr[i][3] = 0;
                }
            }
        }
        paintView();
    }
}


```

来自GPT的回答:

根据提供的Java代码,根据键盘事件来移动2048游戏界面中的方块。代码中已经实现了向左移动的逻辑(moveTolest()方法),但是没有实现其他方向的移动逻辑(上、下、右)。

在代码中,键盘事件的处理部分是通过KeyReleased方法来实现的。在按下不同的方向键时,分别执行了相应的移动逻辑。目前只有向左移动逻辑(moveTolest()方法)被实现,其他方向的逻辑需要根据相应的逻辑进行实现。

为了实现向上、向下、向右的移动逻辑,你可以按照以下步骤进行修改:

在keyReleased()方法中添加相应方向键的处理逻辑。
编写向上移动的逻辑。这涉及到将每一列的元素向上移动,并合并相同的元素。可以参考moveTolest()方法的逻辑,进行相应的修改。
编写向下移动的逻辑。这涉及到将每一列的元素向下移动,并合并相同的元素。可以参考moveTolest()方法的逻辑,进行相应的修改。
编写向右移动的逻辑。这涉及到将每一行的元素向右移动,并合并相同的元素。可以参考moveTolest()方法的逻辑,进行相应的修改。
注意,每个移动逻辑中需要考虑元素的合并和移动。在移动元素时,需要遵循一定的规则来确保元素的正确移动和合并。例如,向上移动时,需要考虑每一列的元素移动和合并;向右移动时,需要考虑每一行的元素移动和合并。

修改完移动逻辑后,你可以调用相应的方法,如moveToUp()、moveToDown()和moveToRight(),在keyReleased()方法中执行相应的逻辑。

希望这些指导对你有帮助,如果你需要进一步的解释或有其他问题,请随时提问。