Project

General

Profile

Download (11 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 39566863

1 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.patterns;
21
22
import java.util.Vector;
23
24
///////////////////////////////////////////////////////////////////////////////////////////////////
25
26
public class RubikPattern
27
{
28 53f23b64 Leszek Koltunski
  public static final int MIN_CUBE  = 2;
29
  public static final int MAX_CUBE  = 5;
30
  public static final int NUM_CUBES = MAX_CUBE-MIN_CUBE+1;
31 d18993ac Leszek Koltunski
32 4f470e00 Leszek Koltunski
  private int[] numCategories = new int[NUM_CUBES];
33 d18993ac Leszek Koltunski
  private Vector<Category>[] mCategories;
34 4f470e00 Leszek Koltunski
  private static RubikPattern mThis;
35
36 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
37
38 3a9d19ed Leszek Koltunski
  private static class Category
39 d18993ac Leszek Koltunski
    {
40
    private String name;
41 3a9d19ed Leszek Koltunski
    private int numPatterns;
42 d18993ac Leszek Koltunski
    private Vector<Pattern> patterns;
43 3a9d19ed Leszek Koltunski
44
  /////////////////////////////////////////////////////////////
45 d18993ac Leszek Koltunski
46 4f470e00 Leszek Koltunski
    Category(String n)
47 d18993ac Leszek Koltunski
      {
48
      name=n;
49 3a9d19ed Leszek Koltunski
      numPatterns=0;
50 d18993ac Leszek Koltunski
      patterns = new Vector<>();
51
      }
52 3a9d19ed Leszek Koltunski
53
  /////////////////////////////////////////////////////////////
54
55 4f470e00 Leszek Koltunski
    void addPattern(Pattern p)
56 d18993ac Leszek Koltunski
      {
57
      patterns.addElement(p);
58 3a9d19ed Leszek Koltunski
      numPatterns++;
59 d18993ac Leszek Koltunski
      }
60 3a9d19ed Leszek Koltunski
61
  /////////////////////////////////////////////////////////////
62
63 4f470e00 Leszek Koltunski
    int getNumPatterns()
64 d18993ac Leszek Koltunski
    {
65 3a9d19ed Leszek Koltunski
    return numPatterns;
66 4f470e00 Leszek Koltunski
    }
67 3a9d19ed Leszek Koltunski
68
  /////////////////////////////////////////////////////////////
69
70 4f470e00 Leszek Koltunski
    String getName()
71 d18993ac Leszek Koltunski
    {
72
    return name;
73
    }
74 3a9d19ed Leszek Koltunski
75
  /////////////////////////////////////////////////////////////
76
77
    String getPatternName(int pattern)
78 d18993ac Leszek Koltunski
      {
79 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
80
        {
81
        Pattern p = patterns.elementAt(pattern);
82
        return  p!=null ? p.getName():"";
83
        }
84
      return "";
85 d18993ac Leszek Koltunski
      }
86 3a9d19ed Leszek Koltunski
87
  /////////////////////////////////////////////////////////////
88
89
    int getPatternCurMove(int pattern)
90 d18993ac Leszek Koltunski
      {
91 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
92
        {
93
        Pattern p = patterns.elementAt(pattern);
94
        return  p!=null ? p.getCurMove():-1;
95
        }
96
      return -1;
97 d18993ac Leszek Koltunski
      }
98 3a9d19ed Leszek Koltunski
99
  /////////////////////////////////////////////////////////////
100
101
    int getPatternNumMove(int pattern)
102 d18993ac Leszek Koltunski
      {
103 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
104
        {
105
        Pattern p = patterns.elementAt(pattern);
106
        return  p!=null ? p.getNumMove():-1;
107
        }
108
      return -1;
109 d18993ac Leszek Koltunski
      }
110 3a9d19ed Leszek Koltunski
111
  /////////////////////////////////////////////////////////////
112
113
    String retInitializationString(int pattern)
114 d18993ac Leszek Koltunski
      {
115 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
116
        {
117
        Pattern p = patterns.elementAt(pattern);
118
        if( p!=null ) return p.retInitializationString();
119
        }
120
121
      return "";
122 d18993ac Leszek Koltunski
      }
123 3a9d19ed Leszek Koltunski
124
  /////////////////////////////////////////////////////////////
125
126
    String retNextMove(int pattern)
127 d18993ac Leszek Koltunski
      {
128 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
129
        {
130
        Pattern p = patterns.elementAt(pattern);
131
        if( p!=null ) return p.retNextMove();
132
        }
133
134
      return "";
135 d18993ac Leszek Koltunski
      }
136 3a9d19ed Leszek Koltunski
137
  /////////////////////////////////////////////////////////////
138
139
    String retPrevMove(int pattern)
140 d18993ac Leszek Koltunski
      {
141 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
142
        {
143
        Pattern p = patterns.elementAt(pattern);
144
        if( p!=null ) return p.retPrevMove();
145
        }
146
147
      return "";
148 d18993ac Leszek Koltunski
      }
149
    }
150
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
153 3a9d19ed Leszek Koltunski
  private static class Pattern
154 d18993ac Leszek Koltunski
    {
155
    private String name;
156
    private String moves;
157 39566863 Leszek Koltunski
    private int curMove;
158
    private int numMove;
159 d18993ac Leszek Koltunski
160 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
161
162 4f470e00 Leszek Koltunski
    Pattern(String n, String m)
163 d18993ac Leszek Koltunski
      {
164
      name=n;
165
      moves=m;
166 39566863 Leszek Koltunski
      numMove = moves.length()/4;
167
      curMove=numMove;
168 d18993ac Leszek Koltunski
      }
169 3a9d19ed Leszek Koltunski
170
  /////////////////////////////////////////////////////////////
171
172
    String getName()
173 d18993ac Leszek Koltunski
      {
174 39566863 Leszek Koltunski
      return name;
175 d18993ac Leszek Koltunski
      }
176 3a9d19ed Leszek Koltunski
177
  /////////////////////////////////////////////////////////////
178
179 4f470e00 Leszek Koltunski
    int getNumMove()
180 d18993ac Leszek Koltunski
    {
181 39566863 Leszek Koltunski
    return numMove;
182 d18993ac Leszek Koltunski
    }
183 3a9d19ed Leszek Koltunski
184
  /////////////////////////////////////////////////////////////
185
186 4f470e00 Leszek Koltunski
    int getCurMove()
187 d18993ac Leszek Koltunski
    {
188 39566863 Leszek Koltunski
    return curMove;
189 d18993ac Leszek Koltunski
    }
190 3a9d19ed Leszek Koltunski
191
  /////////////////////////////////////////////////////////////
192
193
    String retNextMove()
194 d18993ac Leszek Koltunski
      {
195 39566863 Leszek Koltunski
      curMove++;
196 3a9d19ed Leszek Koltunski
197 39566863 Leszek Koltunski
      if( curMove>numMove)
198 d18993ac Leszek Koltunski
        {
199 39566863 Leszek Koltunski
        curMove= 0;
200 3a9d19ed Leszek Koltunski
        return retInitializationString();
201 d18993ac Leszek Koltunski
        }
202
      else
203
        {
204 39566863 Leszek Koltunski
        curMove--;
205
        return moves.substring(4*curMove-4,4*curMove);
206 d18993ac Leszek Koltunski
        }
207
      }
208 3a9d19ed Leszek Koltunski
209
  /////////////////////////////////////////////////////////////
210
211
    String retPrevMove()
212 d18993ac Leszek Koltunski
      {
213 39566863 Leszek Koltunski
      curMove--;
214 3a9d19ed Leszek Koltunski
215 39566863 Leszek Koltunski
      if( curMove<0)
216 d18993ac Leszek Koltunski
        {
217 39566863 Leszek Koltunski
        curMove=numMove;
218 3a9d19ed Leszek Koltunski
        return retInitializationString();
219 d18993ac Leszek Koltunski
        }
220
      else
221
        {
222 39566863 Leszek Koltunski
        curMove++;
223
        return moves.substring(4*curMove,4*curMove+4);
224 d18993ac Leszek Koltunski
        }
225
      }
226 3a9d19ed Leszek Koltunski
227
  /////////////////////////////////////////////////////////////
228
229
    String retInitializationString()
230 d18993ac Leszek Koltunski
      {
231 39566863 Leszek Koltunski
      return moves.substring(0,4*curMove);
232 d18993ac Leszek Koltunski
      }
233
    }
234
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236
237 4f470e00 Leszek Koltunski
  private RubikPattern()
238 d18993ac Leszek Koltunski
    {
239
    mCategories = new Vector[NUM_CUBES];
240 4f470e00 Leszek Koltunski
241 d18993ac Leszek Koltunski
    initializeCategories(0, RubikPatternData2.patterns);
242
    initializeCategories(1, RubikPatternData3.patterns);
243
    initializeCategories(2, RubikPatternData4.patterns);
244
    initializeCategories(3, RubikPatternData5.patterns);
245
    }
246
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248
249
  private void initializeCategories(int num, String[] pat)
250
    {
251
    int colon;
252
    mCategories[num] = new Vector<>();
253
    Category cat=null;
254
    String name, pattern;
255
    Pattern patt;
256
257
    numCategories[num]=0;
258
259
    for(String p: pat)
260
      {
261
      colon = p.indexOf(':');
262
263
      if( colon==-1 )
264
        {
265
        cat = new Category(p);
266
        mCategories[num].addElement(cat);
267
        numCategories[num]++;
268
        }
269
      else
270
        {
271
        pattern = p.substring(colon+1);
272
        name    = p.substring(0,colon);
273
        patt = new Pattern(name,pattern);
274
        cat.addPattern(patt);
275
        }
276
      }
277
    }
278
279 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
280
// PUBLIC API
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282
283
  public static RubikPattern getInstance()
284
    {
285
    if( mThis==null )
286
      {
287
      mThis = new RubikPattern();
288
      }
289
290
    return mThis;
291
    }
292
293 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
294
295
  public int getNumCategories(int size)
296
    {
297
    return size>=0 && size<NUM_CUBES ? numCategories[size] : 0;
298
    }
299
300 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
301
302
  public String getCategoryName(int size,int num)
303
    {
304 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
305 d18993ac Leszek Koltunski
      {
306 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
307 d18993ac Leszek Koltunski
      return c!=null ? c.getName() : null;
308
      }
309
310
    return null;
311
    }
312
313
///////////////////////////////////////////////////////////////////////////////////////////////////
314
315 3a9d19ed Leszek Koltunski
  public String getPatternName(int size, int cat, int pat)
316 d18993ac Leszek Koltunski
    {
317 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
318 d18993ac Leszek Koltunski
      {
319 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
320
      return c!=null ? c.getPatternName(pat) : null;
321 d18993ac Leszek Koltunski
      }
322
323
    return null;
324
    }
325
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327
328
  public int getNumPatterns(int size, int num )
329
    {
330 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
331 d18993ac Leszek Koltunski
      {
332 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
333 d18993ac Leszek Koltunski
      return c!=null ? c.getNumPatterns() : 0;
334
      }
335
336
    return 0;
337
    }
338
339
///////////////////////////////////////////////////////////////////////////////////////////////////
340
341 3a9d19ed Leszek Koltunski
  public int getCurMove(int size, int cat, int pat)
342 d18993ac Leszek Koltunski
    {
343 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
344 d18993ac Leszek Koltunski
      {
345 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
346
      return c!=null ? c.getPatternCurMove(pat):0;
347 d18993ac Leszek Koltunski
      }
348
349
    return 0;
350
    }
351
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353
354 3a9d19ed Leszek Koltunski
  public int getNumMoves(int size, int cat, int pat)
355 d18993ac Leszek Koltunski
    {
356 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
357 d18993ac Leszek Koltunski
      {
358 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
359
      return c!=null ? c.getPatternNumMove(pat):0;
360 d18993ac Leszek Koltunski
      }
361
362
    return 0;
363
    }
364
365
///////////////////////////////////////////////////////////////////////////////////////////////////
366
367 3a9d19ed Leszek Koltunski
  public String retNextMove(int size, int cat, int pat)
368 d18993ac Leszek Koltunski
    {
369 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
370 d18993ac Leszek Koltunski
      {
371 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
372
      if( c!=null ) return c.retNextMove(pat);
373 d18993ac Leszek Koltunski
      }
374
375 3a9d19ed Leszek Koltunski
    return "";
376 d18993ac Leszek Koltunski
    }
377
378
///////////////////////////////////////////////////////////////////////////////////////////////////
379
380 3a9d19ed Leszek Koltunski
  public String retPrevMove(int size, int cat, int pat)
381 d18993ac Leszek Koltunski
    {
382 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
383 d18993ac Leszek Koltunski
      {
384 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
385
      if( c!=null ) return c.retPrevMove(pat);
386 d18993ac Leszek Koltunski
      }
387
388 3a9d19ed Leszek Koltunski
    return "";
389 d18993ac Leszek Koltunski
    }
390
391
///////////////////////////////////////////////////////////////////////////////////////////////////
392
393 3a9d19ed Leszek Koltunski
  public String retInitializationString(int size,int cat, int pat)
394 d18993ac Leszek Koltunski
    {
395 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
396 d18993ac Leszek Koltunski
      {
397 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
398
      if( c!=null ) return c.retInitializationString(pat);
399 d18993ac Leszek Koltunski
      }
400 4f470e00 Leszek Koltunski
401 3a9d19ed Leszek Koltunski
    return "";
402 4f470e00 Leszek Koltunski
    }
403 d18993ac Leszek Koltunski
}