Example #1
0
        public void TestRotationRight()
        {
            var cube = new RubiksCube();

            cube.Rotate(CubeSlice.Right);

            CheckSide(cube, CubeSide.Up, CubeColor.White, 6, CubeColor.Green, 3);
            CheckSide(cube, CubeSide.Front, CubeColor.Green, 6, CubeColor.Yellow, 3);
            CheckSide(cube, CubeSide.Down, CubeColor.Yellow, 6, CubeColor.Blue, 3);
            CheckSide(cube, CubeSide.Back, CubeColor.Blue, 6, CubeColor.White, 3);
            CheckSide(cube, CubeSide.Right, CubeColor.Red, 9);
            CheckSide(cube, CubeSide.Left, CubeColor.Orange, 9);
        }
Example #2
0
        public void TestAlgorithm2()
        {
            var cube = new RubiksCube();

            cube.ExecAlgorithm("FRUR'U'F'");

            CheckSide(cube, CubeSide.Up, Tuple(CubeColor.White, 5), Tuple(CubeColor.Blue, 1), Tuple(CubeColor.Green, 1), Tuple(CubeColor.Orange, 2));
            CheckSide(cube, CubeSide.Front, Tuple(CubeColor.Green, 7), Tuple(CubeColor.Red, 1), Tuple(CubeColor.White, 1));
            CheckSide(cube, CubeSide.Down, CubeColor.Yellow, 9);
            CheckSide(cube, CubeSide.Back, Tuple(CubeColor.Blue, 7), Tuple(CubeColor.Red, 2));
            CheckSide(cube, CubeSide.Right, Tuple(CubeColor.Red, 6), Tuple(CubeColor.White, 3));
            CheckSide(cube, CubeSide.Left, Tuple(CubeColor.Orange, 7), Tuple(CubeColor.Blue, 1), Tuple(CubeColor.Green, 1));
        }
Example #3
0
        public void TestAlgorithm()
        {
            var cube = new RubiksCube();

            cube.ExecAlgorithm("(R R')(D' D)(U U')(F' F)(B B')(L L')");

            CheckSide(cube, CubeSide.Up, CubeColor.White, 9);
            CheckSide(cube, CubeSide.Front, CubeColor.Green, 9);
            CheckSide(cube, CubeSide.Down, CubeColor.Yellow, 9);
            CheckSide(cube, CubeSide.Back, CubeColor.Blue, 9);
            CheckSide(cube, CubeSide.Right, CubeColor.Red, 9);
            CheckSide(cube, CubeSide.Left, CubeColor.Orange, 9);
        }
Example #4
0
        public void TestRotationMiddleDouble()
        {
            var cube = new RubiksCube();

            cube.Rotate(CubeSlice.Middle, MoveDirection.Double);

            CheckSide(cube, CubeSide.Up, Tuple(CubeColor.White, 6), Tuple(CubeColor.Yellow, 3));
            CheckSide(cube, CubeSide.Front, Tuple(CubeColor.Green, 6), Tuple(CubeColor.Blue, 3));
            CheckSide(cube, CubeSide.Down, Tuple(CubeColor.Yellow, 6), Tuple(CubeColor.White, 3));
            CheckSide(cube, CubeSide.Back, Tuple(CubeColor.Blue, 6), Tuple(CubeColor.Green, 3));
            CheckSide(cube, CubeSide.Right, Tuple(CubeColor.Red, 9));
            CheckSide(cube, CubeSide.Left, Tuple(CubeColor.Orange, 9));
        }
Example #5
0
        public void TestRotationEquatorInverted()
        {
            var cube = new RubiksCube();

            cube.Rotate(CubeSlice.Equator, MoveDirection.Inverted);

            CheckSide(cube, CubeSide.Up, Tuple(CubeColor.White, 9));
            CheckSide(cube, CubeSide.Front, Tuple(CubeColor.Green, 6), Tuple(CubeColor.Red, 3));
            CheckSide(cube, CubeSide.Down, Tuple(CubeColor.Yellow, 9));
            CheckSide(cube, CubeSide.Back, Tuple(CubeColor.Blue, 6), Tuple(CubeColor.Orange, 3));
            CheckSide(cube, CubeSide.Right, Tuple(CubeColor.Red, 6), Tuple(CubeColor.Blue, 3));
            CheckSide(cube, CubeSide.Left, Tuple(CubeColor.Orange, 6), Tuple(CubeColor.Green, 3));
        }
Example #6
0
        public cOGL(Control pb)
        {
            p      = pb;
            Width  = p.Width;
            Height = p.Height;
            InitializeGL();

            display_mod = 1;

            rubiksCube         = new RubiksCube();
            backMirrorSurface  = new Mirror(mirrorHeight, mirrorWidth, -mirrorWidth / 2, 0, -mirrorHeight / 2, 0, 0, 0, texture[0]);
            rightMirrorSurface = new Mirror(mirrorHeight, mirrorWidth * 1.5, mirrorWidth / 2, 0, -mirrorHeight / 2, 0, -90, 0, texture[0]);
            leftMirrorSurface  = new Mirror(mirrorHeight, mirrorWidth * 1.5, -mirrorWidth / 2, 0, -mirrorHeight / 2, 0, -90, 0, texture[0]);
        }
        public static Color GetColor(this RubiksCube cube, TwoDPosition pos)
        {
            if (cube.CubeSize != 3)
            {
                throw new NotSupportedException("Currently we only draw 3x3x3 cubes two dimensionally :(");
            }

            Position        threeDPosition = default(Position);
            RubiksDirection direction      = default(RubiksDirection);

            if (_positionFaceMappings.ContainsKey(pos) && _positionMappings.ContainsKey(pos))
            {
                threeDPosition = _positionMappings[pos];
                direction      = _positionFaceMappings[pos];
            }


            RubiksColor?positionColor = cube[threeDPosition].GetColor(direction);

            if (positionColor == null)
            {
                //oops
                return(Colors.Gray);
            }

            switch (positionColor.Value)
            {
            case RubiksColor.Blue:
                return(Colors.Blue);

            case RubiksColor.Green:
                return(Colors.Green);

            case RubiksColor.Orange:
                return(Colors.Orange);

            case RubiksColor.Red:
                return(Colors.Red);

            case RubiksColor.White:
                return(Colors.White);

            case RubiksColor.Yellow:
                return(Colors.Yellow);

            default:
                return(Colors.Gray);
            }
        }
Example #8
0
    public void InitializeAll()
    {
        if (cubePrefabMatrix != null)
        {
            cubePrefabMatrix.Clear();
            foreach (Transform child in this.GetComponentInChildren <Transform>())
            {
                Destroy(child.gameObject);
            }
        }

        RC = new RubiksCube();
        InitializePrefabs();
        RefreshPanels();
    }
Example #9
0
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        RubiksCube selected = (RubiksCube)target;

        rubiksRotation = (Rotation)EditorGUILayout.EnumPopup("Rotation", rubiksRotation);

        if (!selected.turning)
        {
            if (GUILayout.Button("Turn Face"))
            {
                selected.Turn(rubiksRotation);
            }
        }
    }
Example #10
0
        protected override void OnEnter()
        {
            remainingRandomMoveCount = Random.Range(RandomMoveCountMin, RandomMoveCountMax);

            commandFinishedSubscriptionToken = MessengerHub.Subscribe <CommandCompleteMessage>(OnCommandFinished);

            MessengerHub.Publish(new EnableCameraControlMessage(this));


            RubiksCube.AnimateIn(() =>
            {
                lightLevelController.TurnOff(delay: 1f);

                RotateRandomSlice();
            });
        }
Example #11
0
    public override void OnInspectorGUI()
    {
        cube = (RubiksCube)target;

        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
        DrawDefaultInspector();

        if (GUILayout.Button("Generate"))
        {
            cube.GenerateCube();
        }
        if (GUILayout.Button("Shuffle"))
        {
            cube.Shuffle();
        }
        if (GUILayout.Button("Undo Last"))
        {
            cube.UndoLastMove();
        }
        if (GUILayout.Button("Undo All"))
        {
            cube.UndoAllMoves();
        }
        if (GUILayout.Button("Reset"))
        {
            cube.ResetCube();
        }

        EditorGUILayout.Space();
        EditorGUILayout.LabelField("Rotate", EditorStyles.boldLabel);
        if (cube.GeneratedCubeSize <= 0)
        {
            EditorGUILayout.HelpBox("Cube is not generated yet!", MessageType.Warning);
            if (cube.transform.childCount > 0)
            {
                cube.ClearCube();
            }
        }
        else
        {
            IndexSelectButtons();
            SideButtons("X Axis", new RubiksCube.Move(new Vector3Int(1, 0, 0), selectedIndex));
            SideButtons("Y Axis", new RubiksCube.Move(new Vector3Int(0, 1, 0), selectedIndex));
            SideButtons("Z Axis", new RubiksCube.Move(new Vector3Int(0, 0, 1), selectedIndex));
        }
    }
Example #12
0
        public void Run_WhenNoExceptionThrown_ThenTheErrorStringIsNullAndWasThereAnErrorIsFalse()
        {
            RubiksCube cube = new RubiksCube();
            Mock <ICubeSolvingAlgorithm> algMock = new Mock <ICubeSolvingAlgorithm>();

            algMock.Setup(alg => alg.Solve(cube)).Callback(new Action(() =>
            {
                cube.TurnUp(TurningDirection.NineoClock);
            }));

            CubeRunner runner = new CubeRunner(cube, algMock.Object);

            SolverResult result = runner.Run();

            Assert.IsFalse(result.WasThereAnError);
            Assert.IsNull(result.ErrorMessage);
        }
Example #13
0
        public void Run_WhenAlgorithmTurnsCubeTwice_ThenMovesToCompletionIsTwo()
        {
            RubiksCube cube = new RubiksCube();
            Mock <ICubeSolvingAlgorithm> algMock = new Mock <ICubeSolvingAlgorithm>();

            algMock.Setup(alg => alg.Solve(cube)).Callback(new Action(() =>
            {
                cube.TurnUp(TurningDirection.NineoClock);
                cube.TurnLeft(TurningDirection.NineoClock);
            }));

            CubeRunner runner = new CubeRunner(cube, algMock.Object);

            SolverResult result = runner.Run();

            Assert.AreEqual <int>(2, result.MovesToCompletion);
        }
Example #14
0
        public void Run_WhenAlgorithmRunsForOneSecond_ThenTimeToCompletionIsOneSecondPlusOrMinusPointTwoSeconds()
        {
            RubiksCube cube = new RubiksCube();
            Mock <ICubeSolvingAlgorithm> algMock = new Mock <ICubeSolvingAlgorithm>();

            algMock.Setup(alg => alg.Solve(cube)).Callback(new Action(() =>
            {
                System.Threading.Thread.Sleep(1000);
            }));

            CubeRunner runner = new CubeRunner(cube, algMock.Object);

            SolverResult result = runner.Run();

            Assert.IsTrue(TimeSpan.FromSeconds(1) + TimeSpan.FromSeconds(.2) > result.TimeToCompletion ||
                          TimeSpan.FromSeconds(1) - TimeSpan.FromSeconds(.2) < result.TimeToCompletion, string.Format("Actual time to completion {0}", result.TimeToCompletion));
        }
Example #15
0
        public void TestReset()
        {
            var cube = new RubiksCube();

            cube.Rotate(CubeSlice.Back);
            cube.Rotate(CubeSlice.Right);
            cube.Rotate(CubeSlice.Down);
            cube.Rotate(CubeSlice.Front);
            cube.Rotate(CubeSlice.Left);
            cube.Rotate(CubeSlice.Up);
            cube.Reset();

            CheckSide(cube, CubeSide.Up, Tuple(CubeColor.White, 9));
            CheckSide(cube, CubeSide.Front, Tuple(CubeColor.Green, 9));
            CheckSide(cube, CubeSide.Down, Tuple(CubeColor.Yellow, 9));
            CheckSide(cube, CubeSide.Back, Tuple(CubeColor.Blue, 9));
            CheckSide(cube, CubeSide.Right, Tuple(CubeColor.Red, 9));
            CheckSide(cube, CubeSide.Left, Tuple(CubeColor.Orange, 9));
        }
Example #16
0
        public void Run_WhenAlgorithmFailsToSolveCube_ThenResultShowThatTheCubeWasSolved()
        {
            RubiksCube cube = new RubiksCube();

            cube.TurnLeft();
            cube.TurnUp();
            Mock <ICubeSolvingAlgorithm> algMock = new Mock <ICubeSolvingAlgorithm>();

            algMock.Setup(alg => alg.Solve(cube)).Callback(new Action(() =>
            {
                cube.TurnUp(TurningDirection.NineoClock);
            }));

            CubeRunner runner = new CubeRunner(cube, algMock.Object);

            SolverResult result = runner.Run();

            Assert.IsFalse(result.WasCubeSolved);
        }
Example #17
0
        public string Solve(RubiksCube rubiks, Color[] representedColors)
        {
            RubiksColor[,] rubiksCube = ReadRubiksColors(rubiks, representedColors);

            StringBuilder solution = new StringBuilder();

            solution.Append(SolveCross(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolveFirstLayer(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolveSecondLayer(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolveTopCross(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolveTopEdges(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolvePermutateCorners(rubiksCube));
            Console.WriteLine(solution.ToString());
            solution.Append(SolveOrientCorners(rubiksCube));
            return(solution.ToString());
        }
        public void Save()
        {
            string filePath = Constants.SETTINGS_FILE;

            if (File.Exists(filePath))
            {
                FileStream clearedFile = File.Open(filePath, FileMode.Open);
                clearedFile.SetLength(0);
                clearedFile.Close();
            }

            StreamWriter stream = new StreamWriter(filePath, true);

            Graphics.Save(stream);
            Audio.Save(stream);
            Controls.Save(stream);
            RubiksCube.Save(stream);

            stream.Close();
            stream.Dispose();
        }
        private static void AssertRowTurn(RubiksCube cube, int rowIndex, bool isReverse)
        {
            if (rowIndex < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(rowIndex));
            }

            var cubeFrontFace = cube.FrontFace;

            var nextFace = isReverse
                ? cube.LeftFace
                : cube.RightFace;

            for (var i = 0; i < cube.Size; i++)
            {
                Assert.Equal(
                    cubeFrontFace.Slots[rowIndex, i]
                    .Color
                    , nextFace.CenterColor
                    );
            }
        }
Example #20
0
        public void TestGetPieces()
        {
            var cube   = new RubiksCube();
            var pieces = cube.GetPieces();

            pieces.Count.Should().Be(26);
            for (int x = 0; x <= 2; x++)
            {
                for (int y = 0; y <= 2; y++)
                {
                    for (int z = 0; z <= 2; z++)
                    {
                        if (!(x == 1 && y == 1 && z == 1))
                        {
                            pieces.Count(p => p.Position.Equals(new Position {
                                X = x, Y = y, Z = z
                            })).Should().Be(1);
                        }
                    }
                }
            }
        }
Example #21
0
        private bool IsCubeSolved(RubiksCube cube)
        {
            int        cubeSize   = cube.CubeSize;
            RubiksCube solvedCube = new RubiksCube(cubeSize);

            for (int x = 0; x < cubeSize; x++)
            {
                for (int y = 0; y < cubeSize; y++)
                {
                    for (int z = 0; z < cubeSize; z++)
                    {
                        Cubie actualCubie   = cube[x, y, z];
                        Cubie expectedCubie = solvedCube[x, y, z];
                        if (!actualCubie.Equals(expectedCubie))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
Example #22
0
    private void initCube()
    {
        RC = new RubiksCube();
        int actualCubeNumber = 0;

        cubeBrickPrefabMatrix = new List <List <List <GameObject> > >();
        for (int x = 0; x < 3; x++)
        {
            List <List <GameObject> > PrefabRow = new List <List <GameObject> >();
            for (int y = 0; y < 3; y++)
            {
                List <GameObject> PrefabColumn = new List <GameObject>();
                for (int z = 0; z < 3; z++)
                {
                    //Instantiate(CubeBrickPrefab, new Vector3(x + 0.5f,y + 0.5f,z +0.5f), Quaternion.identity);

                    GameObject cubeBrickPrefab = Instantiate(CubeBrickPrefab, Vector3.zero, Quaternion.identity) as GameObject;

                    cubeBrickPrefab.transform.SetParent(transform.parent);
                    cubeBrickPrefab.transform.position = new Vector3(x, y, z) * spacing;

                    // used for set the main Object, the camera will lookAt
                    if (actualCubeNumber == 14)
                    {
                        CameraTrigger.cameraObject = cubeBrickPrefab;
                    }
                    //Debug.Log(cubeBrickPrefab.GetInstanceID());

                    //setColorForBrickPrefab(cubeBrickPrefab);

                    PrefabColumn.Add(cubeBrickPrefab);
                    actualCubeNumber++;
                }
                PrefabRow.Add(PrefabColumn);
            }
            cubeBrickPrefabMatrix.Add(PrefabRow);
        }
    }
Example #23
0
    //复制相同的方块
    public RubiksCube copyCube()
    {
        RubiksCube rCube = new RubiksCube(new GameControl());

        rCube.gameControl.record = gameControl.record;
        for (int i = 0; i < cubeLength; i++)
        {
            for (int j = 0; j < cubeLength; j++)
            {
                for (int k = 0; k < cubeLength; k++)
                {
                    Unit cube = new Unit();
                    for (int r = 0; r < 6; r++)
                    {
                        Color color = gameControl.cubeMatrix [i] [j] [k].getColor((Unit.faces)r);
                        cube.setColor((Unit.faces)r, color);
                    }
                    rCube.gameControl.cubeMatrix[i][j][k] = cube;
                }
            }
        }
        return(rCube);
    }
Example #24
0
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            //spriteBatch = new SpriteBatch(GraphicsDevice);
            _animator = new Animator(30f); //interval: 30ms
            Factory.GraphicsDevice = graphics.GraphicsDevice;


            _rubikscube = RubiksCube.CreateRubiksCube(new Point3()
            {
                X = 0, Y = 0, Z = 0
            }, 10, _animator);

            /*
             * Matrix[] modelTransforms;
             * _rubikscube.InitModel(XNAUtils.LoadModelWithBoundingSphere(out modelTransforms, "rubik_cube-XNA", Content));
             */
            _rubikscube.OneOpDone = RubiksCube_OneOpDone;
            _rubikscube.Random();


            // TODO: use this.Content to load your game content here
        }
    //解决魔方
    public void Slove()
    {
        Debug.Log("Solve");
        if (numerator != null)
        {
            StopCoroutine(numerator);
        }

        RubiksCube rCube = cPrefab.rubiksCube.copyCube();

        solution = new Solution(rCube);

        string sol = solution.Solutions();

        //GameControl gameControl = new GameControl();
        //RubiksCube solCube = new RubiksCube (gameControl);
        //solCube.RunCustomFormula (sol);
        numerator = cPrefab.processStep(sol);
        StartCoroutine(numerator);
        Debug.Log(sol);
        totalLink           = "";
        reverseScrambleLink = "";
    }
Example #26
0
    // Use this for initialization
    void Start()
    {
        rubiks_cube_ = new RubiksCube();

        cube_prefab_matrix_ = new List <List <List <GameObject> > >();
        for (int i = 0; i < 3; i++)
        {
            List <List <GameObject> > prefab_rows_ = new List <List <GameObject> >();
            for (int j = 0; j < 3; j++)
            {
                List <GameObject> prefab_columns_ = new List <GameObject>();
                for (int k = 0; k < 3; k++)
                {
                    GameObject temp_cube_prefab_ = Instantiate(cube_prefab_, Vector3.zero, Quaternion.identity) as GameObject;
                    temp_cube_prefab_.transform.SetParent(transform);
                    temp_cube_prefab_.transform.position = new Vector3((i - 1), (j - 1), (k - 1)) * 1.05f;
                    prefab_columns_.Add(temp_cube_prefab_);
                }
                prefab_rows_.Add(prefab_columns_);
            }
            cube_prefab_matrix_.Add(prefab_rows_);
        }
    }
Example #27
0
        private void Init()
        {
            Viewport3D viewport = new Viewport3D();

            _viewport = viewport;
            cubePanel.Children.Add(viewport);
            PerspectiveCamera camera = new PerspectiveCamera();

            _camera              = camera;
            viewport.Camera      = camera;
            camera.Position      = new Point3D(30, 30, 30);
            camera.LookDirection = new Vector3D(-1, -1, -1);
            camera.UpDirection   = new Vector3D(0, 1, 0);
            camera.FieldOfView   = 90;



            CubeConfiguration.Factory = new Factory();
            _rubikscube = RubiksCube.CreateRubiksCube(new Point3(), 10);
            ModelVisual3D model = ((CubeModel)_rubikscube.Model).ModelVisual;
            Model3DGroup  group = (Model3DGroup)model.Content;

            viewport.Children.Add(model);
            foreach (IMesh mesh in _rubikscube.Meshes)
            {
                group.Children.Add(((CubieMesh)mesh).Geometry);
            }

            _rubikscube.OneOpDone = RubiksCube_OneOpDone;
            _rubikscube.Random();

            _model = model;



            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }
Example #28
0
        public MainForm()
        {
            InitializeComponent();

            canvas.Projection = MatrixHelper.CreatePerspectiveFieldOfView(
                (float)Math.PI / 4, canvas.Viewport.AspectRatio, 1, 1000);

            canvas.Camera = new Camera(new Vector3(0, 0, 500));

            cube        = new RubiksCube(10);
            cube.World *= MatrixHelper.CreateScale(100);

            rotationCursor = new Sphere(125f * 0.3f / cube.Size, Color.Cyan);

            canvas.GraphicsDevice.Lights.Add(new PointLight(new Vector3(150), 4.5f, Color.White));
            canvas.GraphicsDevice.Lights.Add(new PointLight(new Vector3(-150), 4.5f, Color.White));

            //canvas.GraphicsDevice.LightingEnabled = true;
            canvas.GraphicsDevice.CullMode = CullMode.CullCounterClockwiseFace;

            lastUpdateTime    = DateTime.Now;
            Application.Idle += Application_Idle;
            canvas.Select();
        }
Example #29
0
    // Use this for initialization
    void Start()
    {
        RC = new RubiksCube();

        cubePrefabMatrix = new List <List <List <GameObject> > >();
        for (int x = 0; x < 3; x++)
        {
            List <List <GameObject> > PrefabRow = new List <List <GameObject> >();
            for (int y = 0; y < 3; y++)
            {
                List <GameObject> PrefabColumn = new List <GameObject>();
                for (int z = 0; z < 3; z++)
                {
                    GameObject cubePrefab = Instantiate(CubePrefab, Vector3.zero, Quaternion.identity) as GameObject;
                    cubePrefab.transform.SetParent(transform);
                    cubePrefab.transform.position = new Vector3((x - 1), (y - 1), (z - 1)) * spacing;
                    //cubePrefab.GetComponent<CubePrefab>().refreshPanels(RC.cubeMatrix[x][y][z]);
                    PrefabColumn.Add(cubePrefab);
                }
                PrefabRow.Add(PrefabColumn);
            }
            cubePrefabMatrix.Add(PrefabRow);
        }
    }
Example #30
0
    public RubiksCube cloneCube()
    {
        RubiksCube RC = new RubiksCube();

        RC.turnRecord = turnRecord;
        for (int x = 0; x < 3; x++)
        {
            for (int y = 0; y < 3; y++)
            {
                for (int z = 0; z < 3; z++)
                {
                    Cube tempCube = new Cube();
                    for (int i = 0; i < 6; i++)
                    {
                        Color tempc = cubeMatrix[x][y][z].getColor((Cube.sides)i);
                        tempCube.setSideColor((Cube.sides)i, tempc);
                    }
                    RC.cubeMatrix[x][y][z] = tempCube;
                }
            }
        }

        return(RC);
    }
Example #31
0
 public Solver(RubiksCube RC)
 {
     RCube = RC;
 }
Example #32
0
    void DFS_InitialCheck(int depth, int depthLimit, RubiksCube parent, List<RubiksCube> tree)
    {
        string[] operations = { "R", "L", "U", "D", "F", "B" };//each operation also has an inverse
        for (int i = 0; i < operations.Length; i++)
        {
            RubiksCube tempRC = parent.cloneCube();
            tempRC.RunCustomSequence(operations[i]);
            if (depth == depthLimit)
                tree.Add(tempRC);
            else
                DFS_InitialCheck(depth + 1, depthLimit, tempRC, tree);

            RubiksCube tempRC2 = parent.cloneCube();
            tempRC2.RunCustomSequence(operations[i] + "i");
            if (depth == depthLimit)
                tree.Add(tempRC2);
            else
                DFS_InitialCheck(depth + 1, depthLimit, tempRC2, tree);
        }
    }
Example #33
0
    public string SearchedSolution()
    {
        if (RCube.isSolved())
            return "";//cube is already solved. Quit

        //check for easy solutions

        //check if checkerboard pattern solves it
        RubiksCube tempRC = RCube.cloneCube();
        tempRC.RunSequence(10);
        if (tempRC.isSolved())
            return RCube.sequences[10];

        //check if dot patter solves it
        tempRC = RCube.cloneCube();
        string tempsol = "";
        for (int i = 0; i < 3; i++)
        {
            tempRC.RunSequence(11);
            tempsol += RCube.sequences[11];
            if (tempRC.isSolved())
                return tempsol;
        }

        RCube.clearTurnRecord();

        //reorient the cube so that white is on top
        if (RCube.cubeMatrix[1][2][1].getColor(Cube.sides.TOP) != Cube.WHITECOLOR)
        {
            if (RCube.cubeMatrix[1][2][1].getColor(Cube.sides.TOP) == Cube.YELLOWCOLOR)
            {
                RCube.turnCubeZ(true);
                RCube.turnCubeZ(true);
            }
            else
            {
                while (RCube.cubeMatrix[1][1][0].getColor(Cube.sides.TOP) != Cube.WHITECOLOR)
                { RCube.turnCubeY(true); }//turn the cube until the front is white
                RCube.turnCubeX(false);
            }
        }

        //run initial dfs check to maybe find easy solutions in 4 turns or less
        List<RubiksCube> dfsTree = new List<RubiksCube>();
        for (int i = 0; i < 3; i++)
        {
            DFS_InitialCheck(0, i, RCube.cloneCube(), dfsTree);
            for (int j = 0; j < dfsTree.Count; j++)
            {
                if (dfsTree[j].isSolved())
                    return dfsTree[j].turnRecord;
            }
        }

        //begin running actual solution with intermediate dfs optimization

        dfsTree = new List<RubiksCube>();
        DFS_Stage2(0, null, RCube.cloneCube(), dfsTree);

        int minCost = 9999;
        int minCostIndex = 0;
        for (int i = 0; i < dfsTree.Count; i++)
        {
            int cost = dfsTree[i].TurnRecordTokenCount();
            if (cost < minCost)
            {
                minCost = cost;
                minCostIndex = i;
            }
        }

        RCube = dfsTree[minCostIndex].cloneCube();

        //start stage 3 DFS

        dfsTree = new List<RubiksCube>();
        DFS_Stage3(0, null, RCube.cloneCube(), dfsTree);

        minCost = 9999;
        minCostIndex = 0;
        for (int i = 0; i < dfsTree.Count; i++){
            int cost = dfsTree[i].TurnRecordTokenCount();
            if (cost < minCost)
            {
                minCost = cost;
                minCostIndex = i;
            }
        }

        RCube = dfsTree[minCostIndex].cloneCube();

        //flip cube

        RCube.turnCubeZ(true);
        RCube.turnCubeZ(true);

        //start stage 4 DFS

        dfsTree = new List<RubiksCube>();
        DFS_Stage4(0, null, RCube.cloneCube(), dfsTree);

        minCost = 9999;
        minCostIndex = 0;
        for (int i = 0; i < dfsTree.Count; i++)
        {
            int cost = dfsTree[i].TurnRecordTokenCount();
            if (cost < minCost)
            {
                minCost = cost;
                minCostIndex = i;
            }
        }

        RCube = dfsTree[minCostIndex].cloneCube();

        Stage5();
        Stage6();
        RCube.turnCubeZ(true);
        RCube.turnCubeZ(true);

        return RCube.turnRecord;
    }
Example #34
0
    // Use this for initialization
    void Start()
    {
        RC = new RubiksCube();

        cubePrefabMatrix = new List<List<List<GameObject>>>();
        for (int x = 0; x < 3; x++)
        {
            List<List<GameObject>> PrefabRow = new List<List<GameObject>>();
            for (int y = 0; y < 3; y++)
            {
                List<GameObject> PrefabColumn = new List<GameObject>();
                for (int z = 0; z < 3; z++)
                {
                    GameObject cubePrefab = Instantiate(CubePrefab, Vector3.zero, Quaternion.identity) as GameObject;
                    cubePrefab.transform.SetParent(transform);
                    cubePrefab.transform.position = new Vector3((x - 1), (y - 1), (z - 1)) * spacing;
                    //cubePrefab.GetComponent<CubePrefab>().refreshPanels(RC.cubeMatrix[x][y][z]);
                    PrefabColumn.Add(cubePrefab);
                }
                PrefabRow.Add(PrefabColumn);
            }
            cubePrefabMatrix.Add(PrefabRow);
        }
    }
Example #35
0
    void DFS_Stage4(int depth, List<Color> RemainingColors, RubiksCube parent, List<RubiksCube> tree)
    {
        //Debug.Log("Depth: " + depth);
        if (depth == 0)//first iteration
        {
            RemainingColors = new List<Color>();
            RemainingColors.Add(Cube.REDCOLOR);
            RemainingColors.Add(Cube.GREENCOLOR);
            RemainingColors.Add(Cube.ORANGECOLOR);
            RemainingColors.Add(Cube.BLUECOLOR);
        }

        for (int i = 0; i < RemainingColors.Count; i++)
        {
            RubiksCube tempRC = parent.cloneCube();
            tempRC.turnCubeToFaceRGBOColorWithYellowOrWhiteOnTop(RemainingColors[i]);
            SolveMiddleRowSideCubes(tempRC);
            List<Color> newRemainingColors = new List<Color>();
            for (int j = 0; j < RemainingColors.Count; j++) { newRemainingColors.Add(RemainingColors[j]); }
            newRemainingColors.RemoveAt(i);

            if (newRemainingColors.Count == 0)
            {
                tree.Add(tempRC);
                return;
            }
            else
                DFS_Stage4(depth + 1, newRemainingColors, tempRC, tree);

        }
        return;
    }
Example #36
0
    void SolveMiddleRowSideCubes(RubiksCube RC)
    {
        Color TargetColorA = RC.cubeMatrix[1][1][0].getColor(Cube.sides.FRONT);//front center
        Color TargetColorB = RC.cubeMatrix[2][1][1].getColor(Cube.sides.RIGHT);//right center
                                                                                  //Debug.Log("TargetColors: " + TargetColorA + TargetColorB);
        Vector3 Pos = RC.sideCubeWithColors(TargetColorA, TargetColorB);
        //Debug.Log("Pos: " + Pos);
        Vector3 TargetPos = new Vector3(2, 1, 0);
        //Debug.Log("TargetPos: " + TargetPos);

        if (Pos != TargetPos || RC.cubeMatrix[(int)TargetPos.x][(int)TargetPos.y][(int)TargetPos.z].getColor(Cube.sides.FRONT) != TargetColorA)
        {//cube is not in the right place or is oriented wrong
            if (Pos.y != 2)//not in the top
            {
                if (Pos.z == 0)//front
                {
                    if (Pos.x == 0)//front left middle row
                        RC.RunSequence(3);//force the cube out of 0,1,0
                    else if (Pos.x == 2)//front right middle row
                        RC.RunSequence(2);//force the cube out of 2,1,0
                }
                else
                {
                    RC.turnCubeY(true);
                    RC.turnCubeY(true);

                    if (Pos.x == 0)//front left middle row
                        RC.RunSequence(2);//force the cube out of 0,1,0
                    else if (Pos.x == 2)//front right middle row
                        RC.RunSequence(3);//force the cube out of 2,1,0

                    RC.turnCubeY(true);
                    RC.turnCubeY(true);
                }
            }

            //cube is now guaranteed to be in top row
            Pos = RC.sideCubeWithColors(TargetColorA, TargetColorB);
            while (Pos != new Vector3(1, 2, 0))
            {
                RC.rotateTopFace(true);
                Pos = RC.sideCubeWithColors(TargetColorA, TargetColorB);
            }

            //cube is now in 1,2,0

            if (RC.cubeMatrix[(int)Pos.x][(int)Pos.y][(int)Pos.z].getColor(Cube.sides.FRONT) != TargetColorA)
            {
                RC.rotateTopFace(false);
                RC.turnCubeY(false);
                RC.RunSequence(3);
                RC.turnCubeY(true);
            }
            else
            {
                RC.RunSequence(2);
            }
        }

        //cube is now in the target pos and is oriented correctly
    }
Example #37
0
    void SolveWhiteCornerCube(RubiksCube RC)
    {
        Color TargetColorA = RC.cubeMatrix[1][1][0].getColor(Cube.sides.FRONT);//front center
        Color TargetColorB = RC.cubeMatrix[2][1][1].getColor(Cube.sides.RIGHT);//right center
                                                                                  //Debug.Log("TargetColors: " + TargetColorA + TargetColorB);
        Vector3 Pos = RC.cornerCubeWithColors(TargetColorA, TargetColorB, Cube.WHITECOLOR);
        //Debug.Log("Pos: " + Pos);
        Vector3 TargetPos = new Vector3(2, 2, 0);
        //Debug.Log("TargetPos: " + TargetPos);

        if (TargetPos != Pos)//not in the right spot
        {
            if (Pos.y == 2)//in the top but in the wrong spot
            {
                if (Pos.z == 0)//top front left pos
                {
                    RC.rotateLeftFace(true);
                    RC.rotateBottomFace(true);
                    RC.rotateLeftFace(false);
                }
                if (Pos.z == 2)//top back left or top back right
                {
                    if (Pos.x == 0)
                    {
                        RC.rotateLeftFace(false);
                        RC.rotateBottomFace(true);
                        RC.rotateLeftFace(true);
                    }
                    if (Pos.x == 2)
                    {
                        RC.rotateRightFace(true);
                        RC.rotateBottomFace(true);
                        RC.rotateRightFace(false);
                    }
                }
            }
            //cube is now on the bottom
            Pos = RC.cornerCubeWithColors(TargetColorA, TargetColorB, Cube.WHITECOLOR);
            while (Pos != new Vector3(2, 0, 0))
            {
                RC.rotateBottomFace(true);
                Pos = RC.cornerCubeWithColors(TargetColorA, TargetColorB, Cube.WHITECOLOR);
            }
            //cube should now be directly below it's target position or already in target position
        }

        while (true)
        {
            Pos = RC.cornerCubeWithColors(TargetColorA, TargetColorB, Cube.WHITECOLOR);
            Cube tempCube = RC.cubeMatrix[(int)Pos.x][(int)Pos.y][(int)Pos.z];
            if (Pos == TargetPos && tempCube.getColor(Cube.sides.FRONT) == TargetColorA && tempCube.getColor(Cube.sides.TOP) == Cube.WHITECOLOR)
                break;

            RC.RunSequence(1);
        }
    }
Example #38
0
    void SolveWhiteSideCube(RubiksCube RC)
    {
        Color TargetColor = RC.cubeMatrix[1][1][0].getColor(Cube.sides.FRONT);
        //Debug.Log("TargetColor: " + TargetColor);
        Vector3 Pos = RC.sideCubeWithColors(TargetColor, Cube.WHITECOLOR);
        //Debug.Log("Pos: " + Pos);
        Vector3 TargetPos = new Vector3(1, 2, 0);
        //Debug.Log("TargetPos: " + TargetPos);
        if (TargetPos != Pos)//if the cube is not where it should be
        {
            if (Pos.y == 2)//is on top row
            {
                if (Pos.x == 0)
                {
                    RC.rotateLeftFace(true);
                }
                else if (Pos.x == 2)
                {
                    RC.rotateRightFace(false);
                }
                else if (Pos.x == 1)
                {
                    RC.rotateBackFace(true);
                    RC.rotateBackFace(true);
                }

            }
            else if (Pos.y == 1 && Pos.z == 2)//middle row on the back
            {
                if (Pos.x == 0)
                {
                    RC.rotateBackFace(true);
                    RC.rotateBottomFace(true);
                    RC.rotateBackFace(false);
                }
                if (Pos.x == 2)
                {
                    RC.rotateBackFace(false);
                    RC.rotateBottomFace(true);
                    RC.rotateBackFace(true);
                }
            }

            //cube is now on bottom or front
            //requery pos
            Pos = RC.sideCubeWithColors(TargetColor, Cube.WHITECOLOR);
            if (Pos.y == 0)//is on bottom
            {
                while (Pos.z != 0)//while cube is not on the bottom
                {
                    RC.rotateBottomFace(true);
                    Pos = RC.sideCubeWithColors(TargetColor, Cube.WHITECOLOR);
                }
            }
            while (Pos.y != 2)
            {
                RC.rotateFrontFace(true);
                Pos = RC.sideCubeWithColors(TargetColor, Cube.WHITECOLOR);
            }
        }
        //cube is now where it should be
        Cube temp = RC.cubeMatrix[(int)TargetPos.x][(int)TargetPos.y][(int)TargetPos.z];

        if (temp.getColor(Cube.sides.TOP) != Cube.WHITECOLOR)
        {
            RC.turnCubeY(true);
            RC.RunSequence(0);
            RC.turnCubeY(false);
        }
    }
Example #39
0
    public RubiksCube cloneCube()
    {
        RubiksCube RC = new RubiksCube();
        RC.turnRecord = turnRecord;
        for (int x = 0; x < 3; x++)
        {
            for (int y = 0;y < 3; y++)
            {
                for (int z = 0; z < 3; z++)
                {
                    Cube tempCube = new Cube();
                    for (int i = 0; i < 6; i++)
                    {
                        Color tempc = cubeMatrix[x][y][z].getColor((Cube.sides)i);
                        tempCube.setSideColor((Cube.sides)i, tempc);
                    }
                    RC.cubeMatrix[x][y][z] = tempCube;
                }
            }
        }

        return RC;
    }