Example #1
0
    // *** 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;
 }