我目前正在做一個任務來構建一個正常工作的魔方。該程序不需要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;
}
}
到目前爲止你的代碼是什麼? – dave
我剛剛添加了代碼。我把它分成4個類,Face由Facets組成,6個Faces組成一個Cube,然後Rubik的Cube生成和操作這個Cube。 –
我這樣做[四元數旋轉不作爲例外](http://stackoverflow.com/a/39024016/2521214) – Spektre