Esempio n. 1
0
        /*
         *  Written by Nathan: Method to solve step two of the algorithm, solving the white top corners.
         */
        public void SolveWhiteCorners()
        {
            //blocks that represent the corners in their proper positions
            Corner front_left_corner_in_prop_pos  = new Corner(Color.White, Color.Hidden, Color.Green, Color.Hidden, Color.Orange, Color.Hidden);
            Corner front_right_corner_in_prop_pos = new Corner(Color.White, Color.Hidden, Color.Green, Color.Hidden, Color.Hidden, Color.Red);
            Corner back_right_corner_in_prop_pos  = new Corner(Color.White, Color.Hidden, Color.Hidden, Color.Blue, Color.Hidden, Color.Red);
            Corner back_left_corner_in_prop_pos   = new Corner(Color.White, Color.Hidden, Color.Hidden, Color.Blue, Color.Orange, Color.Hidden);

            //get the corner block that has a green, white and orange side
            Corner front_left_corner  = (Corner)cube.GetBlock(Color.Orange, false, cube.GetBlock(Color.Green, false, cube.GetBlock(Color.White, false)))[0];
            Corner front_right_corner = (Corner)cube.GetBlock(Color.Red, false, cube.GetBlock(Color.Green, false, cube.GetBlock(Color.White, false)))[0];
            Corner back_right_corner  = (Corner)cube.GetBlock(Color.Red, false, cube.GetBlock(Color.Blue, false, cube.GetBlock(Color.White, false)))[0];
            Corner back_left_corner   = (Corner)cube.GetBlock(Color.Orange, false, cube.GetBlock(Color.Blue, false, cube.GetBlock(Color.White, false)))[0];

            int     max_sequence_applications = 5;
            int     max_rotations             = 4;
            Boolean corner_in_bottom_layer    = true;

            while (!WhiteCornersSolved())
            {
                //if the front left corner peice isn't in the proper position
                if (!front_left_corner_in_prop_pos.Equals(front_left_corner))
                {
                    //if the front left corner piece is in the correct position, but oriented incorrecly
                    //then perform this step's rotation algorithm
                    if (front_left_corner.Equals(cube.GetBlock(0, 2, 0)))
                    {
                        CornersRotation(Color.Orange);
                    }

                    corner_in_bottom_layer = true;
                    //while the front left corner isn't directly underneith where it's supposed to be
                    //then cube.Rotate it until it is, will stop if doesn't find after 4 rotations
                    while (!front_left_corner.Equals(cube.GetBlock(0, 0, 0)) && (max_rotations-- > 0))
                    {
                        cube.Rotate(Color.Yellow, Direction.Clockwise);
                        //if you have cube.Rotated the yellow face four times, and the corner still isn't where
                        //it's supposed to be
                        if (max_rotations == 0)
                        {
                            corner_in_bottom_layer = false;
                        }
                    }

                    //reset max_rotations
                    max_rotations = 4;

                    //if corner not in the correct position, figure out where it is, and put it in the bottom layer.
                    if (!corner_in_bottom_layer)
                    {
                        if (front_left_corner.Equals(cube.GetBlock(2, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Green);
                        }
                        else if (front_left_corner.Equals(cube.GetBlock(2, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Red);
                        }
                        else if (front_left_corner.Equals(cube.GetBlock(0, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Blue);
                        }
                        continue;
                    }
                    else
                    {
                        //while the corner piece isn't in the correct position, and while the max number of times
                        //the rotation algorithm (5 times) isn't exceeded: perfrom this step's rotation algorithm
                        while (!front_left_corner_in_prop_pos.Equals(front_left_corner) && (max_sequence_applications-- > 0))
                        {
                            CornersRotation(Color.Orange);
                            max_sequence_applications = 5;
                        }
                    }
                }
                if (!front_right_corner_in_prop_pos.Equals(front_right_corner))
                {
                    if (front_right_corner.Equals(cube.GetBlock(2, 2, 0)))
                    {
                        CornersRotation(Color.Green);
                    }

                    corner_in_bottom_layer = true;
                    while (!front_right_corner.Equals(cube.GetBlock(2, 0, 0)) && (max_rotations-- > 0))
                    {
                        cube.Rotate(Color.Yellow, Direction.Clockwise);
                        if (max_rotations == 0)
                        {
                            corner_in_bottom_layer = false;
                        }
                    }
                    max_rotations = 4;

                    if (!corner_in_bottom_layer)
                    {
                        if (front_right_corner.Equals(cube.GetBlock(0, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Orange);
                        }
                        else if (front_right_corner.Equals(cube.GetBlock(2, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Red);
                        }
                        else if (front_right_corner.Equals(cube.GetBlock(0, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Blue);
                        }
                        continue;
                    }
                    else
                    {
                        while (!front_right_corner_in_prop_pos.Equals(front_right_corner) && (max_sequence_applications-- > 0))
                        {
                            CornersRotation(Color.Green);
                            max_sequence_applications = 5;
                        }
                    }
                }
                if (!back_right_corner_in_prop_pos.Equals(back_right_corner))
                {
                    if (back_right_corner.Equals(cube.GetBlock(2, 2, 2)))
                    {
                        CornersRotation(Color.Red);
                    }

                    corner_in_bottom_layer = true;
                    while (!back_right_corner.Equals(cube.GetBlock(2, 0, 2)) && (max_rotations-- > 0))
                    {
                        cube.Rotate(Color.Yellow, Direction.Clockwise);
                        if (max_rotations == 0)
                        {
                            corner_in_bottom_layer = false;
                        }
                    }
                    max_rotations = 4;

                    if (!corner_in_bottom_layer)
                    {
                        if (back_right_corner.Equals(cube.GetBlock(2, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Green);
                        }
                        else if (back_right_corner.Equals(cube.GetBlock(0, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Orange);
                        }
                        else if (back_right_corner.Equals(cube.GetBlock(0, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Blue);
                        }
                        continue;
                    }
                    else
                    {
                        while (!back_right_corner_in_prop_pos.Equals(back_right_corner) && (max_sequence_applications-- > 0))
                        {
                            CornersRotation(Color.Red);
                            max_sequence_applications = 5;
                        }
                    }
                }
                if (!back_left_corner_in_prop_pos.Equals(back_left_corner))
                {
                    if (back_left_corner.Equals(cube.GetBlock(0, 2, 2)))
                    {
                        CornersRotation(Color.Blue);
                    }

                    corner_in_bottom_layer = true;
                    while (!back_left_corner.Equals(cube.GetBlock(0, 0, 2)) && (max_rotations-- > 0))
                    {
                        cube.Rotate(Color.Yellow, Direction.Clockwise);
                        if (max_rotations == 0)
                        {
                            corner_in_bottom_layer = false;
                        }
                    }
                    max_rotations = 4;

                    if (!corner_in_bottom_layer)
                    {
                        if (back_left_corner.Equals(cube.GetBlock(2, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Green);
                        }
                        else if (back_left_corner.Equals(cube.GetBlock(2, 2, 2)))
                        {
                            PutCornerInBottomLayer(Color.Red);
                        }
                        else if (back_left_corner.Equals(cube.GetBlock(0, 2, 0)))
                        {
                            PutCornerInBottomLayer(Color.Orange);
                        }
                        continue;
                    }
                    else
                    {
                        while (!back_left_corner_in_prop_pos.Equals(back_left_corner) && (max_sequence_applications-- > 0))
                        {
                            CornersRotation(Color.Blue);
                            max_sequence_applications = 5;
                        }
                    }
                }
            }
        }