2017-01-24 70 views
1

我目前正在做一個任務來構建一個正常工作的魔方。該程序不需要GUI。但它必須模擬具有旋轉行爲的3×3立方體,並提供立方體的圖形表示(我將使用平坦的字母結構)。我的代碼有一個facets類(另一個類),然後有一個包含旋轉方法的cube類。rubiks立方體旋轉算法

我在創建/選擇要使用的算法時遇到問題,它會準確模擬立方體和所有可能的旋轉。我在這個網站上找到了一個解決方案,引用了一篇論文提出了7種不同的方法來實現它(下面的鏈接)。但是哪種方法最直觀/易於編碼?更重要的是,哪個最適合下面列出的行爲(在僞代碼中)?

我無法理解如何使用任何方法來同時考慮每個面上的更改,特別是考慮到面部旋轉(與行和列相對)的行爲時。

How would you represent a Rubik's Cube in code?

Rotation Pseudocode: 

map each cube numbers 1-54, faces 1 – 4 are 1 – 36 while top face is 37 - 45 and bottom is 46 – 54 
1 turn: clockwise = +9 
1 turn: counterclockwise = -9 loops back to 45 
1 turn: up = + 37 
1 turn: down = -37 loops back to 46 
2 turns: clockwise = +9(2) 
2 turns: counterclockwise = -9(2) 
2 turns: up = +37(2) 
2 turns: down = -37(2) 
3 turns: clockwise = +9(3) 
3 turns: counterclockwise = -9(3) 
3 turns: up = +37(3) 
3 turns: down = -37(3) 

此僞不佔臉的變化。

有沒有更好/更簡單的方法來做到這一點,與我的僞代碼提出的方法不同?我如何解釋臉部變化?

實施例:(正面,1匝,順時針)

123 741 
456 852 
789 963 

注:我傾向於54元素矢量,但我不能確定如何操縱它。

此外,這是我的第一個問題,以便讓我知道什麼是錯的(沒有足夠的信息,太多了,錯題等)

謝謝!

注意:這是我正在使用的代碼。

刻面類:

public class Facets { 

    public Color color; 


    public Facets(Color color){ 
    } 


    public enum Color { 

     B, G, R, Y, O, P 


} 

    public String getName(){ 
     return this.color.name(); 
    } 

} 

面類:

import java.util.Arrays; 

public class Face { 


    public Facets[] face; 

    /*public Face(Facets.Color color, Facets.Color[] array){ 
     face = new Facets[9]; 
     for(int i = 0; i < face.length; i++){ 
      face[i] = new Facets(array[i]); 
      face[i] = new Facets(color); 

     } 
    }*/ 

    public Face(Facets.Color color){ 
     face = new Facets[9]; 
     for(int i = 0; i < face.length; i++){ 
      face[i] = new Facets(color); 
     } 
    } 

    public Face(Facets.Color[] array){ 
     face = new Facets[9]; 
     for (int i = 0; i < face.length; i++){ 
      face[i] = new Facets(array[i]); 
      //face[i] = face[i].toString(); 
     } 
    } 


    //Returns a textual representation of Face 
    public String printFace(){ 
     StringBuilder faceString = new StringBuilder(); 

     for(Facets f: face){ 
      faceString.append(f.getName()); 
      System.out.println(f.toString()); 
     } 
     return faceString.toString(); 

} 

    public static void main(String[] args){ 
     Face face = new Face(Facets.Color.B); 
     System.out.println(face.toString()); 
    } 
} 

魔方類:

public class Cube { 

    public Cube(Face front, Face right, Face back, Face left, Face top, Face bottom){ 

    } 

    public Cube createCube(){ 


    } 

    public Cube rotate(int row, int column, String direction, int turns){ 
     /*Turns must be between 0 - 4 
Row must be 1 or 2, column must be 1 or 2, direction must be clockwise, counterclockwise, up or down (0 means no turn, 1 is top row or left column; 2 is bottom row or right column) 
*/ 

    } 

    public int turns(){ 

    } 

    public Cube row(){ 

    } 

    public Cube column(){ 

    } 

    public Cube clockwise(){ 

    } 

    public Cube counterClockwise(){ 

    } 

    public Cube up(){ 

    } 

    public Cube down(){ 

    } 

    public Cube random(Cube cube){ 

    } 

    public Cube configuration(Cube cube){ 

    } 



} 

魔方:

public class RubiksCube { 

    public RubiksCube(Cube cube){ 

    } 

    public RubiksCube(Face front, Face rightOfFront, Face back, Face leftOfFront, Face top, Face bottom){ 

    } 


    //calls face and colors and initializes the arrays into a object 
    //default config: solid color on each side so each array, representing a face, is set to a solid color 
    public void createNewCube(){ 

    } 


    public void rotation(Cube cube, int row, int column, String direction, int turns){ 

    } 

    public Cube configuration(Cube cube){//should return 6 Faces? or cube? 

     return cube; 

    } 

} 
+1

到目前爲止你的代碼是什麼? – dave

+0

我剛剛添加了代碼。我把它分成4個類,Face由Facets組成,6個Faces組成一個Cube,然後Rubik的Cube生成和操作這個Cube。 –

+0

我這樣做[四元數旋轉不作爲例外](http://stackoverflow.com/a/39024016/2521214) – Spektre

回答

1

考慮一下數據結構對於概念化多維數據集最容易。您提供的鏈接中的不同解決方案都有優點和缺點。您可以擁有更簡潔的結構(即五個整數表示),它佔用較少的內存並優化性能。但如果你對這個問題還不熟悉,那麼這種表述可能很難處理。另一方面是面向對象的表示,它模擬大多數人對rubik立方體的看法。對於一個剛接觸魔方的人來說,這可能是最好的方法。

當您擁有對您有意義的數據結構後,請考慮可在多維數據集上執行的不同操作。您可以在改變數據狀態的函數中捕獲每個這些移動。如果你有一個真正的魔方可以玩,找出所有不同的轉折點,以及他們如何改變魔方的價值。然後嘗試在他們自己的功能中對它們建模。即一個明智的轉向會導致六個面中的五個改變,正確的。這將導致四個面孔接收到他們的鄰居的第一排。它也會導致頂面的變化。底面將不受影響。

如果您對複雜性感到不知所措,請嘗試將問題分解爲更小的問題。也許你可以嘗試寫一個2×2而不是3×3的rubik立方體表示法。一旦你掌握了小問題,回到較大的問題。