Project

General

Profile

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

magiccube / src / main / java / org / distorted / patterns / RubikPattern.java @ 044529c1

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 044529c1 Leszek Koltunski
  private int[] numCategories   = new int[NUM_CUBES];
33
  private int[] currentCategory = new int[NUM_CUBES];
34 d18993ac Leszek Koltunski
  private Vector<Category>[] mCategories;
35 4f470e00 Leszek Koltunski
  private static RubikPattern mThis;
36
37 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 3a9d19ed Leszek Koltunski
  private static class Category
40 d18993ac Leszek Koltunski
    {
41
    private String name;
42 3a9d19ed Leszek Koltunski
    private int numPatterns;
43 d18993ac Leszek Koltunski
    private Vector<Pattern> patterns;
44 3a9d19ed Leszek Koltunski
45
  /////////////////////////////////////////////////////////////
46 d18993ac Leszek Koltunski
47 4f470e00 Leszek Koltunski
    Category(String n)
48 d18993ac Leszek Koltunski
      {
49
      name=n;
50 3a9d19ed Leszek Koltunski
      numPatterns=0;
51 d18993ac Leszek Koltunski
      patterns = new Vector<>();
52
      }
53 3a9d19ed Leszek Koltunski
54
  /////////////////////////////////////////////////////////////
55
56 4f470e00 Leszek Koltunski
    void addPattern(Pattern p)
57 d18993ac Leszek Koltunski
      {
58
      patterns.addElement(p);
59 3a9d19ed Leszek Koltunski
      numPatterns++;
60 d18993ac Leszek Koltunski
      }
61 3a9d19ed Leszek Koltunski
62
  /////////////////////////////////////////////////////////////
63
64 4f470e00 Leszek Koltunski
    int getNumPatterns()
65 d18993ac Leszek Koltunski
    {
66 3a9d19ed Leszek Koltunski
    return numPatterns;
67 4f470e00 Leszek Koltunski
    }
68 3a9d19ed Leszek Koltunski
69
  /////////////////////////////////////////////////////////////
70
71 4f470e00 Leszek Koltunski
    String getName()
72 d18993ac Leszek Koltunski
    {
73
    return name;
74
    }
75 3a9d19ed Leszek Koltunski
76
  /////////////////////////////////////////////////////////////
77
78
    String getPatternName(int pattern)
79 d18993ac Leszek Koltunski
      {
80 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
81
        {
82
        Pattern p = patterns.elementAt(pattern);
83
        return  p!=null ? p.getName():"";
84
        }
85
      return "";
86 d18993ac Leszek Koltunski
      }
87 3a9d19ed Leszek Koltunski
88
  /////////////////////////////////////////////////////////////
89
90
    int getPatternCurMove(int pattern)
91 d18993ac Leszek Koltunski
      {
92 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
93
        {
94
        Pattern p = patterns.elementAt(pattern);
95
        return  p!=null ? p.getCurMove():-1;
96
        }
97
      return -1;
98 d18993ac Leszek Koltunski
      }
99 3a9d19ed Leszek Koltunski
100
  /////////////////////////////////////////////////////////////
101
102
    int getPatternNumMove(int pattern)
103 d18993ac Leszek Koltunski
      {
104 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
105
        {
106
        Pattern p = patterns.elementAt(pattern);
107
        return  p!=null ? p.getNumMove():-1;
108
        }
109
      return -1;
110 d18993ac Leszek Koltunski
      }
111 3a9d19ed Leszek Koltunski
112
  /////////////////////////////////////////////////////////////
113
114
    String retInitializationString(int pattern)
115 d18993ac Leszek Koltunski
      {
116 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
117
        {
118
        Pattern p = patterns.elementAt(pattern);
119
        if( p!=null ) return p.retInitializationString();
120
        }
121
122
      return "";
123 d18993ac Leszek Koltunski
      }
124 3a9d19ed Leszek Koltunski
125
  /////////////////////////////////////////////////////////////
126
127
    String retNextMove(int pattern)
128 d18993ac Leszek Koltunski
      {
129 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
130
        {
131
        Pattern p = patterns.elementAt(pattern);
132
        if( p!=null ) return p.retNextMove();
133
        }
134
135
      return "";
136 d18993ac Leszek Koltunski
      }
137 3a9d19ed Leszek Koltunski
138
  /////////////////////////////////////////////////////////////
139
140
    String retPrevMove(int pattern)
141 d18993ac Leszek Koltunski
      {
142 3a9d19ed Leszek Koltunski
      if( pattern>=0 && pattern<numPatterns )
143
        {
144
        Pattern p = patterns.elementAt(pattern);
145
        if( p!=null ) return p.retPrevMove();
146
        }
147
148
      return "";
149 d18993ac Leszek Koltunski
      }
150
    }
151
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
154 3a9d19ed Leszek Koltunski
  private static class Pattern
155 d18993ac Leszek Koltunski
    {
156
    private String name;
157
    private String moves;
158 39566863 Leszek Koltunski
    private int curMove;
159
    private int numMove;
160 d18993ac Leszek Koltunski
161 3a9d19ed Leszek Koltunski
  /////////////////////////////////////////////////////////////
162
163 4f470e00 Leszek Koltunski
    Pattern(String n, String m)
164 d18993ac Leszek Koltunski
      {
165
      name=n;
166
      moves=m;
167 39566863 Leszek Koltunski
      numMove = moves.length()/4;
168
      curMove=numMove;
169 d18993ac Leszek Koltunski
      }
170 3a9d19ed Leszek Koltunski
171
  /////////////////////////////////////////////////////////////
172
173
    String getName()
174 d18993ac Leszek Koltunski
      {
175 39566863 Leszek Koltunski
      return name;
176 d18993ac Leszek Koltunski
      }
177 3a9d19ed Leszek Koltunski
178
  /////////////////////////////////////////////////////////////
179
180 4f470e00 Leszek Koltunski
    int getNumMove()
181 d18993ac Leszek Koltunski
    {
182 39566863 Leszek Koltunski
    return numMove;
183 d18993ac Leszek Koltunski
    }
184 3a9d19ed Leszek Koltunski
185
  /////////////////////////////////////////////////////////////
186
187 4f470e00 Leszek Koltunski
    int getCurMove()
188 d18993ac Leszek Koltunski
    {
189 39566863 Leszek Koltunski
    return curMove;
190 d18993ac Leszek Koltunski
    }
191 3a9d19ed Leszek Koltunski
192
  /////////////////////////////////////////////////////////////
193
194
    String retNextMove()
195 d18993ac Leszek Koltunski
      {
196 39566863 Leszek Koltunski
      curMove++;
197 3a9d19ed Leszek Koltunski
198 39566863 Leszek Koltunski
      if( curMove>numMove)
199 d18993ac Leszek Koltunski
        {
200 39566863 Leszek Koltunski
        curMove= 0;
201 3a9d19ed Leszek Koltunski
        return retInitializationString();
202 d18993ac Leszek Koltunski
        }
203
      else
204
        {
205 39566863 Leszek Koltunski
        curMove--;
206
        return moves.substring(4*curMove-4,4*curMove);
207 d18993ac Leszek Koltunski
        }
208
      }
209 3a9d19ed Leszek Koltunski
210
  /////////////////////////////////////////////////////////////
211
212
    String retPrevMove()
213 d18993ac Leszek Koltunski
      {
214 39566863 Leszek Koltunski
      curMove--;
215 3a9d19ed Leszek Koltunski
216 39566863 Leszek Koltunski
      if( curMove<0)
217 d18993ac Leszek Koltunski
        {
218 39566863 Leszek Koltunski
        curMove=numMove;
219 3a9d19ed Leszek Koltunski
        return retInitializationString();
220 d18993ac Leszek Koltunski
        }
221
      else
222
        {
223 39566863 Leszek Koltunski
        curMove++;
224
        return moves.substring(4*curMove,4*curMove+4);
225 d18993ac Leszek Koltunski
        }
226
      }
227 3a9d19ed Leszek Koltunski
228
  /////////////////////////////////////////////////////////////
229
230
    String retInitializationString()
231 d18993ac Leszek Koltunski
      {
232 39566863 Leszek Koltunski
      return moves.substring(0,4*curMove);
233 d18993ac Leszek Koltunski
      }
234
    }
235
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237
238 4f470e00 Leszek Koltunski
  private RubikPattern()
239 d18993ac Leszek Koltunski
    {
240
    mCategories = new Vector[NUM_CUBES];
241 4f470e00 Leszek Koltunski
242 d18993ac Leszek Koltunski
    initializeCategories(0, RubikPatternData2.patterns);
243
    initializeCategories(1, RubikPatternData3.patterns);
244
    initializeCategories(2, RubikPatternData4.patterns);
245
    initializeCategories(3, RubikPatternData5.patterns);
246
    }
247
248
///////////////////////////////////////////////////////////////////////////////////////////////////
249
250
  private void initializeCategories(int num, String[] pat)
251
    {
252
    int colon;
253
    mCategories[num] = new Vector<>();
254
    Category cat=null;
255
    String name, pattern;
256
    Pattern patt;
257
258
    numCategories[num]=0;
259
260
    for(String p: pat)
261
      {
262
      colon = p.indexOf(':');
263
264
      if( colon==-1 )
265
        {
266
        cat = new Category(p);
267
        mCategories[num].addElement(cat);
268
        numCategories[num]++;
269
        }
270
      else
271
        {
272
        pattern = p.substring(colon+1);
273
        name    = p.substring(0,colon);
274
        patt = new Pattern(name,pattern);
275
        cat.addPattern(patt);
276
        }
277
      }
278
    }
279
280 4f470e00 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
281
// PUBLIC API
282
///////////////////////////////////////////////////////////////////////////////////////////////////
283
284
  public static RubikPattern getInstance()
285
    {
286
    if( mThis==null )
287
      {
288
      mThis = new RubikPattern();
289
      }
290
291
    return mThis;
292
    }
293
294 3a9d19ed Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
295
296
  public int getNumCategories(int size)
297
    {
298
    return size>=0 && size<NUM_CUBES ? numCategories[size] : 0;
299
    }
300
301 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
302
303
  public String getCategoryName(int size,int num)
304
    {
305 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
306 d18993ac Leszek Koltunski
      {
307 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
308 d18993ac Leszek Koltunski
      return c!=null ? c.getName() : null;
309
      }
310
311
    return null;
312
    }
313
314 044529c1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
315
316
  public void rememberCategory(int size,int num)
317
    {
318
    if( size>=0 && size<NUM_CUBES )
319
      {
320
      currentCategory[size] = num;
321
      }
322
    }
323
324
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326
  public int recallCategory(int size)
327
    {
328
    return size>=0 && size<NUM_CUBES ? currentCategory[size] : 0;
329
    }
330
331 d18993ac Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
332
333 3a9d19ed Leszek Koltunski
  public String getPatternName(int size, int cat, int pat)
334 d18993ac Leszek Koltunski
    {
335 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
336 d18993ac Leszek Koltunski
      {
337 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
338
      return c!=null ? c.getPatternName(pat) : null;
339 d18993ac Leszek Koltunski
      }
340
341
    return null;
342
    }
343
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345
346
  public int getNumPatterns(int size, int num )
347
    {
348 4f470e00 Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && num>=0 && num< numCategories[size] )
349 d18993ac Leszek Koltunski
      {
350 4f470e00 Leszek Koltunski
      Category c = mCategories[size].elementAt(num);
351 d18993ac Leszek Koltunski
      return c!=null ? c.getNumPatterns() : 0;
352
      }
353
354
    return 0;
355
    }
356
357
///////////////////////////////////////////////////////////////////////////////////////////////////
358
359 3a9d19ed Leszek Koltunski
  public int getCurMove(int size, int cat, int pat)
360 d18993ac Leszek Koltunski
    {
361 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
362 d18993ac Leszek Koltunski
      {
363 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
364
      return c!=null ? c.getPatternCurMove(pat):0;
365 d18993ac Leszek Koltunski
      }
366
367
    return 0;
368
    }
369
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371
372 3a9d19ed Leszek Koltunski
  public int getNumMoves(int size, int cat, int pat)
373 d18993ac Leszek Koltunski
    {
374 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
375 d18993ac Leszek Koltunski
      {
376 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
377
      return c!=null ? c.getPatternNumMove(pat):0;
378 d18993ac Leszek Koltunski
      }
379
380
    return 0;
381
    }
382
383
///////////////////////////////////////////////////////////////////////////////////////////////////
384
385 3a9d19ed Leszek Koltunski
  public String retNextMove(int size, int cat, int pat)
386 d18993ac Leszek Koltunski
    {
387 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
388 d18993ac Leszek Koltunski
      {
389 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
390
      if( c!=null ) return c.retNextMove(pat);
391 d18993ac Leszek Koltunski
      }
392
393 3a9d19ed Leszek Koltunski
    return "";
394 d18993ac Leszek Koltunski
    }
395
396
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398 3a9d19ed Leszek Koltunski
  public String retPrevMove(int size, int cat, int pat)
399 d18993ac Leszek Koltunski
    {
400 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
401 d18993ac Leszek Koltunski
      {
402 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
403
      if( c!=null ) return c.retPrevMove(pat);
404 d18993ac Leszek Koltunski
      }
405
406 3a9d19ed Leszek Koltunski
    return "";
407 d18993ac Leszek Koltunski
    }
408
409
///////////////////////////////////////////////////////////////////////////////////////////////////
410
411 3a9d19ed Leszek Koltunski
  public String retInitializationString(int size,int cat, int pat)
412 d18993ac Leszek Koltunski
    {
413 3a9d19ed Leszek Koltunski
    if( size>=0 && size<NUM_CUBES && cat>=0 && cat< numCategories[size] )
414 d18993ac Leszek Koltunski
      {
415 3a9d19ed Leszek Koltunski
      Category c = mCategories[size].elementAt(cat);
416
      if( c!=null ) return c.retInitializationString(pat);
417 d18993ac Leszek Koltunski
      }
418 4f470e00 Leszek Koltunski
419 3a9d19ed Leszek Koltunski
    return "";
420 4f470e00 Leszek Koltunski
    }
421 d18993ac Leszek Koltunski
}