/// <summary> /// Bring einen weißen falsch orientierten Kantenstein auf der mittleren Ebene in die richtige Position relativ zum Pivotstein. /// </summary> /// <param name="edge">Der Kantenstein, der in die richtige Position gebracht werden soll</param> protected void HandleFalseOrientatedStone(EdgeStone edge) { if (Array.TrueForAll(MiddleLayerFaces, f => edge.GetColorPosition(WHITE).Face != f) || edge.GetColorPosition(WHITE).Tile == 3 || edge.GetColorPosition(WHITE).Tile == 5) { throw new ArgumentOutOfRangeException("Der weiße Kantenstein muss sich in der oberen oder unteren Ebene befinden und die weiße Fläche muss auf einer der seitlichen Seiten (Orange, Grün, Rot, Blau) sein", nameof(edge)); } #if DEBUG Log.LogStuff("Handle false orientated stone\r\n\t" + edge.ToString()); #endif // get edge information CubeColor secndColor = GetSecondColor(edge); Position whitePos = edge.GetColorPosition(WHITE); // get face of white pos int middleLayerFaceID = Array.IndexOf(MiddleLayerFaces, whitePos.Face); // face in anti clockwise rotation of white position face CubeFace leftFace = MiddleLayerFaces[(middleLayerFaceID + 3) % 4]; // face in clockwise roation of white position face CubeFace rightFace = MiddleLayerFaces[(middleLayerFaceID + 1) % 4]; int leftDelta = Math.Abs(SolvingUtility.NormalizeCount(SolvingUtility.GetDelta(secndColor, leftFace, UP), -1)); int rightDelta = Math.Abs(SolvingUtility.NormalizeCount(SolvingUtility.GetDelta(secndColor, rightFace, UP), -1)); // on up layer if (whitePos.Tile == 1) { // move edge to middle layer if (leftDelta < rightDelta) { DoMove(whitePos.Face, -1); } else { DoMove(whitePos.Face); } HandleStoneMiddleLayer(edge); } else { // check if the face must rotated back after stone handling int[] tiles = { 3, 7, 5, 1 }; bool rotBack = cube.At(UP, tiles[middleLayerFaceID]) == WHITE; // move edge to middle layer int direction = leftDelta > rightDelta ? 1 : -1; DoMove(whitePos.Face, direction); HandleStoneMiddleLayer(edge); if (rotBack) { DoMove(whitePos.Face, -direction); } } }
/// <summary> /// Bring einen weißen Kantenstein auf der gelben Seite in die richtige Position relativ zum Pivotstein. /// </summary> /// <param name="edge">Der Kantenstein, der in die richtige Position gebracht werden soll</param> protected void HandleStoneYellowFace(EdgeStone edge) { if (edge.GetColorPosition(WHITE).Face != DOWN) { throw new ArgumentException("Die weiße Fläche des Kantensteins muss sich auf der gelben Seite befinden", nameof(edge)); } #if DEBUG Log.LogStuff("Handle stone yellow face\r\n\t" + edge.ToString()); #endif int delta = SolvingUtility.GetDelta(GetSecondColor(edge), edge.GetColorPosition(c => c != WHITE).Face, UP); // rotate the white face to insert the stone right to pivot DoMove(UP, delta - WhiteFaceOrientation); CubeFace faceToRot = edge.GetColorPosition(c => c != WHITE).Face; DoMove(faceToRot, 2); }
/// <summary> /// Bring einen weißen Kantenstein auf der mittleren Ebene in die richtige Position relativ zum Pivotstein. /// </summary> /// <param name="edge">Der Kantenstein, der in die richtige Position gebracht werden soll</param> protected void HandleStoneMiddleLayer(EdgeStone edge) { if (Array.TrueForAll(MiddleLayerFaces, f => edge.GetColorPosition(WHITE).Face != f) || edge.GetColorPosition(WHITE).Tile == 1 || edge.GetColorPosition(WHITE).Tile == 7) { throw new ArgumentException("Der weiße Kantenstein muss sich auf der mittleren Ebene befinden", nameof(edge)); } #if DEBUG Log.LogStuff("Handle stone middle layer\r\n\t" + edge.ToString()); #endif int delta = SolvingUtility.GetDelta(GetSecondColor(edge), edge.GetColorPosition(c => c != WHITE).Face, UP); // rotate the white face to insert the stone right to pivot DoMove(UP, delta - WhiteFaceOrientation); Position secondPos = edge.GetColorPosition(c => c != WHITE); DoMove(secondPos.Face, secondPos.Tile == 3 ? 1 : -1); }
/// <summary> /// Bringt einen weißen Kantenstein auf der weißen Seite in die richtige Position relativ zum Pivotstein. /// </summary> /// <param name="edge">Der Kantenstein, der in die richtige Position gebracht werden soll</param> protected void HandleStoneWhiteFace(EdgeStone edge) { if (edge.GetColorPosition(WHITE).Face != UP) { throw new ArgumentException("Die weiße Fläche des Kantensteins muss sich auf der weißen Seite befinden", nameof(edge)); } #if DEBUG Log.LogStuff("Handle stone white face\r\n\t" + edge.ToString()); #endif CubeFace faceToRot = edge.GetColorPosition(c => c != WHITE).Face; // bring stone to middle Layer DoMove(faceToRot); // handle stone on middle Layer HandleStoneMiddleLayer(edge); }