// *** METHODS *** /// <summary> /// Returns the solution for the transferred Rubik /// </summary> /// <param name="cube">Defines the Rubik to be solved</param> protected virtual void Solve(Rubik cube) { Rubik = cube.DeepClone(); Algorithm = new Algorithm(); InitStandardCube(); GetSolution(); RemoveUnnecessaryMoves(); }
protected override void Solve(Rubik cube) { Rubik = cube.DeepClone(); _coordCube = ToCoordCube(cube); this.MaxDepth = 30; this.TimeOut = 10000; Algorithm = new Algorithm(); InitStandardCube(); GetSolution(); RemoveUnnecessaryMoves(); }
public static int GetOrientation(Rubik rubik, Cube c) { int orientation = 0; if (c.IsEdge) { CubeFlag targetFlags = rubik.GetTargetFlags(c); Rubik clone = rubik.DeepClone(); if (!targetFlags.HasFlag(CubeFlag.MiddleLayer)) { while (RefreshCube(clone, c).Position.HasFlag(CubeFlag.MiddleLayer)) clone.RotateLayer(c.Position.X, true); Cube clonedCube = RefreshCube(clone, c); Face yFace = clonedCube.Faces.First(f => f.Color == rubik.TopColor || f.Color == rubik.BottomColor); if (!FacePosition.YPos.HasFlag(yFace.Position)) orientation = 1; } else { Face zFace = c.Faces.First(f => f.Color == rubik.FrontColor || f.Color == rubik.BackColor); if (c.Position.HasFlag(CubeFlag.MiddleLayer)) { if (!FacePosition.ZPos.HasFlag(zFace.Position)) orientation = 1; } else { if (!FacePosition.YPos.HasFlag(zFace.Position)) orientation = 1; } } } else if (c.IsCorner) { Face face = c.Faces.First(f => f.Color == rubik.TopColor || f.Color == rubik.BottomColor); if (!FacePosition.YPos.HasFlag(face.Position)) { if (FacePosition.XPos.HasFlag(face.Position) ^ !((c.Position.HasFlag(CubeFlag.BottomLayer) ^ (c.Position.HasFlag(CubeFlag.FrontSlice) ^ c.Position.HasFlag(CubeFlag.RightSlice))))) { orientation = 1; } else orientation = 2; } } return orientation; }
/// <summary> /// Returns the Orientation /// </summary> /// <param name="rubik"></param> /// <param name="c"></param> /// <returns></returns> public static Orientation GetOrientation(Rubik rubik, Cube c) { var orientation = Orientation.Correct; if (c.IsEdge) { var targetFlags = rubik.GetTargetFlags(c); var clone = rubik.DeepClone(); if (!targetFlags.HasFlag(CubeFlag.MiddleLayer)) { while (RefreshCube(clone, c).Position.HasFlag(CubeFlag.MiddleLayer)) clone.RotateLayer(c.Position.X, true); var clonedCube = RefreshCube(clone, c); var yFace = clonedCube.Faces.First(f => f.Color == rubik.TopColor || f.Color == rubik.BottomColor); if (!YPos.HasFlag(yFace.Position)) orientation = Orientation.Clockwise; } else { var zFace = c.Faces.First(f => f.Color == rubik.FrontColor || f.Color == rubik.BackColor); if (c.Position.HasFlag(CubeFlag.MiddleLayer)) { if (!ZPos.HasFlag(zFace.Position)) orientation = Orientation.Clockwise; } else { if (!YPos.HasFlag(zFace.Position)) orientation = Orientation.Clockwise; } } } else if (c.IsCorner) { var face = c.Faces.First(f => f.Color == rubik.TopColor || f.Color == rubik.BottomColor); if (YPos.HasFlag(face.Position)) { return orientation; } orientation = XPos.HasFlag(face.Position) ^ !(c.Position.HasFlag(CubeFlag.BottomLayer) ^ (c.Position.HasFlag(CubeFlag.FrontSlice) ^ c.Position.HasFlag(CubeFlag.RightSlice))) ? Orientation.CounterClockwise : Orientation.Clockwise; } return orientation; }
public BeginnerSolver(Rubik cube) { Rubik = cube.DeepClone(); this.Algorithm = new Algorithm(); InitStandardCube(); }
public TestScenario(Rubik rubik, Algorithm moves) { Rubik = rubik.DeepClone(); Algorithm = moves; }