| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #include <stdlib.h>
- #include <string.h>
- #include "rubiks.h"
- /**
- * Transform: [ axis, offset, dir ]
- * Axis: X | Y | Z
- * 5
- * +---+
- * +Y / 2 /|
- * | +---+1/
- * | 3| 0 |/
- * | +---+
- * 4
- * ---> +X
- * /
- * /
- * -Z
- *
- * +--+
- * |5 |
- * +--+
- * |2 |
- * +--+--+--+
- * |3 |0 |1 |
- * Y +--+--+--+
- * |4 |
- * | +--+
- * |
- * +--> X
- *
- * offset: '1' >= '3'
- * dir: '+' : '-' (+: trigonometric direction)
- **/
- void rubik_applyVect(t_rubiks *r, char v[3])
- {
- switch (v[0])
- {
- case 'X':
- rubik_applyX(r, v); break;
- case 'Y':
- rubik_applyY(r, v); break;
- case 'Z':
- rubik_applyZ(r, v); break;
- default:
- break;
- }
- }
- void rubik_reverse(t_rubiks *r, char m)
- {
- char mov[3] = { 0, 0, 0 };
- int init_m = (int) m;
- mov[2] = (char)(m % 2) ? '-' : '+';
- m /= 2;
- mov[1] = '0' + ((char)(m % 3));
- m /= 3;
- mov[0] = 'X' + ((char)(m % 3));
- rubik_applyVect(r, mov);
- }
- void rubik_apply(t_rubiks *r, char m)
- {
- char mov[3] = { 0, 0, 0 };
- int init_m = (int) m;
- mov[2] = (char)(m % 2) ? '+' : '-';
- m /= 2;
- mov[1] = '0' + ((char)(m % 3));
- m /= 3;
- mov[0] = 'X' + ((char)(m % 3));
- rubik_applyVect(r, mov);
- }
- t_rubiks *rubik_createempty()
- {
- t_rubiks *result;
- int i;
- result = (t_rubiks *)malloc(sizeof(*result));
- bzero(result, sizeof(*result));
- return result;
- }
- t_rubiks *rubik_create(char matrix[54])
- {
- t_rubiks *result;
- int i;
- for (i=0; i < 54; i++)
- if (matrix[i] < '0' || matrix[i] > '5')
- return NULL;
- if (matrix[54] != '\0')
- return NULL;
- result = (t_rubiks *)malloc(sizeof(*result));
- memcpy(result->grid, matrix, sizeof(*matrix) * 54);
- return result;
- }
- int rubik_isDone(const t_rubiks *r)
- {
- char current;
- char first;
- int i, j, k;
- for (i = 0; i < 6; ++i)
- {
- first = 1;
- for (j = 0; j < 3; ++j)
- for (k = 0; k < 3; ++k)
- {
- if (first)
- current = r->grid[i][j][k];
- else if (current != r->grid[i][j][k])
- return 0;
- first = 0;
- }
- }
- return 1;
- }
|