Imports System.Text Public Class Form1 Dim rubik(5, 8) As String '9 rectangles on 6 faces Dim frubik(5, 8) As String 'reset cube Dim rcolor() As String = {"green", "white", "blue", "yellow", "orange", "red"} Dim xstart As Integer 'draw cube variables Dim ystart As Integer Dim rot As Integer 'number of rotations Dim fa As Integer 'face to be rotated Dim permutation As String Dim rgen As New Random 'generate some random numbers Dim facediff As Integer = 6 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button2_Click(Nothing, Nothing) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Button2_Click(Nothing, Nothing) fa = 0 'reset face Dim falast As Integer = 6 'ensure that dont get same rotations following each other Dim rstep As Integer Dim rdiff As Integer Dim found As Integer Do While found = 0 rstep = 0 Do While rstep < 16 And found = 0 fa = rgen.Next(0, 6) While fa = falast fa = rgen.Next(0, 6) End While falast = fa 'remember last rotation rot = rgen.Next(0, 3) If fa = 0 Then If rot = 0 Then rotleft(2) permutation &= "L" End If If rot = 1 Then rotleft(2) rotleft(2) permutation &= "L2" End If If rot = 2 Then rotleft(2) rotleft(2) rotleft(2) permutation &= "L'" End If End If If fa = 1 Then If rot = 0 Then rotup(2) permutation &= "U" End If If rot = 1 Then rotup(2) rotup(2) permutation &= "U2" End If If rot = 2 Then rotup(2) rotup(2) rotup(2) permutation &= "U'" End If End If If fa = 2 Then If rot = 0 Then rotright(2) permutation &= "R" End If If rot = 1 Then rotright(2) rotright(2) permutation &= "R2" End If If rot = 2 Then rotright(2) rotright(2) rotright(2) permutation &= "R'" End If End If If fa = 3 Then If rot = 0 Then rotdown(2) permutation &= "D" End If If rot = 1 Then rotdown(2) rotdown(2) permutation &= "D2" End If If rot = 2 Then rotdown(2) rotdown(2) rotdown(2) permutation &= "D'" End If End If If fa = 4 Then If rot = 0 Then rotback(2) permutation &= "B" End If If rot = 1 Then rotback(2) rotback(2) permutation &= "B2" End If If rot = 2 Then rotback(2) rotback(2) rotback(2) permutation &= "B'" End If End If If fa = 5 Then If rot = 0 Then rotfront(2) permutation &= "F" End If If rot = 1 Then rotfront(2) rotfront(2) permutation &= "F2" End If If rot = 2 Then rotfront(2) rotfront(2) rotfront(2) permutation &= "F'" End If End If rdiff = 0 For j = 0 To 5 For i = 0 To 8 If rubik(j, i) <> frubik(j, i) Then rdiff = rdiff + 1 Next Next If rdiff <= facediff And rdiff <> 0 Then found = 1 rstep = rstep + 1 Loop If found = 0 Then reset() permutation = "" End If Loop Form1_Paint(Nothing, Nothing) TextBox1.Text = permutation End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim move As String 'the rotation required Dim moveq As String 'the qualification 2 or anticlockwise permutation = TextBox1.Text For i = 0 To permutation.Length - 1 move = permutation.Substring(i, 1) 'get next character If move = "L" Then rotleft(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotleft(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotleft(2) rotleft(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If If move = "U" Then rotup(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotup(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotup(2) rotup(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If If move = "R" Then rotright(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotright(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotright(2) rotright(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If If move = "D" Then rotdown(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotdown(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotdown(2) rotdown(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If If move = "B" Then rotback(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotback(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotback(2) rotback(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If If move = "F" Then rotfront(2) If i + 1 < permutation.Length Then 'there may be a qualifier 2 or ' moveq = permutation.Substring(i + 1, 1) 'get next character If moveq = "2" Then rotfront(2) 'repeat the move double i = i + 1 End If If moveq = "'" Then rotfront(2) rotfront(2) ' do it 3 times or anticlockwise i = i + 1 End If End If End If Next Form1_Paint(Nothing, Nothing) End Sub Private Sub reset() For j = 0 To 5 'set initial position For i = 0 To 8 rubik(j, i) = rcolor(j) Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click For j = 0 To 5 'set initial position For i = 0 To 8 rubik(j, i) = rcolor(j) Next Next For j = 0 To 5 'set initial position For i = 0 To 8 frubik(j, i) = rcolor(j) Next Next Form1_Paint(Nothing, Nothing) End Sub Private Sub rotate(ByVal rot, ByVal fa) Dim save As String For i = 0 To rot - 1 'number of rotations required save = rubik(fa, 0) rubik(fa, 0) = rubik(fa, 3) rubik(fa, 3) = rubik(fa, 6) rubik(fa, 6) = rubik(fa, 7) rubik(fa, 7) = rubik(fa, 8) rubik(fa, 8) = rubik(fa, 5) rubik(fa, 5) = rubik(fa, 2) rubik(fa, 2) = rubik(fa, 1) rubik(fa, 1) = save 'the face is now rotated once Next End Sub Private Sub rotleft(ByVal rot) rotate(rot, 0) Dim save As String For i = 0 To rot save = rubik(1, 0) rubik(1, 0) = rubik(4, 6) rubik(4, 6) = rubik(4, 3) rubik(4, 3) = rubik(4, 0) rubik(4, 0) = rubik(3, 2) rubik(3, 2) = rubik(3, 5) rubik(3, 5) = rubik(3, 8) rubik(3, 8) = rubik(5, 6) rubik(5, 6) = rubik(5, 3) rubik(5, 3) = rubik(5, 0) rubik(5, 0) = rubik(1, 6) rubik(1, 6) = rubik(1, 3) rubik(1, 3) = save 'the ajoining faces are now rotated Next End Sub Private Sub rotup(ByVal rot) rotate(rot, 1) Dim save As String For i = 0 To rot save = rubik(5, 0) rubik(5, 0) = rubik(5, 1) rubik(5, 1) = rubik(5, 2) rubik(5, 2) = rubik(2, 6) rubik(2, 6) = rubik(2, 3) rubik(2, 3) = rubik(2, 0) rubik(2, 0) = rubik(4, 8) rubik(4, 8) = rubik(4, 7) rubik(4, 7) = rubik(4, 6) rubik(4, 6) = rubik(0, 2) rubik(0, 2) = rubik(0, 5) rubik(0, 5) = rubik(0, 8) rubik(0, 8) = save 'the ajoining faces are now rotated Next End Sub Private Sub rotright(ByVal rot) rotate(rot, 2) Dim save As String For i = 0 To rot save = rubik(3, 0) rubik(3, 0) = rubik(4, 2) rubik(4, 2) = rubik(4, 5) rubik(4, 5) = rubik(4, 8) rubik(4, 8) = rubik(1, 2) rubik(1, 2) = rubik(1, 5) rubik(1, 5) = rubik(1, 8) rubik(1, 8) = rubik(5, 2) rubik(5, 2) = rubik(5, 5) rubik(5, 5) = rubik(5, 8) rubik(5, 8) = rubik(3, 6) rubik(3, 6) = rubik(3, 3) rubik(3, 3) = save 'the ajoining faces are now rotated Next End Sub Private Sub rotdown(ByVal rot) rotate(rot, 3) Dim save As String For i = 0 To rot save = rubik(4, 0) rubik(4, 0) = rubik(4, 1) rubik(4, 1) = rubik(4, 2) rubik(4, 2) = rubik(2, 2) rubik(2, 2) = rubik(2, 5) rubik(2, 5) = rubik(2, 8) rubik(2, 8) = rubik(5, 8) rubik(5, 8) = rubik(5, 7) rubik(5, 7) = rubik(5, 6) rubik(5, 6) = rubik(0, 6) rubik(0, 6) = rubik(0, 3) rubik(0, 3) = rubik(0, 0) rubik(0, 0) = save 'the ajoining faces are now rotated Next End Sub Private Sub rotback(ByVal rot) rotate(rot, 4) Dim save As String For i = 0 To rot save = rubik(0, 0) rubik(0, 0) = rubik(0, 1) rubik(0, 1) = rubik(0, 2) rubik(0, 2) = rubik(1, 0) rubik(1, 0) = rubik(1, 1) rubik(1, 1) = rubik(1, 2) rubik(1, 2) = rubik(2, 0) rubik(2, 0) = rubik(2, 1) rubik(2, 1) = rubik(2, 2) rubik(2, 2) = rubik(3, 0) rubik(3, 0) = rubik(3, 1) rubik(3, 1) = rubik(3, 2) rubik(3, 2) = save 'the ajoining faces are now rotated Next End Sub Private Sub rotfront(ByVal rot) rotate(rot, 5) Dim save As String For i = 0 To rot save = rubik(0, 8) rubik(0, 8) = rubik(0, 7) rubik(0, 7) = rubik(0, 6) rubik(0, 6) = rubik(3, 8) rubik(3, 8) = rubik(3, 7) rubik(3, 7) = rubik(3, 6) rubik(3, 6) = rubik(2, 8) rubik(2, 8) = rubik(2, 7) rubik(2, 7) = rubik(2, 6) rubik(2, 6) = rubik(1, 8) rubik(1, 8) = rubik(1, 7) rubik(1, 7) = rubik(1, 6) rubik(1, 6) = save 'the ajoining faces are now rotated Next End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim g As Graphics = CreateGraphics() For i = 0 To 3 'draw the black outline g.DrawLine(Pens.Black, 200, 300 + i * 60, 920, 300 + i * 60) Next For i = 0 To 9 g.DrawLine(Pens.Black, 380, 120 + i * 60, 560, 120 + i * 60) Next For i = 0 To 12 g.DrawLine(Pens.Black, 200 + i * 60, 300, 200 + i * 60, 480) Next For i = 0 To 3 g.DrawLine(Pens.Black, 380 + i * 60, 120, 380 + i * 60, 660) Next xstart = 200 ystart = 300 'start of first rectangle For j = 0 To 3 'the middle 4 faces xstart = xstart + 180 * j 'move along with j For i = 0 To 8 If i = 3 Then 'move down to next batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If If i = 6 Then 'move to last batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If colorRectangle(j, i) Next xstart = 200 'reset ystart = 300 'start of first rectangle Next xstart = 380 ' do back face ystart = 120 For i = 0 To 8 If i = 3 Then 'move down to next batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If If i = 6 Then 'move to last batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If colorRectangle(4, i) Next xstart = 380 ' do front face ystart = 480 For i = 0 To 8 If i = 3 Then 'move down to next batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If If i = 6 Then 'move to last batch of 3 xstart = xstart - 180 ystart = ystart + 60 End If colorRectangle(5, i) Next Dim bigfont As New System.Drawing.Font("arial", 42, FontStyle.Regular) g.DrawString("L", bigfont, Brushes.Black, 260, 360) g.DrawString("U", bigfont, Brushes.Black, 440, 360) g.DrawString("R", bigfont, Brushes.Black, 620, 360) g.DrawString("D", bigfont, Brushes.Black, 800, 360) g.DrawString("B", bigfont, Brushes.Black, 440, 180) g.DrawString("F", bigfont, Brushes.Black, 440, 540) 'show oriention data g.Dispose() End Sub Private Sub colorRectangle(ByVal facen, ByVal postn) 'single rectangle on a face Dim g As Graphics = CreateGraphics() Dim rbrush As New System.Drawing.SolidBrush(Color.FromName(rubik(facen, postn))) g.FillRectangle(rbrush, (xstart + 60 * postn) + 1, ystart + 1, 59, 59) rbrush.Dispose() g.Dispose() End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged facediff = 4 End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged facediff = 6 End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged facediff = 8 End Sub End Class