Мне нужна помощь, чтобы закончить мой 2D кубик Рубика

Я пытаюсь сделать базовый 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);
            } 
        }
    }           
}

1 ответ

Решение

Из предоставленных вами кодов я предполагаю, что 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)}

Надеюсь, это поможет.

Другие вопросы по тегам