public static void ApplAlg(VirtualCube cube, string alg, bool reverse = false) { var moves = Regex.Matches(alg, @"([uUrRfFdDlLbByxzMES][w]?(['23]?)+)").Cast <Match>().Select(m => m.Value).ToArray(); var moveTuples = ((MoveType[])Enum.GetValues(typeof(MoveType))).Select(i => new Tuple <string, MoveType>(i.ToString(), i)).ToArray(); if (reverse) { moves = moves.Reverse().ToArray(); } foreach (String move in moves) { var moveEnum = moveTuples.Where(i => i.Item1 == Regex.Match(move, @"[uUrRfFdDlLbByxzMES][w]?").Value) .Select(i => i.Item2); if (moveEnum.Count() != 0) { if (move.Contains("2")) { Move(cube, moveEnum.First(), 2); } else if (((move.Contains('\'') || move.Contains('3')) && !reverse) ^ (reverse && !(move.Contains('\'') || move.Contains('3')))) { Move(cube, moveEnum.First(), 3); } else if (((move.Contains('\'') || move.Contains('3')) && reverse) ^ (!reverse && !(move.Contains('\'') || move.Contains('3')))) { Move(cube, moveEnum.First(), 1); } } } }
private static void SingleMove(VirtualCube cube, CubeMove move) { foreach (var cycle in move.CornerCycles) { CycleCorners(cube.Corners, cycle); } foreach (var cycle in move.EdgeCycles) { CycleEdges(cube.Edges, cycle); } foreach (var cycle in move.CenterCycles) { CycleCenters(cube.Centers, cycle); } }
private static void Move(VirtualCube cube, MoveType moveType, int direction) { switch (moveType) { case MoveType.U: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.UMove); } break; case MoveType.R: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.RMove); } break; case MoveType.F: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.FMove); } break; case MoveType.D: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.DMove); } break; case MoveType.L: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.LMove); } break; case MoveType.B: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.BMove); } break; case MoveType.Uw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.UwMove); } break; case MoveType.Rw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.RwMove); } break; case MoveType.Fw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.FwMove); } break; case MoveType.Dw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.DwMove); } break; case MoveType.Lw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.LwMove); } break; case MoveType.Bw: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.BwMove); } break; case MoveType.u: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.uMove); } break; case MoveType.r: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.rMove); } break; case MoveType.f: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.fMove); } break; case MoveType.d: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.dMove); } break; case MoveType.l: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.lMove); } break; case MoveType.b: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.bMove); } break; case MoveType.E: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.EMove); } break; case MoveType.M: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.MMove); } break; case MoveType.S: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.SMove); } break; case MoveType.x: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.xMove); } break; case MoveType.y: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.yMove); } break; case MoveType.z: for (int i = 0; i < direction; i++) { SingleMove(cube, MoveDefs.zMove); } break; } }