我需要帮助来完成我的 2D 魔方

I need help to finish my 2D Rubik's Cube

我正在尝试制作一个基本的 2D Rubik Cube 3x3,但我在方块的颜色方面遇到了问题,当我开始混合位置导致颜色没有相应改变并且我不知道如何修复它。

这是代码。非常感谢您的帮助和时间。

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == upLeft){
        Collections.swap(squaresList, 0, 27);
        Collections.swap(squaresList, 3, 30);
        Collections.swap(squaresList, 6, 33);

        Collections.swap(squaresList, 27, 18);
        Collections.swap(squaresList, 30, 21);
        Collections.swap(squaresList, 33, 24);

        Collections.swap(squaresList, 18, 9);
        Collections.swap(squaresList, 21, 12);
        Collections.swap(squaresList, 24, 15);

        // HERE IS WHERE I THINK THE PROBLEM IS...BUT I CANT SEE PAST THE PROBLEM
        // I TRIED USING HASHMAP SO EACH SQUARE HAS A UNIQUE CODE FOR ITS COLOR BUT DIDNT WORK OUT...
        for(int i = 0; i < squaresList.size(); i++){
            if(i <= 8){
                squaresList.get(i).setBackground(Color.WHITE); 
            }else if(i >= 9 && i <= 17){
                squaresList.get(i).setBackground(Color.YELLOW);
            }else if(i > 17 && i <= 26){
                squaresList.get(i).setBackground(Color.BLUE);
            }else if(i > 26 && i <= 35){
                squaresList.get(i).setBackground(Color.RED);
            }else if(i > 35 && i <= 44){
                squaresList.get(i).setBackground(Color.GREEN);
            }else if(i > 44 && i <= 53){
                squaresList.get(i).setBackground(Color.ORANGE);
            } 
        }
    }

    if(e.getSource() == upLeftRight){
        Collections.swap(squaresList, 0, 45);
        Collections.swap(squaresList, 1, 46);
        Collections.swap(squaresList, 2, 47);

        Collections.swap(squaresList, 45, 18);
        Collections.swap(squaresList, 46, 19);
        Collections.swap(squaresList, 47, 20);

        Collections.swap(squaresList, 18, 36);
        Collections.swap(squaresList, 19, 37);
        Collections.swap(squaresList, 20, 38);

        // HERE IS WHERE I THINK THE PROBLEM IS...BUT I CANT SEE PAST THE PROBLEM
        // I TRIED USING HASHMAP SO EACH SQUARE HAS A UNIQUE CODE FOR ITS COLOR BUT DIDNT WORK OUT...
        for(int i = 0; i < squaresList.size(); i++){
            if(i <= 8){
                squaresList.get(i).setBackground(Color.WHITE); 
            }else if(i >= 9 && i <= 17){
                squaresList.get(i).setBackground(Color.YELLOW);
            }else if(i > 17 && i <= 26){
                squaresList.get(i).setBackground(Color.BLUE);
            }else if(i > 26 && i <= 35){
                squaresList.get(i).setBackground(Color.RED);
            }else if(i > 35 && i <= 44){
                squaresList.get(i).setBackground(Color.GREEN);
            }else if(i > 44 && i <= 53){
                squaresList.get(i).setBackground(Color.ORANGE);
            } 
        }
    }           
}

根据您提供的代码,我假设 squareList 包含正方形但不包含颜色值。您的方法的问题是您使用 Collection.swap() 在方块值周围移动,但您没有根据原始值分配颜色值,这意味着交换方块时不会交换颜色。

考虑以下示例。假设数字代表你的每一个方格。

Original square list: {1(Black), 2(Blue), 3(Green), 4(Red)}

并且您正在按黑-蓝-绿-红的顺序分配到此列表。结果将是颜色按以下顺序排列:

Original colour list: {Black, Blue, Green, Red}

另一方面,执行交换后:

After swap, the square list: {3, 1, 2, 4}

但是你按相同的顺序给颜色,这又是:

After swap, colour list: {Black, Blue, Green, Red}

所以你的 sq 3 有黑色,1 有蓝色,等等,看起来颜色没有变化。我建议两种处理方法:一种是在数据中保留一个单独的颜色列表,并在交换正方形时将其交换在一起。并使用颜色列表中的顺序分配颜色。

另一种解决方案是为每个正方形制作一个数据结构,其中包含颜色值。代码将如下所示:

class Square
{
    Color myColour;

    // ...
}

有了这个结构,当你执行交换时你正在做:

Original square list: {1(Black), 2(Blue), 3(Green), 4(Red)}

After swap, square list: {3(Green), 2(Blue), 1(Black), 4(Red)}

希望对您有所帮助。