Project

General

Profile

« Previous | Next » 

Revision e649d99a

Added by Leszek Koltunski over 1 year ago

Correct scramble tables for the Pyraminxes.

View differences:

src/main/java/org/distorted/objectlib/objects/TwistyPyraminx.java
51 51
    }
52 52

  
53 53
///////////////////////////////////////////////////////////////////////////////////////////////////
54
// edge[i] is the state after moving layer i (0 is the largest)
54 55

  
55 56
  public int[][] getScrambleEdges()
56 57
    {
57 58
    if( mEdges==null )
58 59
      {
59
      int numLayers = getNumLayers()[0];
60
      mEdges = new int[numLayers][];
61
      for(int i=0; i<numLayers-1; i++) mEdges[i] = generateEdge(numLayers-1-i,numLayers);
62
      mEdges[numLayers-1] = generateEdge(numLayers-2,numLayers);
60
      int nL = getNumLayers()[0];
61
      mEdges = new int[nL][];
62

  
63
      for(int i=0; i<nL; i++)
64
        {
65
        int numEnabledMoves = 2*(nL-i);
66
        mEdges[i] = new int[4*2*numEnabledMoves];
67

  
68
        int index = 0;
69
        int startMove= 0;
70
        int offset = (i==nL-1 ? 2:0);  // if the last move was a tip, the only possible
71
                                       // next move is the second-to-largest layer.
72
        fillEdge(mEdges[i],index,startMove,offset,numEnabledMoves);
73
        index += (2*numEnabledMoves);
74
        startMove += (2*nL);
75
        fillEdge(mEdges[i],index,startMove,offset,numEnabledMoves);
76
        index += (2*numEnabledMoves);
77
        startMove += (2*nL);
78
        fillEdge(mEdges[i],index,startMove,offset,numEnabledMoves);
79
        index += (2*numEnabledMoves);
80
        startMove += (2*nL);
81
        fillEdge(mEdges[i],index,startMove,offset,numEnabledMoves);
82
        }
63 83
      }
64 84

  
65 85
    return mEdges;
......
67 87

  
68 88
///////////////////////////////////////////////////////////////////////////////////////////////////
69 89

  
70
  private int[] generateEdge(int end, int numLayers)
90
  private void fillEdge(int[] edge, int index, int move, int offset, int num)
71 91
    {
72
    int[] ret = new int[8*end];
73

  
74
    for(int i=0; i<end; i++)
92
    for(int i=0; i<num; i++)
75 93
      {
76
      int s = ((i/2)%numLayers);
77

  
78
      ret[      2*i  ] = i;
79
      ret[      2*i+1] = s;
80
      ret[  end+2*i  ] = i;
81
      ret[  end+2*i+1] = s;
82
      ret[2*end+2*i  ] = i;
83
      ret[2*end+2*i+1] = s;
84
      ret[3*end+2*i  ] = i;
85
      ret[3*end+2*i+1] = s;
94
      edge[index+2*i  ] = (move+offset);
95
      edge[index+2*i+1] = (i+offset)/2;
96
      move++;
86 97
      }
87

  
88
    return ret;
89 98
    }
90 99

  
91 100
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff