Revision 420eb96d
Added by Leszek Koltunski almost 2 years ago
src/main/java/org/distorted/solvers/SolverCube3.java | ||
---|---|---|
1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2023 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Magic Cube. // |
|
5 |
// // |
|
6 |
// Magic Cube is proprietary software licensed under an EULA which you should have received // |
|
7 |
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html // |
|
8 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
9 |
|
|
10 |
package org.distorted.solvers; |
|
11 |
|
|
12 |
import android.content.res.Resources; |
|
13 |
|
|
14 |
import org.distorted.main.R; |
|
15 |
import org.distorted.objectlib.main.TwistyObject; |
|
16 |
import org.distorted.screens.RubikScreenSolver; |
|
17 |
import org.distorted.solvers.cube3.SolverSearch; |
|
18 |
|
|
19 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
20 |
|
|
21 |
public class SolverCube3 |
|
22 |
{ |
|
23 |
private final Resources mRes; |
|
24 |
private final TwistyObject mObject; |
|
25 |
private int mColorID; |
|
26 |
|
|
27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
28 |
|
|
29 |
private int mapCubitToFace(int cubit, int face) |
|
30 |
{ |
|
31 |
if( cubit<8 ) |
|
32 |
{ |
|
33 |
switch(face) |
|
34 |
{ |
|
35 |
case 0: return 1; |
|
36 |
case 1: if( cubit==2 ) return 5; |
|
37 |
if( cubit==1 ) return 3; |
|
38 |
return 1; |
|
39 |
case 2: return cubit==7 ? 5 : 3; |
|
40 |
case 3: if( cubit==1 ) return 1; |
|
41 |
return cubit==4 ? 5 : 3; |
|
42 |
case 4: return cubit==7 ? 3 : 5; |
|
43 |
case 5: if( cubit==2 ) return 1; |
|
44 |
if( cubit==4 ) return 3; |
|
45 |
return 5; |
|
46 |
} |
|
47 |
} |
|
48 |
|
|
49 |
if( cubit>19 ) return 4; |
|
50 |
|
|
51 |
switch(face) |
|
52 |
{ |
|
53 |
case 0: return cubit==15 || cubit==18 ? 3 : 5; |
|
54 |
case 1: return cubit==13 || cubit==16 ? 3 : 5; |
|
55 |
case 2: return cubit==10 ? 5 : 3; |
|
56 |
case 3: return cubit== 8 ? 3 : 5; |
|
57 |
case 4: return cubit== 9 ? 3 : 5; |
|
58 |
case 5: return cubit== 8 ? 5 : 3; |
|
59 |
} |
|
60 |
|
|
61 |
return -1; |
|
62 |
} |
|
63 |
|
|
64 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
65 |
|
|
66 |
private int checkPosition(String position) |
|
67 |
{ |
|
68 |
int[] numColors = new int[6]; |
|
69 |
int len = position.length(); |
|
70 |
|
|
71 |
for(int i=0; i<len; i++) |
|
72 |
{ |
|
73 |
char ch = position.charAt(i); |
|
74 |
|
|
75 |
switch(ch) |
|
76 |
{ |
|
77 |
case 'R': numColors[0]++; break; |
|
78 |
case 'L': numColors[1]++; break; |
|
79 |
case 'U': numColors[2]++; break; |
|
80 |
case 'D': numColors[3]++; break; |
|
81 |
case 'F': numColors[4]++; break; |
|
82 |
case 'B': numColors[5]++; break; |
|
83 |
} |
|
84 |
} |
|
85 |
|
|
86 |
if( numColors[0]<9 ) { mColorID = R.string.color_yellow; return numColors[0]; } |
|
87 |
if( numColors[1]<9 ) { mColorID = R.string.color_white ; return numColors[1]; } |
|
88 |
if( numColors[2]<9 ) { mColorID = R.string.color_blue ; return numColors[2]; } |
|
89 |
if( numColors[3]<9 ) { mColorID = R.string.color_green ; return numColors[3]; } |
|
90 |
if( numColors[4]<9 ) { mColorID = R.string.color_red ; return numColors[4]; } |
|
91 |
if( numColors[5]<9 ) { mColorID = R.string.color_orange; return numColors[5]; } |
|
92 |
|
|
93 |
return -1; |
|
94 |
} |
|
95 |
|
|
96 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
97 |
// order: Up --> Right --> Front --> Down --> Left --> Back |
|
98 |
// (because the first implemented Solver - the two-phase Cube3 one - expects such order) |
|
99 |
// |
|
100 |
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB" |
|
101 |
|
|
102 |
private String preparePosition() |
|
103 |
{ |
|
104 |
StringBuilder objectString = new StringBuilder(); |
|
105 |
|
|
106 |
final int R = 0; |
|
107 |
final int L = 1; |
|
108 |
final int U = 2; |
|
109 |
final int D = 3; |
|
110 |
final int F = 4; |
|
111 |
final int B = 5; |
|
112 |
|
|
113 |
// 'I' - interior, theoretically can happen |
|
114 |
final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B', 'I'}; |
|
115 |
|
|
116 |
final int[] U_INDEX = { 2,10, 6,17,22,19, 3,11, 7}; |
|
117 |
final int[] R_INDEX = { 7,19, 6,15,20,14, 5,18, 4}; |
|
118 |
final int[] F_INDEX = { 3,11, 7,13,24,15, 1, 9, 5}; |
|
119 |
final int[] D_INDEX = { 1, 9, 5,16,23,18, 0, 8, 4}; |
|
120 |
final int[] L_INDEX = { 2,17, 3,12,21,13, 0,16, 1}; |
|
121 |
final int[] B_INDEX = { 6,10, 2,14,25,12, 4, 8, 0}; |
|
122 |
|
|
123 |
for(int i=0; i<9; i++) |
|
124 |
{ |
|
125 |
int face = mapCubitToFace(U_INDEX[i],U); |
|
126 |
int color = mObject.getCubitFaceColorIndex(U_INDEX[i], face); |
|
127 |
objectString.append(FACE_NAMES[color]); |
|
128 |
} |
|
129 |
for(int i=0; i<9; i++) |
|
130 |
{ |
|
131 |
int face = mapCubitToFace(R_INDEX[i],R); |
|
132 |
int color = mObject.getCubitFaceColorIndex(R_INDEX[i], face); |
|
133 |
objectString.append(FACE_NAMES[color]); |
|
134 |
} |
|
135 |
for(int i=0; i<9; i++) |
|
136 |
{ |
|
137 |
int face = mapCubitToFace(F_INDEX[i],F); |
|
138 |
int color = mObject.getCubitFaceColorIndex(F_INDEX[i], face); |
|
139 |
objectString.append(FACE_NAMES[color]); |
|
140 |
} |
|
141 |
for(int i=0; i<9; i++) |
|
142 |
{ |
|
143 |
int face = mapCubitToFace(D_INDEX[i],D); |
|
144 |
int color = mObject.getCubitFaceColorIndex(D_INDEX[i], face); |
|
145 |
objectString.append(FACE_NAMES[color]); |
|
146 |
} |
|
147 |
for(int i=0; i<9; i++) |
|
148 |
{ |
|
149 |
int face = mapCubitToFace(L_INDEX[i],L); |
|
150 |
int color = mObject.getCubitFaceColorIndex(L_INDEX[i], face); |
|
151 |
objectString.append(FACE_NAMES[color]); |
|
152 |
} |
|
153 |
for(int i=0; i<9; i++) |
|
154 |
{ |
|
155 |
int face = mapCubitToFace(B_INDEX[i],B); |
|
156 |
int color = mObject.getCubitFaceColorIndex(B_INDEX[i], face); |
|
157 |
objectString.append(FACE_NAMES[color]); |
|
158 |
} |
|
159 |
|
|
160 |
return objectString.toString(); |
|
161 |
} |
|
162 |
|
|
163 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
164 |
// PUBLIC API |
|
165 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
166 |
|
|
167 |
public SolverCube3(Resources res, TwistyObject object) |
|
168 |
{ |
|
169 |
mRes = res; |
|
170 |
mObject= object; |
|
171 |
} |
|
172 |
|
|
173 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
174 |
|
|
175 |
public void solve(RubikScreenSolver solver) |
|
176 |
{ |
|
177 |
String result; |
|
178 |
|
|
179 |
SolverSearch.prepare(mRes); |
|
180 |
String objectPosition = preparePosition(); |
|
181 |
int check = checkPosition(objectPosition); |
|
182 |
|
|
183 |
if( check<0 ) |
|
184 |
{ |
|
185 |
result = SolverSearch.solution(objectPosition, 24, 20); |
|
186 |
|
|
187 |
if (result.contains("Error")) |
|
188 |
{ |
|
189 |
switch (result.charAt(result.length() - 1)) |
|
190 |
{ |
|
191 |
case '1': result = mRes.getString(R.string.solver_cube3_error1); break; |
|
192 |
case '2': result = mRes.getString(R.string.solver_cube3_error2); break; |
|
193 |
case '3': result = mRes.getString(R.string.solver_cube3_error3); break; |
|
194 |
case '4': result = mRes.getString(R.string.solver_cube3_error4); break; |
|
195 |
case '5': result = mRes.getString(R.string.solver_cube3_error5); break; |
|
196 |
case '6': result = mRes.getString(R.string.solver_cube3_error6); break; |
|
197 |
case '7': result = mRes.getString(R.string.solver_cube3_error7); break; |
|
198 |
case '8': result = mRes.getString(R.string.solver_cube3_error8); break; |
|
199 |
case '9': result = mRes.getString(R.string.solver_cube3_error9); break; |
|
200 |
} |
|
201 |
|
|
202 |
solver.displayErrorDialog(result); |
|
203 |
} |
|
204 |
else |
|
205 |
{ |
|
206 |
solver.setSolved(result); |
|
207 |
} |
|
208 |
} |
|
209 |
else |
|
210 |
{ |
|
211 |
String color = mRes.getString(mColorID); |
|
212 |
result = mRes.getString(R.string.solver_cube3_error1,check,color); |
|
213 |
solver.displayErrorDialog(result); |
|
214 |
} |
|
215 |
} |
|
216 |
} |
|
217 |
|
src/main/java/org/distorted/solvers/SolverMain.java | ||
---|---|---|
17 | 17 |
import org.distorted.main.R; |
18 | 18 |
import org.distorted.screens.ScreenList; |
19 | 19 |
import org.distorted.screens.RubikScreenSolver; |
20 |
import org.distorted.solvers.cube3.SolverSearch;
|
|
20 |
import org.distorted.solvers.pduo.SolverPyraminxDuo;
|
|
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 | 23 |
|
24 | 24 |
public class SolverMain implements Runnable |
25 | 25 |
{ |
26 | 26 |
private final Resources mRes; |
27 |
private final TwistyObject mObject; |
|
28 | 27 |
private final long mSignature; |
29 |
private int mColorID;
|
|
28 |
private final TwistyObject mObject;
|
|
30 | 29 |
|
31 | 30 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
32 | 31 |
|
... | ... | |
59 | 58 |
return -1; |
60 | 59 |
} |
61 | 60 |
|
62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
63 |
|
|
64 |
private void solveCube3(RubikScreenSolver solver) |
|
65 |
{ |
|
66 |
String result; |
|
67 |
|
|
68 |
SolverSearch.prepare(mRes); |
|
69 |
String objectPosition = prepareCube3position(); |
|
70 |
int check = checkPosition(objectPosition); |
|
71 |
|
|
72 |
if( check<0 ) |
|
73 |
{ |
|
74 |
result = SolverSearch.solution(objectPosition, 24, 20); |
|
75 |
|
|
76 |
if (result.contains("Error")) |
|
77 |
{ |
|
78 |
switch (result.charAt(result.length() - 1)) |
|
79 |
{ |
|
80 |
case '1': result = mRes.getString(R.string.solver_cube3_error1); break; |
|
81 |
case '2': result = mRes.getString(R.string.solver_cube3_error2); break; |
|
82 |
case '3': result = mRes.getString(R.string.solver_cube3_error3); break; |
|
83 |
case '4': result = mRes.getString(R.string.solver_cube3_error4); break; |
|
84 |
case '5': result = mRes.getString(R.string.solver_cube3_error5); break; |
|
85 |
case '6': result = mRes.getString(R.string.solver_cube3_error6); break; |
|
86 |
case '7': result = mRes.getString(R.string.solver_cube3_error7); break; |
|
87 |
case '8': result = mRes.getString(R.string.solver_cube3_error8); break; |
|
88 |
case '9': result = mRes.getString(R.string.solver_cube3_error9); break; |
|
89 |
} |
|
90 |
|
|
91 |
solver.displayErrorDialog(result); |
|
92 |
} |
|
93 |
else |
|
94 |
{ |
|
95 |
solver.setSolved(result); |
|
96 |
} |
|
97 |
} |
|
98 |
else |
|
99 |
{ |
|
100 |
String color = mRes.getString(mColorID); |
|
101 |
result = mRes.getString(R.string.solver_cube3_error1,check,color); |
|
102 |
solver.displayErrorDialog(result); |
|
103 |
} |
|
104 |
} |
|
105 |
|
|
106 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
107 |
|
|
108 |
private int mapCubitToFace(int cubit, int face) |
|
109 |
{ |
|
110 |
if( cubit<8 ) |
|
111 |
{ |
|
112 |
switch(face) |
|
113 |
{ |
|
114 |
case 0: return 1; |
|
115 |
case 1: if( cubit==2 ) return 5; |
|
116 |
if( cubit==1 ) return 3; |
|
117 |
return 1; |
|
118 |
case 2: return cubit==7 ? 5 : 3; |
|
119 |
case 3: if( cubit==1 ) return 1; |
|
120 |
return cubit==4 ? 5 : 3; |
|
121 |
case 4: return cubit==7 ? 3 : 5; |
|
122 |
case 5: if( cubit==2 ) return 1; |
|
123 |
if( cubit==4 ) return 3; |
|
124 |
return 5; |
|
125 |
} |
|
126 |
} |
|
127 |
|
|
128 |
if( cubit>19 ) return 4; |
|
129 |
|
|
130 |
switch(face) |
|
131 |
{ |
|
132 |
case 0: return cubit==15 || cubit==18 ? 3 : 5; |
|
133 |
case 1: return cubit==13 || cubit==16 ? 3 : 5; |
|
134 |
case 2: return cubit==10 ? 5 : 3; |
|
135 |
case 3: return cubit== 8 ? 3 : 5; |
|
136 |
case 4: return cubit== 9 ? 3 : 5; |
|
137 |
case 5: return cubit== 8 ? 5 : 3; |
|
138 |
} |
|
139 |
|
|
140 |
return -1; |
|
141 |
} |
|
142 |
|
|
143 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
144 |
|
|
145 |
private int checkPosition(String position) |
|
146 |
{ |
|
147 |
int[] numColors = new int[6]; |
|
148 |
int len = position.length(); |
|
149 |
|
|
150 |
for(int i=0; i<len; i++) |
|
151 |
{ |
|
152 |
char ch = position.charAt(i); |
|
153 |
|
|
154 |
switch(ch) |
|
155 |
{ |
|
156 |
case 'R': numColors[0]++; break; |
|
157 |
case 'L': numColors[1]++; break; |
|
158 |
case 'U': numColors[2]++; break; |
|
159 |
case 'D': numColors[3]++; break; |
|
160 |
case 'F': numColors[4]++; break; |
|
161 |
case 'B': numColors[5]++; break; |
|
162 |
} |
|
163 |
} |
|
164 |
|
|
165 |
if( numColors[0]<9 ) { mColorID = R.string.color_yellow; return numColors[0]; } |
|
166 |
if( numColors[1]<9 ) { mColorID = R.string.color_white ; return numColors[1]; } |
|
167 |
if( numColors[2]<9 ) { mColorID = R.string.color_blue ; return numColors[2]; } |
|
168 |
if( numColors[3]<9 ) { mColorID = R.string.color_green ; return numColors[3]; } |
|
169 |
if( numColors[4]<9 ) { mColorID = R.string.color_red ; return numColors[4]; } |
|
170 |
if( numColors[5]<9 ) { mColorID = R.string.color_orange; return numColors[5]; } |
|
171 |
|
|
172 |
return -1; |
|
173 |
} |
|
174 |
|
|
175 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
176 |
// order: Up --> Right --> Front --> Down --> Left --> Back |
|
177 |
// (because the first implemented Solver - the two-phase Cube3 one - expects such order) |
|
178 |
// |
|
179 |
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB" |
|
180 |
|
|
181 |
private String prepareCube3position() |
|
182 |
{ |
|
183 |
StringBuilder objectString = new StringBuilder(); |
|
184 |
|
|
185 |
final int R = 0; |
|
186 |
final int L = 1; |
|
187 |
final int U = 2; |
|
188 |
final int D = 3; |
|
189 |
final int F = 4; |
|
190 |
final int B = 5; |
|
191 |
|
|
192 |
// 'I' - interior, theoretically can happen |
|
193 |
final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B', 'I'}; |
|
194 |
|
|
195 |
final int[] U_INDEX = { 2,10, 6,17,22,19, 3,11, 7}; |
|
196 |
final int[] R_INDEX = { 7,19, 6,15,20,14, 5,18, 4}; |
|
197 |
final int[] F_INDEX = { 3,11, 7,13,24,15, 1, 9, 5}; |
|
198 |
final int[] D_INDEX = { 1, 9, 5,16,23,18, 0, 8, 4}; |
|
199 |
final int[] L_INDEX = { 2,17, 3,12,21,13, 0,16, 1}; |
|
200 |
final int[] B_INDEX = { 6,10, 2,14,25,12, 4, 8, 0}; |
|
201 |
|
|
202 |
for(int i=0; i<9; i++) |
|
203 |
{ |
|
204 |
int face = mapCubitToFace(U_INDEX[i],U); |
|
205 |
int color = mObject.getCubitFaceColorIndex(U_INDEX[i], face); |
|
206 |
objectString.append(FACE_NAMES[color]); |
|
207 |
} |
|
208 |
for(int i=0; i<9; i++) |
|
209 |
{ |
|
210 |
int face = mapCubitToFace(R_INDEX[i],R); |
|
211 |
int color = mObject.getCubitFaceColorIndex(R_INDEX[i], face); |
|
212 |
objectString.append(FACE_NAMES[color]); |
|
213 |
} |
|
214 |
for(int i=0; i<9; i++) |
|
215 |
{ |
|
216 |
int face = mapCubitToFace(F_INDEX[i],F); |
|
217 |
int color = mObject.getCubitFaceColorIndex(F_INDEX[i], face); |
|
218 |
objectString.append(FACE_NAMES[color]); |
|
219 |
} |
|
220 |
for(int i=0; i<9; i++) |
|
221 |
{ |
|
222 |
int face = mapCubitToFace(D_INDEX[i],D); |
|
223 |
int color = mObject.getCubitFaceColorIndex(D_INDEX[i], face); |
|
224 |
objectString.append(FACE_NAMES[color]); |
|
225 |
} |
|
226 |
for(int i=0; i<9; i++) |
|
227 |
{ |
|
228 |
int face = mapCubitToFace(L_INDEX[i],L); |
|
229 |
int color = mObject.getCubitFaceColorIndex(L_INDEX[i], face); |
|
230 |
objectString.append(FACE_NAMES[color]); |
|
231 |
} |
|
232 |
for(int i=0; i<9; i++) |
|
233 |
{ |
|
234 |
int face = mapCubitToFace(B_INDEX[i],B); |
|
235 |
int color = mObject.getCubitFaceColorIndex(B_INDEX[i], face); |
|
236 |
objectString.append(FACE_NAMES[color]); |
|
237 |
} |
|
238 |
|
|
239 |
return objectString.toString(); |
|
240 |
} |
|
241 |
|
|
242 | 61 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
243 | 62 |
|
244 | 63 |
public void start() |
... | ... | |
251 | 70 |
|
252 | 71 |
public void run() |
253 | 72 |
{ |
254 |
RubikScreenSolver solver = (RubikScreenSolver) ScreenList.SVER.getScreenClass();
|
|
73 |
RubikScreenSolver screen = (RubikScreenSolver) ScreenList.SVER.getScreenClass();
|
|
255 | 74 |
|
256 | 75 |
if( mSignature==ObjectSignatures.CUBE_3 ) |
257 | 76 |
{ |
258 |
solveCube3(solver); |
|
77 |
SolverCube3 solver = new SolverCube3(mRes,mObject); |
|
78 |
solver.solve(screen); |
|
79 |
} |
|
80 |
if( mSignature==ObjectSignatures.PDUO_2 ) |
|
81 |
{ |
|
82 |
SolverTablebase solver = new SolverPyraminxDuo(mRes,mObject); |
|
83 |
solver.solve(screen); |
|
259 | 84 |
} |
260 | 85 |
else |
261 | 86 |
{ |
262 |
solver.displayErrorDialog(mRes.getString(R.string.solver_generic_error1));
|
|
87 |
screen.displayErrorDialog(mRes.getString(R.string.solver_generic_error1));
|
|
263 | 88 |
} |
264 | 89 |
} |
265 | 90 |
} |
src/main/java/org/distorted/solvers/SolverTablebase.java | ||
---|---|---|
1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2023 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Magic Cube. // |
|
5 |
// // |
|
6 |
// Magic Cube is proprietary software licensed under an EULA which you should have received // |
|
7 |
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html // |
|
8 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
9 |
|
|
10 |
package org.distorted.solvers; |
|
11 |
|
|
12 |
import android.content.res.Resources; |
|
13 |
|
|
14 |
import org.distorted.objectlib.main.TwistyObject; |
|
15 |
import org.distorted.screens.RubikScreenSolver; |
|
16 |
|
|
17 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
18 |
|
|
19 |
public abstract class SolverTablebase |
|
20 |
{ |
|
21 |
private final Resources mRes; |
|
22 |
private final TwistyObject mObject; |
|
23 |
|
|
24 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
25 |
|
|
26 |
public abstract String constructError(); |
|
27 |
public abstract int[] prepareQuats(TwistyObject object); |
|
28 |
public abstract String solution(int[] quats, Resources res); |
|
29 |
|
|
30 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
31 |
// PUBLIC API |
|
32 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
33 |
|
|
34 |
public SolverTablebase(Resources res, TwistyObject object) |
|
35 |
{ |
|
36 |
mRes = res; |
|
37 |
mObject= object; |
|
38 |
} |
|
39 |
|
|
40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
41 |
|
|
42 |
public void solve(RubikScreenSolver solver) |
|
43 |
{ |
|
44 |
String result; |
|
45 |
|
|
46 |
int[] quats = prepareQuats(mObject); |
|
47 |
|
|
48 |
if( quats!=null ) |
|
49 |
{ |
|
50 |
result = solution(quats,mRes); |
|
51 |
solver.setSolved(result); |
|
52 |
} |
|
53 |
else |
|
54 |
{ |
|
55 |
String error = constructError(); |
|
56 |
solver.displayErrorDialog(error); |
|
57 |
} |
|
58 |
} |
|
59 |
} |
|
60 |
|
src/main/java/org/distorted/solvers/pduo/SolverPyraminxDuo.java | ||
---|---|---|
1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
2 |
// Copyright 2023 Leszek Koltunski // |
|
3 |
// // |
|
4 |
// This file is part of Magic Cube. // |
|
5 |
// // |
|
6 |
// Magic Cube is proprietary software licensed under an EULA which you should have received // |
|
7 |
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html // |
|
8 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
9 |
|
|
10 |
package org.distorted.solvers.pduo; |
|
11 |
|
|
12 |
import android.content.res.Resources; |
|
13 |
|
|
14 |
import org.distorted.objectlib.main.TwistyObject; |
|
15 |
import org.distorted.solvers.SolverTablebase; |
|
16 |
|
|
17 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
18 |
|
|
19 |
public class SolverPyraminxDuo extends SolverTablebase |
|
20 |
{ |
|
21 |
private int mErrorID; |
|
22 |
|
|
23 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
24 |
|
|
25 |
public SolverPyraminxDuo(Resources res, TwistyObject object) |
|
26 |
{ |
|
27 |
super(res,object); |
|
28 |
} |
|
29 |
|
|
30 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
31 |
// TODO |
|
32 |
public String constructError() |
|
33 |
{ |
|
34 |
return null; |
|
35 |
} |
|
36 |
|
|
37 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
38 |
// TODO |
|
39 |
public int[] prepareQuats(TwistyObject object) |
|
40 |
{ |
|
41 |
return null; |
|
42 |
} |
|
43 |
|
|
44 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
45 |
// TODO |
|
46 |
public String solution(int[] quats, Resources res) |
|
47 |
{ |
|
48 |
return null; |
|
49 |
} |
|
50 |
} |
|
51 |
|
Also available in: Unified diff
Beginnings of the Pyraminx Duo solver.