public void Turn(int amount) { amount = amount % 4; // Unnecessary turns if (Math.Abs(amount) == 3) { amount /= -3; // 3 turns = 1 turn in opposite direction } stickers.Shift(-2 * amount); var sideStickers = new Sticker[12]; var adjacentFaces = connections.Keys.ToArray(); for (int i = 0; i < adjacentFaces.Length; i++) { for (int j = 0; j < 3; j++) { Face face = adjacentFaces[i]; int index = stickers.LoopedIndex((int)connections[face] + j); sideStickers[i * 3 + j] = face.stickers[index]; } } sideStickers.Shift(3 * amount); for (int i = 0; i < adjacentFaces.Length; i++) { for (int j = 0; j < 3; j++) { Face face = adjacentFaces[i]; int index = stickers.LoopedIndex((int)connections[face] + j); face.stickers[index] = sideStickers[i * 3 + j]; } } }