1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
/* Moves and other things */
#ifndef PIECES_H
#define PIECES_H
typedef enum {
U, U2, U3, D, D2, D3, R, R2, R3, L, L2, L3, F, F2, F3, B, B2, B3,
Uw, Uw2, Uw3, Dw, Dw2, Dw3, Rw, Rw2, Rw3,
Lw, Lw2, Lw3, Fw, Fw2, Fw3, Bw, Bw2, Bw3,
M, M2, M3, S, S2, S3, E, E2, E3,
X, X2, X3, Y, Y2, Y3, Z, Z2, Z3,
NULLMOVE
} Move;
typedef enum {
U_center, D_center, R_center, L_center, F_center, B_center
} Center;
typedef enum { UF, UL, UB, UR, DF, DL, DB, DR, FR, FL, BL, BR } Edge;
typedef enum { UFR, UFL, UBL, UBR, DFR, DFL, DBL, DBR } Corner;
/* Arrays for strings of pieces and moves */
extern char edge_string[12][5];
extern char corner_string[8][5];
extern char center_string[6][5];
extern char move_string[NULLMOVE+1][5];
/* Three big arrays that determine the movement of edges, corners and
* centers for some of the basic moves. Yes, one can be much more elegant and
* write much fewer lines. But then things get less elegant somewhere else. */
extern int edge_cycle[NULLMOVE+1][12];
extern int corner_cycle[NULLMOVE+1][8];
extern int center_cycle[NULLMOVE+1][6];
/* Representation of the cube */
typedef struct {
/* Edge orientation */
int eofb;
int eorl;
int eoud;
/* Corner orientation */
int coud;
int cofb;
int corl;
/* Position of M/E/S slice edges */
/* TODO: keep in mind that the 4! positions with edges in correct slice
* must be the first 4! indeces */
int epose;
int eposs;
int eposm;
/* Permutation of corners */
int cp;
/* Position of centers */
int centerpos;
} Cube;
#endif
|