Project

General

Profile

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

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

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