В данном проекте необходимо написать программу, собирающую Кубик Рубика.
На вход программе подается последовательность поворотов граней, которые запутывают кубик. Программа выдает последовательность поворотов граней, которые приведут к собранному состоянию кубика.
Для работы с консольной версией небходимо:
- Клонировать ветку main
- Перейти в папку с исходным кодом
- Собрать проект (make)
- Запустить программу, в качестве параметра передать строку с последовательностью поворотов граней.
git clone https://github.com/MixFon/Rubik.git
cd Rubik
make
./rubik_cube "F R U R R U"
--> F L' L' R2 D U' L' L' U ...
Для работы с графической версией необходимо:
- Клонировать ветку main
- Перейти в папку с исходным кодом
- Открыть файл проекта UIRubik.xcodeproj в XCode
git clone https://github.com/MixFon/Rubik.git
cd Rubik
open UIRubik.xcodeproj
В проекте для представления кубика были использованы две модели:
- Массив матриц 3x3
- Матрица 3x3x3
В массиве матриц в каждой матрице хранится цвет. Данный массив используется для поиска решения.
В трехмерной матрице содержатся номена от 0 до 26. Данная матрица используется для представления кубика в 3D.
Массив матриц 3x3 | Матрица 3x3x3 |
---|---|
Для сборки головоломки используется алгоритм "человеческой" сборки, который разделяется на этапов:
- Правильный крест
- Углы первого слоя
- Рёбра среднего слоя
- Крест последнего слоя
- Правильный крест в последнем слое
- Расстановка углов последнего слоя
- Разворот углов третьего слоя.
Более подробно про данный алгоритм можно ознакомиться тут
После нажатия на кнопку Solution появится последовательность поворотов, которая приведет к решению кубика. Для автоматической сборки кубика нужно зажать кнопку Q, для прокрутки назад нужно зажать W. Кнопка Generate генерирует случайную последовательность поворотов.
Собирать кубик можно самостоятельно, нажимая соответствующие символы на клавиатуре:
Грань | Символ | Демо |
---|---|---|
F (Front) | Z | |
F' (Front) | X | |
L (Left) | A | |
L' (Left) | S | |
R (Right) | L | |
R' (Right) | ; | |
B (Back) | C | |
B' (Back) | V | |
U (Up) | D | |
U' (Up) | F | |
D (Down) | J | |
D' (Down) | K |
Одинарная кавычка обозначает вращение грани против часовой стрелки. (F' L' R' B' U' D')
Цифра 2 обозначает двойное вращение грани по часовой стрелке. (F2 L2 R2 B2 U2 D2)