2010-05-06 2 views
0

Я пытаюсь создать программу, которая решает головоломку логических колес. Я создаю корневой узел, и я пытаюсь создать различные дочерние узлы, которые производятся путем создания разных движений колес. Проблема в том, что пока я пытаюсь создать детей, корневой узел перезаписывается, и все перепутано, и я действительно не знаю, почему. Здесь вы найдете головоломку logic wheels.java - перезапись нежелательных объектов

Я представляю колеса как 3x3 массивы. Вот код, который реализует шаги:

public Node turn_right(Node aNode, int which_wheel) 
{ 
    Node newNode = new Node(aNode.getYellow_wheel(),aNode.getBlue_wheel(),aNode.getGreen_wheel()); 

    int[][] yellow = new int[3][3]; 
    int[][] blue = new int[3][3]; 
    int[][] green = new int[3][3]; 

    if(which_wheel==0) //turn yellow wheel of this node to right 
    { 
     yellow[1][0] = newNode.getYellow_wheel()[0][0]; 
     yellow[2][0] = newNode.getYellow_wheel()[1][0]; 
     yellow[2][1] = newNode.getYellow_wheel()[2][0]; 
     yellow[2][2] = newNode.getYellow_wheel()[2][1]; 
     yellow[1][2] = newNode.getYellow_wheel()[2][2]; 
     yellow[0][2] = newNode.getYellow_wheel()[1][2]; 
     yellow[0][1] = newNode.getYellow_wheel()[0][2]; 
     yellow[0][0] = newNode.getYellow_wheel()[0][1]; 

     blue = newNode.getBlue_wheel(); 
     blue[1][0] = newNode.getYellow_wheel()[1][2]; 
     blue[2][0] = newNode.getYellow_wheel()[2][2]; 

     green = newNode.getGreen_wheel(); 

    } 
    else if(which_wheel == 1)// turn blue wheel of this node to right 
    { 

     blue[1][0] = newNode.getBlue_wheel()[0][0]; 
     blue[2][0] = newNode.getBlue_wheel()[1][0]; 
     blue[2][1] = newNode.getBlue_wheel()[2][0]; 
     blue[2][2] = newNode.getBlue_wheel()[2][1]; 
     blue[1][2] = newNode.getBlue_wheel()[2][2]; 
     blue[0][2] = newNode.getBlue_wheel()[1][2]; 
     blue[0][1] = newNode.getBlue_wheel()[0][2]; 
     blue[0][0] = newNode.getBlue_wheel()[0][1]; 


     yellow = newNode.getYellow_wheel(); 
     yellow[0][2] = newNode.getBlue_wheel()[0][0]; 
     yellow[1][2] = newNode.getBlue_wheel()[1][0]; 

     green = newNode.getGreen_wheel(); 
     green[1][0] = newNode.getBlue_wheel()[1][2]; 
     green[2][0] = newNode.getBlue_wheel()[2][2]; 
    } 
    else if (which_wheel == 2)//turn green wheel of this node to right 
    { 
     green[0][0] = newNode.getGreen_wheel()[0][1]; 
     green[0][1] = newNode.getGreen_wheel()[0][2]; 
     green[0][2] = newNode.getGreen_wheel()[1][2]; 
     green[1][2] = newNode.getGreen_wheel()[2][2]; 
     green[2][2] = newNode.getGreen_wheel()[2][1]; 
     green[2][1] = newNode.getGreen_wheel()[2][0]; 
     green[2][0] = newNode.getGreen_wheel()[1][0]; 
     green[1][0] = newNode.getGreen_wheel()[0][0]; 

     yellow = newNode.getYellow_wheel(); 

     blue = newNode.getBlue_wheel(); 
     blue[0][2] = newNode.getGreen_wheel()[0][0]; 
     blue[1][2] = newNode.getGreen_wheel()[1][0]; 
    } 
    newNode= new Node(yellow,blue,green); 
    return newNode; 
} 

Существует другая функция, как этот, который делает на противоположном: он поворачивает колеса влево. Моя проблема в том, что я не хочу, чтобы таблицы aNode объекта были перезаписаны.

спасибо.

+2

Но Джеймс, вы уже должны это знать? – BalusC

ответ

0

Ну, я просто должен был сделать что-н, как это:

public Node turn_right(Node aNode, int which_wheel) 
{ 
    Node newNode = (Node) aNode.clone(); 

    int[][] yellow = new int[3][3]; 
    int[][] blue = new int[3][3]; 
    int[][] green = new int[3][3]; 

    if(which_wheel==0) //turn yellow wheel of this node to right 
    { 
     yellow[1][0] = newNode.getYellow_wheel()[0][0]; 
     yellow[2][0] = newNode.getYellow_wheel()[1][0]; 
     yellow[2][1] = newNode.getYellow_wheel()[2][0]; 
     yellow[2][2] = newNode.getYellow_wheel()[2][1]; 
     yellow[1][2] = newNode.getYellow_wheel()[2][2]; 
     yellow[0][2] = newNode.getYellow_wheel()[1][2]; 
     yellow[0][1] = newNode.getYellow_wheel()[0][2]; 
     yellow[0][0] = newNode.getYellow_wheel()[0][1]; 

     blue[0][0] = newNode.getBlue_wheel()[0][0]; 
     blue[0][1] = newNode.getBlue_wheel()[0][1]; 
     blue[0][2] = newNode.getBlue_wheel()[0][2]; 
     blue[1][2] = newNode.getBlue_wheel()[1][2]; 
     blue[2][1] = newNode.getBlue_wheel()[2][1]; 
     blue[2][2] = newNode.getBlue_wheel()[2][2]; 
     blue[1][0] = newNode.getYellow_wheel()[1][2]; 
     blue[2][0] = newNode.getYellow_wheel()[2][2]; 

     green = newNode.getGreen_wheel(); 

    } 
    else if(which_wheel == 1)// turn blue wheel of this node to right 
    { 

     blue[1][0] = newNode.getBlue_wheel()[0][0]; 
     blue[2][0] = newNode.getBlue_wheel()[1][0]; 
     blue[2][1] = newNode.getBlue_wheel()[2][0]; 
     blue[2][2] = newNode.getBlue_wheel()[2][1]; 
     blue[1][2] = newNode.getBlue_wheel()[2][2]; 
     blue[0][2] = newNode.getBlue_wheel()[1][2]; 
     blue[0][1] = newNode.getBlue_wheel()[0][2]; 
     blue[0][0] = newNode.getBlue_wheel()[0][1]; 


     yellow[0][0] = newNode.getYellow_wheel()[0][0]; 
     yellow[0][1] = newNode.getYellow_wheel()[0][1]; 
     yellow[1][0] = newNode.getYellow_wheel()[1][0]; 
     yellow[2][0] = newNode.getYellow_wheel()[2][0]; 
     yellow[2][1] = newNode.getYellow_wheel()[2][1]; 
     yellow[2][2] = newNode.getYellow_wheel()[2][2]; 
     yellow[0][2] = newNode.getBlue_wheel()[0][0]; 
     yellow[1][2] = newNode.getBlue_wheel()[1][0]; 

     green[0][0] = newNode.getGreen_wheel()[0][0]; 
     green[0][1] = newNode.getGreen_wheel()[0][1]; 
     green[0][2] = newNode.getGreen_wheel()[0][2]; 
     green[1][2] = newNode.getGreen_wheel()[1][2]; 
     green[2][1] = newNode.getGreen_wheel()[2][1]; 
     green[2][2] = newNode.getGreen_wheel()[2][2]; 
     green[1][0] = newNode.getBlue_wheel()[1][2]; 
     green[2][0] = newNode.getBlue_wheel()[2][2]; 
    } 
    else if (which_wheel == 2)//turn green wheel of this node to right 
    { 
     green[0][0] = newNode.getGreen_wheel()[0][1]; 
     green[0][1] = newNode.getGreen_wheel()[0][2]; 
     green[0][2] = newNode.getGreen_wheel()[1][2]; 
     green[1][2] = newNode.getGreen_wheel()[2][2]; 
     green[2][2] = newNode.getGreen_wheel()[2][1]; 
     green[2][1] = newNode.getGreen_wheel()[2][0]; 
     green[2][0] = newNode.getGreen_wheel()[1][0]; 
     green[1][0] = newNode.getGreen_wheel()[0][0]; 

     yellow = newNode.getYellow_wheel(); 

     blue[0][0] = newNode.getBlue_wheel()[0][0]; 
     blue[0][1] = newNode.getBlue_wheel()[0][1]; 
     blue[1][0] = newNode.getBlue_wheel()[1][0]; 
     blue[2][0] = newNode.getBlue_wheel()[2][0]; 
     blue[2][1] = newNode.getBlue_wheel()[2][1]; 
     blue[2][2] = newNode.getBlue_wheel()[2][2]; 
     blue[0][2] = newNode.getGreen_wheel()[0][0]; 
     blue[1][2] = newNode.getGreen_wheel()[1][0]; 
    } 
    newNode= new Node(yellow,blue,green); 
    return newNode; 
} 

Если вы используете функцию геттер и присвоить результат переменной, а затем попытаться изменить значение переменной, то изменяется и значение из объект, который вы использовали. Это кажется мне довольно глупым. Если бы я хотел изменить такое значение, я бы использовал сеттер ...

1

.clone() для копирования объекта, который вы не хотите переписывать.

p.s. как я понимаю вашу проблему, что изменения blue = newNode.getBlue_wheel(); также вносят изменения в синее колесо newNode, не так ли?

+0

да, это моя проблема, я не так беспокоюсь о newNode, но об aNode. Вот почему я использовал newNode, но без успеха. Спасибо за ответ, я попытаюсь немедленно его исправить и опубликовать результаты. – gosling

+0

К сожалению, ничего не изменилось. Я не понимаю. Я поставил его для печати корня, затем первого ребенка (желтый слева), затем снова root, затем второго ребенка (желтый справа) и т. Д. В третьем ребенке (синее колесо слева), в то время как параметр - это rootNode, это нормально, он возвращает мне sth, как если бы я использовал rootNode для вторых детей. Корневой индекс печатается с ошибками. После того, как четвертый корневой каталог ребенка будет правильно напечатан. Я действительно не понимаю. – gosling

+0

Вы пробовали с помощью 'Node newNode = new Node (aNode.getYellow_wheel(). Clone(), aNode.getBlue_wheel(). Clone(), aNode.getGreen_wheel(). Clone());'? –