/// <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; }
/// <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; }