Exemple #1
0
        /// <summary>
        /// Solve the cube one step at a time
        /// </summary>
        private void SolveCube()
        {
            try
            {
                // solution step
                SolutionStep SolveStep = RubiksCube3D.FullCube.NextSolutionStep();

                // done
                if (SolveStep.StepCode == StepCode.CubeIsSolved)
                {
                    ResetInfoLabels(false);
                    SolveLabel1.Content = Cube.StepCodeName[(int)SolveStep.StepCode];
                }

                // perform solution steps
                else
                {
                    ResetInfoLabels(true);
                    SolveLabel1.Content    = Cube.StepCodeName[(int)SolveStep.StepCode];
                    SolveLabel2.Content    = Cube.GetBlockName(SolveStep.FaceNo);
                    SolveLabel3.Content    = SolveStep.Message;
                    SolveLabel5.Content    = Cube.FaceColorName[SolveStep.UpFaceColor];
                    SolveLabel5.Background = Cube3D.FaceColor[SolveStep.UpFaceColor];
                    SolveLabel7.Content    = Cube.FaceColorName[SolveStep.FrontFaceColor];
                    SolveLabel7.Background = Cube3D.FaceColor[SolveStep.FrontFaceColor];
                    SolveLabel8.Content    = Cube.RelativeCodesToText(SolveStep.UpFaceColor, SolveStep.FrontFaceColor, SolveStep.Steps);
                    SolveLabel10.Content   = Cube.ColorCodesToText(SolveStep.Steps);

                    // add steps to next moves list
                    NextMoves.AddRange(SolveStep.Steps);

                    // set cube orientation
                    SetUpAndFrontFace(true, SolveStep.FrontFaceColor, SolveStep.UpFaceColor);

                    // initiate first step
                    int NextMove = NextMoves[0];
                    NextMoves.RemoveAt(0);
                    RotateSide(NextMove);
                }
            }

            // exception
            catch (Exception Ex)
            {
                SolveLabel1.Content = "Solution step exception";
                SolveLabel2.Content = Ex.Message;
            }

                #if DEBUG
            Trace.Write(SolveLabel1.Content + ". " + SolveLabel2.Content + ". " + SolveLabel3.Content + ". " + SolveLabel5.Content +
                        ". " + SolveLabel7.Content + ". " + SolveLabel8.Content + ". " + SolveLabel10.Content);
                #endif
            return;
        }
Exemple #2
0
        /// <summary>
        /// Save solution
        /// </summary>
        /// <param name="sender">Sender</param>
        /// <param name="e">Event arguments</param>
        private void SaveSolutionButtonClick(object sender, RoutedEventArgs e)
        {
            // ignore if rotation lock is on or user is painting the cube
            if (RotationLock || UserCubeActive)
            {
                return;
            }

            // clone cube
            Cube TempCube = new Cube(RubiksCube3D.FullCube);

            // solution steps file
            StreamWriter SolutionStepsFile = null;

            // solve the cube and save the results
            try
            {
                // open existing or create new trace file
                string FileName = Path.GetFullPath("SolutionSteps.txt");
                SolutionStepsFile = new StreamWriter(FileName);

                // write date and time
                SolutionStepsFile.WriteLine(string.Format("{0:yyyy}/{0:MM}/{0:dd} {0:HH}:{0:mm}:{0:ss} ", DateTime.Now));

                // write header
                SolutionStepsFile.WriteLine("Rubik's Cube definition");
                SolutionStepsFile.WriteLine("Front  Up");

                int Ptr = 0;
                for (int Face = 0; Face < Cube.FaceColors; Face++)
                {
                    StringBuilder Str = new StringBuilder();
                    Str.AppendFormat("{0,-15}[{1,-6}", Cube.SaveSolutionHeader[Face], Cube.FaceColorName[TempCube.FaceColor(Ptr++)]);
                    for (int Index = 0; Index < 7; Index++)
                    {
                        Str.AppendFormat(" {0,-6}", Cube.FaceColorName[TempCube.FaceColor(Ptr++)]);
                    }
                    Str.Append("]");
                    SolutionStepsFile.WriteLine(Str.ToString());
                }

                // write header
                SolutionStepsFile.WriteLine("Rubik's Cube solution steps");

                // count steps
                int TotalSteps = 0;

                // loop for solution steps
                for (;;)
                {
                    // get next step
                    SolutionStep SolveStep = TempCube.NextSolutionStep();

                    // cube is solved
                    if (SolveStep.StepCode == StepCode.CubeIsSolved)
                    {
                        SolutionStepsFile.WriteLine(Cube.StepCodeName[(int)SolveStep.StepCode]);
                        SolutionStepsFile.WriteLine("Total number of steps: " + TotalSteps.ToString());
                        break;
                    }

                    SolutionStepsFile.WriteLine(Cube.StepCodeName[(int)SolveStep.StepCode] + ". " +
                                                Cube.GetBlockName(SolveStep.FaceNo) + ". " + SolveStep.Message + ". " +
                                                Cube.FaceColorName[SolveStep.UpFaceColor] + ", " + Cube.FaceColorName[SolveStep.FrontFaceColor] + ", " +
                                                Cube.RelativeCodesToText(SolveStep.UpFaceColor, SolveStep.FrontFaceColor, SolveStep.Steps) + ", Color: " +
                                                Cube.ColorCodesToText(SolveStep.Steps));

                    // perform the steps
                    TempCube.RotateArray(SolveStep.Steps);
                    TotalSteps += SolveStep.Steps.Length;
                }

                // close the file
                SolutionStepsFile.Close();
                SolutionStepsFile = null;

                // start text editor
                Process.Start(FileName);
            }

            catch (Exception Ex)
            {
                if (SolutionStepsFile != null)
                {
                    SolutionStepsFile.Close();
                }
                MessageBox.Show(Ex.Message);
            }
            return;
        }