2010-05-06 6 views
0

J'essaie de créer un programme qui résout le puzzle des roues logiques. Je construis le nœud racine et j'essaie de produire les différents nœuds enfants qui sont produits en faisant différents mouvements des roues. Le problème est que pendant que j'essaie de produire les enfants, le nœud racine est écrasé, et tout est foiré et je ne sais vraiment pas pourquoi. Ici vous pouvez trouver le puzzle logic wheels.java - écrasement d'objet indésirable

Je représente les roues comme des tableaux 3x3. Voici le code qui implémente les mouvements:

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; 
} 

Il y a une autre fonction, comme celui-ci qui fait le oposite: il fait tourner les roues à gauche. Mon problème est que je ne veux pas que les tables aNode de l'objet soient écrasées.

Merci beaucoup.

+2

Mais James, tu devrais déjà le savoir? – BalusC

Répondre

0

Eh bien, je viens d'avoir à faire qqch comme ceci:

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; 
} 

Si vous utilisez une fonction de lecture et d'affecter le résultat à une variable, puis essayez de modifier la valeur de la variable, elle change aussi la valeur de la objet dont vous avez utilisé le getter. Cela me semble assez stupide. Si je voulais changer une telle valeur, j'utiliserais un setter ...

1

.clone() pour copier l'objet que vous ne voulez pas remplacer.

p.s. comme je comprends votre problème que les modifications de blue = newNode.getBlue_wheel(); aussi faire des changements sur la roue bleue newNode, est-ce?

+0

oui, c'est mon problème, je ne m'inquiète pas autant de newNode, mais d'aNode. C'est pourquoi j'ai utilisé newNode, mais sans succès..Merci de la réponse, je vais l'essayer immédiatement et poster des résultats. – gosling

+0

Malheureusement, rien n'a changé. Je ne comprends pas. Je l'ai mis pour imprimer la racine, puis le premier enfant (jaune à gauche), puis la racine à nouveau, puis le deuxième enfant (jaune à droite), etc. Dans le troisième enfant (roue bleue à gauche), alors que le paramètre est le rootNode ce qui est bien, il me renvoie sth comme si j'avais utilisé comme rootNode les deuxièmes enfants. Le rootNode est imprimé avec des erreurs. Après la quatrième racine de l'enfant est imprimé à nouveau correctement. Je ne comprends vraiment pas. – gosling

+0

avez-vous essayé avec 'Node newNode = new Node (aNode.getYellow_wheel(). Clone(), unNode.getBlue_wheel(). Clone(), unNode.getGreen_wheel(). Clone());'? –