Rubik's Cube again

Game development specific discussions.
Post Reply
3622
Posts: 24
Joined: Mar 14, 2015 23:53

Rubik's Cube again

Post by 3622 »

Another Rubik's Cube effort.

To rotate "slices" :
Left mouse button and drag in required direction.
Drag for approximately half a cube.
The mouse must remain in the boundaries of the selected "slice"

To rotate whole cube :
Right mouse button and drag in required direction.
Drag for approximately half a cube.
Again, the mouse must remain in the boundaries of the selected "slice" of that face.

Edit to reduce CPU usage now done.

Code: Select all


'		3D Cube by 3622

screen 19, 32, 2
windowtitle "FreeBASIC Rubik's Cube"

randomize

const green = rgb (0, 255, 0)
const blue = rgb (0, 0, 255)
const white = rgb (255, 255, 255)
const yellow = rgb (255, 255, 0)
const red = rgb (255, 0, 0)
const orange = rgb (255, 165, 0)
const trueblack = rgb (0, 0, 0)
const black = rgb (20, 20, 20)

const offx = 399
const offy = 299
const ta = 34
const scale = 1.5
const rad = 0.0174532
const origin = 1500
const screen_distance = 3000

type p2d
    x as single
    y as single
end type    

dim as p2d m_slice(17, 3)

type coord
    x(3) as single
    y(3) as single
    z(3) as single
    colour as ulong
end type

dim as coord sq(53), sq_p(53), master(53), start(53)
dim as single vis(53)
dim as integer cube(53), z_1(20), z_2(11), z_3(20), x_1(20), x_2(11), x_3(20), y_1(20), y_2(11), y_3(20)
dim as string slice(17)

dim as integer i, j, k, l, b, c
dim as integer res, mx, my, mbuttons, fx ,fy
dim as string quit
dim as ulong colour
dim as single x, p, q

'  Front
data -32, -32, 32, -12, -32, 32, -12, -12, 32, -32, - 12, 32
data -10, -32, 32, 10, -32, 32, 10, -12, 32, -10, -12, 32
data 12, -32, 32, 32, -32, 32, 32, -12, 32, 12, -12, 32

data -32, -10, 32, -12, -10, 32, -12, 10, 32, -32, 10, 32
data -10, -10, 32, 10, -10, 32, 10, 10, 32, -10, 10, 32
data 12, -10, 32, 32, -10, 32, 32, 10, 32, 12, 10, 32

data -32, 12, 32, -12, 12, 32, -12, 32, 32, -32, 32, 32
data -10, 12, 32, 10, 12, 32, 10, 32, 32, -10, 32, 32
data 12, 12, 32, 32, 12, 32, 32, 32, 32, 12, 32, 32

' z_1
data 0, 1 ,2, 3, 4, 5, 6, 7, 8
data 11, 14, 17, 45, 46, 47, 33, 30, 27, 44, 43, 42

' z_2
data 10, 13, 16, 48, 49, 50, 34, 31, 28, 41, 40, 39

' z_3
data 18, 19, 20, 21, 22, 23, 24, 25, 26
data 9, 12, 15, 51, 52, 53, 35, 32, 29, 38, 37, 36

' x_1
data 9, 10, 11, 12, 13, 14, 15, 16, 17
data 0, 3, 6, 45, 48, 51, 26, 23, 20, 36, 39, 42

' x_2
data 1, 4, 7, 46, 49, 52, 25, 22, 19, 37, 40, 43

' x_3
data 27, 28, 29, 30, 31, 32, 33, 34, 35
data 2, 5, 8, 47, 50, 53, 24, 21, 18, 38, 41, 44

' y_1
data 36, 37, 38, 39, 40, 41, 42, 43, 44
data 0, 1, 2, 9, 10, 11, 18, 19, 20, 27, 28, 29

' y_2
data 3, 4, 5, 12, 13, 14, 21, 22, 23,30, 31, 32

' y_3
data 45, 46, 47, 48, 49, 50, 51, 52, 53
data 6, 7, 8, 15, 16, 17, 24, 25, 26, 33, 34, 35

' slice
data "x1+", "x2+", "x3+", "y1+", "y2+", "y3+", "z1+", "z2+", "z3+"
data "x1-", "x2-", "x3-", "y1-", "y2-", "y3-", "z1-", "z2-", "z3-"

' mouse slice
data 0, 0, 0, 1, 6, 2, 6, 3
data 1, 0, 1, 1, 7, 2, 7, 3
data 2, 0, 2, 1, 8, 2, 8, 3

data 0, 3, 0, 0, 2, 1, 2, 2
data 3, 3, 3, 0, 5, 1, 5, 2
data 6, 3, 6, 0, 8, 1, 8, 2

for i = 0 to 8
    for j = 0 to 3
        read sq(i).x(j)
        read sq(i).y(j)
        read sq(i).z(j)
    next  
next

x = rad * 90
for k = 1 to 3
    for i = 0 to 8
        for j = 0 to 3        
		    b = sq(i).x(j)
		    c = sq(i).z(j)
		    sq(i + (9 * k)).x(j) = b * cos(x * k) - c * sin(x * k)
		    sq(i + (9 * k)).z(j) = b * sin(x * k) + c * cos(x * k) 
		    sq(i + (9 * k)).y(j) = sq(i).y(j)
        next
    next
next

x = rad * 90
for i = 0 to 8
    for j = 0 to 3
		b = sq(i).y(j)
		c = sq(i).z(j)
		sq(i + (9 * 4)).y(j) = b * cos(x) - c * sin(x)
		sq(i + (9 * 4)).z(j) = b * sin(x) + c * cos(x)
		sq(i + (9 * 4)).x(j) = sq(i).x(j)		
    next
next

x = -rad * 90
for i = 0 to 8
    for j = 0 to 3
		b = sq(i).y(j)
		c = sq(i).z(j)
		sq(i + (9 * 5)).y(j) = b * cos(x) - c * sin(x) 
		sq(i + (9 * 5)).z(j) =  b * sin(x) + c * cos(x)
		sq(i + (9 * 5)).x(j) = sq(i).x(j)		
    next
next

for i = 0 to 53
     select case i
        case 0 to 8
                sq(i).colour = green
        case 9 to 17
                sq(i).colour = white        
        case 18 to 26
                sq(i).colour = blue        
        case 27 to 35
                sq(i).colour = yellow        
        case 36 to 44
                sq(i).colour = red        
        case 45 to 53
                sq(i).colour = orange      
    end select    
    cube(i) = i
next    
  
for i = 0 to 20
    read z_1(i)    
next    

for i = 0 to 11
    read z_2(i)
next    

for i = 0 to 20
    read z_3(i)
next

for i = 0 to 20
    read x_1(i)    
next  

for i = 0 to 11
    read x_2(i)
next    

for i = 0 to 20
    read x_3(i)    
next  

for i = 0 to 20
    read y_1(i)    
next 

for i = 0 to 11
    read y_2(i)
next

for i = 0 to 20
    read y_3(i)    
next 

for i = 0 to 17
    read slice(i)
next    

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub backdrop()

dim as integer i, j

line (20, 320) - step (61, 24), black, bf
draw string (26, 326), "Shuff", trueblack
draw string (63, 326), "le", trueblack
for i = 20 to 81
    for j = 320 to 344
        line ((i - 20) * 2 + 20, (j - 320) * 2 + 20) - step (2, 2),point(i, j), bf
    next    
next

line (20, 320) - step (61, 24), black, bf
draw string (32, 326), "Reset", trueblack
for i = 20 to 81
    for j = 320 to 344
        line ((i - 20) * 2 + 20, (j - 320) * 2 + 90) - step (2, 2),point(i, j), bf
    next    
next
/'
line (20, 320) - step (61, 24), black, bf
draw string (34, 326), "So", trueblack
draw string (48, 326), "l", trueblack
draw string (54, 326), "ve", trueblack
for i = 20 to 81
    for j = 320 to 344
        line ((i - 20) * 2 + 20, (j - 320) * 2 + 160) - step (2, 2),point(i, j), bf
    next    
next
'/
line (20, 320) - step (61, 24), trueblack, bf

screencopy (0, 1)

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub display(sq_p() as coord, vis() as single)

dim as integer i, j

screenlock()
screencopy (1, 0)

for i = 0 to 53
    if vis(i) <= 0.04 then continue for
    for j = 0 to 2
        line (scale * (sq_p(i).x(j)) + offx, scale * (sq_p(i).y(j)) + offy) - (scale * (sq_p(i).x(j + 1)) + offx, scale * (sq_p(i).y(j + 1)) + offy), sq_p(i).colour
    next
    line (scale * (sq_p(i).x(3)) + offx, (scale * sq_p(i).y(3)) + offy) - (scale * (sq_p(i).x(0)) + offx, scale * (sq_p(i).y(0)) + offy), sq_p(i).colour
    paint (scale * ((sq_p(i).x(0) + sq_p(i).x(2)) / 2) + offx, scale * ((sq_p(i).y(1) + sq_p(i).y(3)) / 2) + offy), sq_p(i).colour  
next

screenunlock()

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub rotate_x(sq() as coord, x as single, z() as integer)

dim as integer i, j, k
dim as single b, c 

for i = lbound(z) to ubound(z)
    k = z(i)
    for j = 0 to 3
		b = sq(k).y(j)
		c = sq(k).z(j)
		sq(k).y(j) = b * cos(x) - c * sin(x)
		sq(k).z(j) = b * sin(x) + c * cos(x)
    next
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub rotate_y(sq() as coord, x as single, z() as integer)

dim as integer i, j, k
dim as single b, c

for i = lbound(z) to ubound(z)
    k = z(i)
    for j = 0 to 3        
		b = sq(k).x(j)
		c = sq(k).z(j)
		sq(k).x(j) = b * cos(x) - c * sin(x)
		sq(k).z(j) = b * sin(x) + c * cos(x)
    next
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub rotate_z(sq() as coord, x as single, z() as integer)

dim as integer i, j, k
dim as single b, c

for i = lbound(z) to ubound(z)
    k = z(i)
    for j = 0 to 3
		b = sq(k).x(j)
		c = sq(k).y(j)
		sq(k).x(j) = b * cos(x) - c * sin(x)
		sq(k).y(j) = b * sin(x) + c * cos(x)
    next
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

function get_vis (sq_p() as coord, l as integer) as single

dim as single a, b, c, d, e, f, x1, y1, z1, x2, y2, z2


x1 = sq_p(l).x(1) - sq_p(l).x(0)
y1 = sq_p(l).y(1) - sq_p(l).y(0)
z1 = sq_p(l).z(1) - sq_p(l).z(0)

x2 = sq_p(l).x(3) - sq_p(l).x(0)
y2 = sq_p(l).y(3) - sq_p(l).y(0)
z2 = sq_p(l).z(3) - sq_p(l).z(0)

a = y1 * z2 - z1 * y2			
b = z1 * x2 - x1 * z2
c = x1 * y2 - y1 * x2

d = 0
e = 0 
f = 3000

return (a * d + b * e + c * f) / ((sqr(a * a + b * b + c * c) * (sqr(d * d + e * e + f * f))))

end function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub y_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)

dim as integer i, j, k
dim as single a

for k = 0 to 44
    a = 1 * rad
    rotate_x(sq(), ta * a, slice())
    rotate_y(sq(), 45 * -a, slice())
    rotate_y(sq(), d * a, slice())
    rotate_y(sq(), d * a, slice())        
    rotate_y(sq(), 45 * a, slice())    
    rotate_x(sq(), ta * -a, slice())       
    for i = 0 to 53
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour
        vis(i) = get_vis(sq_p(), i)       
    next

    display(sq_p(), vis())

    sleep 10
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub x_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)

dim as integer i, j, k
dim as single a

for k = 0 to 44
    a = 1 * rad
    rotate_x(sq(), ta * a, slice())
    rotate_y(sq(), 45 * -a, slice())
    rotate_x(sq(), d * a, slice())
    rotate_x(sq(), d * a, slice())        
    rotate_y(sq(), 45 * a, slice())    
    rotate_x(sq(), ta * -a, slice())      
    for i = 0 to 53
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour        
        vis(i) = get_vis(sq_p(), i)       
    next

    display(sq_p(), vis())

    sleep 10
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub z_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)

dim as integer i, j, k
dim as single a

for k = 0 to 44
    a = 1 * rad
    rotate_x(sq(), ta * a, slice())
    rotate_y(sq(), 45 * -a, slice())
    rotate_z(sq(), d * a, slice())
    rotate_z(sq(), d * a, slice())        
    rotate_y(sq(), 45 * a, slice())    
    rotate_x(sq(), ta * -a, slice())     
    for i = 0 to 53
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour     
        vis(i) = get_vis(sq_p(), i)       
    next

    display(sq_p(), vis())

    sleep 10
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub anti_clockwise(sq() as coord, master() as coord, sl() as integer)

dim  as integer i, j, count
dim as integer temp(2, 2)

for i = 0 to 2
    for j = 0 to 2
        temp(i, j) = sl(count)
        count += 1
    next    
next

count = 0

for j = 0 to 2
    for i = 2 to 0 step -1
        master(temp(i, j)).colour = sq(sl(count)).colour
        count += 1
    next
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub clockwise(sq() as coord, master() as coord, sl() as integer)

dim  as integer i, j, count
dim as integer temp(2, 2)

for i = 0 to 2
    for j = 0 to 2
        temp(i, j) = sl(count)
        count += 1
    next    
next

count = 0

for j = 2 to 0 step -1
    for i = 0 to 2
        master(temp(i, j)).colour = sq(sl(count)).colour
        count += 1
    next
next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

sub shuffle(sq() as coord, sq_p() as coord, master() as coord, vis() as single, x_1() as integer, x_2() as integer, x_3() as integer, _
            y_1() as integer, y_2() as integer, y_3() as integer, z_1() as integer, z_2() as integer, z_3() as integer, slice() as string)

dim as integer i, j, k, rand, oldrand

for j = 0 to 30
    do
        rand = int(rnd * 18)
    loop while (abs(rand - oldrand) = 9)    
    oldrand = rand
    
            select case slice(rand)
            
                case "y1+"
                    y_(sq(), sq_p(), y_1(), vis(), 1)
                    for i = 12 to 20
                        master(y_1(i)).colour = sq(y_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_1(i)).colour = sq(y_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_1())
                                                
                case "y2+" 
                    y_(sq(), sq_p(), y_2(), vis(), 1)
                    for i = 3 to 11
                        master(y_2(i)).colour = sq(y_2(i - 3)).colour
                    next
                    for i = 0 to 2 
                        master(y_2(i)).colour = sq(y_2(i + 9)).colour
                    next
                                        
                case "y3+"
                    y_(sq(), sq_p(), y_3(), vis(), 1)
                    for i = 12 to 20
                        master(y_3(i)).colour = sq(y_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_3(i)).colour = sq(y_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_3())              
            
                case "z1-" 
                    z_(sq(), sq_p(), z_1(), vis(), -1) 
                    for i =12 to 20
                        master(z_1(i)).colour = sq(z_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_1(i)).colour = sq(z_1(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_1())
                                            
                case "x1-" 
                    x_(sq(), sq_p(), x_1(), vis(), -1)
                    for i = 12 to 20
                        master(x_1(i)).colour = sq(x_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_1(i)).colour = sq(x_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_1())                        

                case "z2-"
                    z_(sq(), sq_p(), z_2(), vis(), -1) 
                    for i = 3 to 11
                        master(z_2(i)).colour = sq(z_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(z_2(i)).colour = sq(z_2(i + 9)).colour
                    next
                                                   
                case "x2-" 
                    x_(sq(), sq_p(), x_2(), vis(), -1)
                    for i = 3 to 11
                        master(x_2(i)).colour = sq(x_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(x_2(i)).colour = sq(x_2(i + 9)).colour
                    next                           

                case "z3-" 
                    z_(sq(), sq_p(), z_3(), vis(), -1)
                    for i = 12 to 20
                        master(z_3(i)).colour = sq(z_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_3(i)).colour = sq(z_3(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), z_3())
                    
                case "x3-" 
                    x_(sq(), sq_p(), x_3(), vis(), -1)
                    for i = 12 to 20
                        master(x_3(i)).colour = sq(x_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_3(i)).colour = sq(x_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_3())                    

                case "x1+" 
                    x_(sq(), sq_p(), x_1(), vis(), 1)
                    for i = 9 to 17
                        master(x_1(i)).colour = sq(x_1(i + 3)).colour
                    next                    
                    for i = 18 to 20
                        master(x_1(i)).colour = sq(x_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_1())
                                              
                case "z1+" 
                    z_(sq(), sq_p(), z_1(), vis(), 1) 
                     for i = 9 to 17
                        master(z_1(i)).colour = sq(z_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_1(i)).colour = sq(z_1(i - 9)).colour
                    next
                    'c
                    clockwise(sq(), master(), z_1())                         

                case "x2+"
                    x_(sq(), sq_p(), x_2(), vis(), 1)
                    for i = 0 to 8
                        master(x_2(i)).colour = sq(x_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(x_2(i)).colour = sq(x_2(i - 9)).colour
                    next
                                               
                case "z2+" 
                    z_(sq(), sq_p(), z_2(), vis(), 1)
                    for i = 0 to 8
                        master(z_2(i)).colour = sq(z_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(z_2(i)).colour = sq(z_2(i - 9)).colour
                    next                           

                case "x3+"
                    x_(sq(), sq_p(), x_3(), vis(), 1)
                    for i = 9 to 17
                        master(x_3(i)).colour = sq(x_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(x_3(i)).colour = sq(x_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_3())
                                              
                case "z3+"
                    z_(sq(), sq_p(), z_3(), vis(), 1)
                    for i = 9 to 17
                        master(z_3(i)).colour = sq(z_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_3(i)).colour = sq(z_3(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_3())
                    
                case "y1-"
                    y_(sq(), sq_p(), y_1(), vis(), -1)
                    for i = 9 to 17
                        master(y_1(i)).colour = sq(y_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_1(i)).colour = sq(y_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_1())
                                          
                case "y2-" 
                    y_(sq(), sq_p(), y_2(), vis(), -1)
                    for i = 0 to 8
                        master(y_2(i)).colour = sq(y_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(y_2(i)).colour = sq(y_2(i - 9)).colour
                    next
                                            
                case "y3-"
                    y_(sq(), sq_p(), y_3(), vis(), -1)
                    for i = 9 to 17
                        master(y_3(i)).colour = sq(y_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_3(i)).colour = sq(y_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_3())
                                        
            end select

    for k = 0 to 53
       sq(k) = master(k)              
    next    

next

end sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copy and Pasted from Rosetta Code
function in_tri( A as p2d, B as p2d, C as p2d, P as p2d ) as boolean
    'uses barycentric coordinates to determine if point P is inside
    'the triangle defined by points A, B, C
    dim as double AreaD = (-B.y*C.x + A.y*(-B.x + C.x) + A.x*(B.y - C.y) + B.x*C.y)
    dim as double s = (A.y*C.x - A.x*C.y + (C.y - A.y)*P.x + (A.x - C.x)*P.y)/AreaD
    dim as double t = (A.x*B.y - A.y*B.x + (A.y - B.y)*P.x + (B.x - A.x)*P.y)/AreaD
    if s<=0 then return false
    if t<=0 then return false
    if s+t>=1 then return false
    return true
end function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
function inside(m_slice() as p2d, i as integer, x as integer, y as integer) as integer

dim as p2d a, b, c, d, p

a.x = scale * (m_slice(i, 0).x) + offx
a.y = scale * (m_slice(i, 0).y) + offy

b.x = scale * (m_slice(i, 1).x) + offx
b.y = scale * (m_slice(i, 1).y) + offy

c.x = scale * (m_slice(i, 2).x) + offx
c.y = scale * (m_slice(i, 2).y) + offy

d.x = scale * (m_slice(i, 3).x) + offx
d.y = scale * (m_slice(i, 3).y) + offy

p.x = x
p.y = y

if in_tri(a, b, c, p) then return 1
if in_tri(c, d, a, p) then return 1

return 0

end function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



'		main

backdrop()

for i = 0 to 53
    for j = 0 to 3
        sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
        sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
        sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
    next
    sq_p(i).colour = sq(i).colour
    vis(i) = get_vis(sq_p(), i)
next

display(sq_p(), vis())

sleep 10

for k = 0 to 44
    x = 1 * rad
    rotate_y(sq(), x, cube())     
    for i = 0 to 53
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour
        vis(i) = get_vis(sq_p(), i)
    next

    display(sq_p(), vis())

    sleep 10
next


for k = 1 to ta
    x = -1 * rad
    rotate_x(sq(), x, cube())     
    for i = 0 to 53
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour
        vis(i) = get_vis(sq_p(), i)        
    next

    display(sq_p(), vis())

    sleep 10
next

for k = 0 to 359
    x = -1 * rad
    rotate_y(sq(), x, cube())     
    for i =lbound(cube) to ubound(cube)
        for j = 0 to 3
            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
        next
        sq_p(i).colour = sq(i).colour
        vis(i) = get_vis(sq_p(), i)        
    next

    display(sq_p(), vis())

    sleep 10
next

for i = 0 to 5
    for j = 0 to 3
        read p, q
        m_slice(i, j).x = sq_p(p).x(q)
        m_slice(i, j).y = sq_p(p).y(q)
        m_slice(i + 6, j).x = sq_p(p + 27).x(q)
        m_slice(i + 6, j).y = sq_p(p + 27).y(q)
        m_slice(i + 12, j).x = sq_p(p + 36).x(q)
        m_slice(i + 12, j).y = sq_p(p + 36).y(q)                
    next
next        

for i = 0 to 53
    master(i) = sq(i)
    start(i) = sq(i)
next    

'  mouse input loop

do
    quit = inkey
    if quit = chr(255) + "k" then end

    res = getmouse(mx, my, , mbuttons)

    if mbuttons = 1 then
        
        do
            getmouse(fx, fy, , mbuttons)        
        loop while mbuttons = 1

        if fx > 19 and fx < 143 then
            select case fy
                case 20 to 68
                    shuffle(sq(), sq_p(), master(), vis(), x_1(), x_2(), x_3(), y_1(), y_2(), y_3(), z_1(), z_2(), z_3(), slice())
                case 90 to 138
                    for i = 0 to 53
                        master(i) = start(i)
                        for j = 0 to 3
                            sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
                            sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
                            sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
                        next 
                        sq_p(i).colour = start(i).colour
                        vis(i) = get_vis(sq_p(), i)                          
                    next 
                    display(sq_p(), vis())    
                case 160 to 208
                    ' solve
            end select            
        end if       
        
        for j = 0 to 17      
            if inside(m_slice(), j, mx, my) and inside(m_slice(), j, fx, fy) then exit for
        next
        
        select case j
            case 0, 12
                if my - fy > 30 then
                ' x1+
                    x_(sq(), sq_p(), x_1(), vis(), 1)
                    for i = 9 to 17
                        master(x_1(i)).colour = sq(x_1(i + 3)).colour
                    next                    
                    for i = 18 to 20
                        master(x_1(i)).colour = sq(x_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_1())                
                end if
                if fy - my > 30 then            
                ' x1-
                    x_(sq(), sq_p(), x_1(), vis(), -1)
                    for i = 12 to 20
                        master(x_1(i)).colour = sq(x_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_1(i)).colour = sq(x_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_1())                 
                end if
            
            case 1, 13
                if my - fy > 30 then
                ' x2+
                    x_(sq(), sq_p(), x_2(), vis(), 1)
                    for i = 0 to 8
                        master(x_2(i)).colour = sq(x_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(x_2(i)).colour = sq(x_2(i - 9)).colour
                    next          
               end if
               if fy - my > 30 then            
                ' x2-
                    x_(sq(), sq_p(), x_2(), vis(), -1)
                    for i = 3 to 11
                        master(x_2(i)).colour = sq(x_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(x_2(i)).colour = sq(x_2(i + 9)).colour
                    next               
               end if            
            
            case 2, 14
                if my - fy > 30 then
                ' x1+
                    x_(sq(), sq_p(), x_3(), vis(), 1)
                    for i = 9 to 17
                        master(x_3(i)).colour = sq(x_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(x_3(i)).colour = sq(x_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_3())               
               end if
               if fy - my > 30 then            
                ' x1-
                    x_(sq(), sq_p(), x_3(), vis(), -1)
                    for i = 12 to 20
                        master(x_3(i)).colour = sq(x_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_3(i)).colour = sq(x_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_3())                
               end if            
            
            case 3, 9
                if mx - fx > 30 then
                ' y1+
                    y_(sq(), sq_p(), y_1(), vis(), 1)
                    for i = 12 to 20
                        master(y_1(i)).colour = sq(y_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_1(i)).colour = sq(y_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_1())                
               end if
               if fx - mx > 30 then            
                ' y1-
                    y_(sq(), sq_p(), y_1(), vis(), -1)
                    for i = 9 to 17
                        master(y_1(i)).colour = sq(y_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_1(i)).colour = sq(y_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_1())                
               end if                        
            
            case 4, 10
                if mx - fx > 30 then
                ' y1+
                    y_(sq(), sq_p(), y_2(), vis(), 1)
                    for i = 3 to 11
                        master(y_2(i)).colour = sq(y_2(i - 3)).colour
                    next
                    for i = 0 to 2 
                        master(y_2(i)).colour = sq(y_2(i + 9)).colour
                    next                             
               end if
               if fx - mx > 30 then            
                ' y1-
                    y_(sq(), sq_p(), y_2(), vis(), -1)
                    for i = 0 to 8
                        master(y_2(i)).colour = sq(y_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(y_2(i)).colour = sq(y_2(i - 9)).colour
                    next                                        
               end if            
            
            case 5, 11
                if mx - fx > 30 then
                ' y1+
                    y_(sq(), sq_p(), y_3(), vis(), 1)
                    for i = 12 to 20
                        master(y_3(i)).colour = sq(y_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_3(i)).colour = sq(y_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_3())                
               end if
               if fx - mx > 30 then            
                ' y1-
                    y_(sq(), sq_p(), y_3(), vis(), -1)
                    for i = 9 to 17
                        master(y_3(i)).colour = sq(y_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_3(i)).colour = sq(y_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_3())               
               end if              
            
            case 6, 17
                if my - fy > 30 then
                ' z1-
                    z_(sq(), sq_p(), z_1(), vis(), -1) 
                    for i =12 to 20
                        master(z_1(i)).colour = sq(z_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_1(i)).colour = sq(z_1(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_1())                
                end if
                if fy - my > 30 then            
                ' z1+
                    z_(sq(), sq_p(), z_1(), vis(), 1) 
                     for i = 9 to 17
                        master(z_1(i)).colour = sq(z_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_1(i)).colour = sq(z_1(i - 9)).colour
                    next
                    'c
                    clockwise(sq(), master(), z_1())                 
                end if            
            
            case 7, 16
                if my - fy > 30 then
                ' z2-
                    z_(sq(), sq_p(), z_2(), vis(), -1) 
                    for i = 3 to 11
                        master(z_2(i)).colour = sq(z_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(z_2(i)).colour = sq(z_2(i + 9)).colour
                    next                          
                end if
                if fy - my > 30 then            
                ' z2+
                    z_(sq(), sq_p(), z_2(), vis(), 1)
                    for i = 0 to 8
                        master(z_2(i)).colour = sq(z_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(z_2(i)).colour = sq(z_2(i - 9)).colour
                    next                                            
                end if                        

            case 8, 15
                if my - fy > 30 then
                ' z3-
                    z_(sq(), sq_p(), z_3(), vis(), -1)
                    for i = 12 to 20
                        master(z_3(i)).colour = sq(z_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_3(i)).colour = sq(z_3(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), z_3())                
                end if
                if fy - my > 30 then            
                ' z3+
                    z_(sq(), sq_p(), z_3(), vis(), 1)
                    for i = 9 to 17
                        master(z_3(i)).colour = sq(z_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_3(i)).colour = sq(z_3(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_3())                 
                end if    

        end select    
    end if


    if mbuttons = 2 then
        
        do
            getmouse(fx, fy, , mbuttons)        
        loop while mbuttons = 2
        
        for j = 0 to 17      
            if inside(m_slice(), j, mx, my) and inside(m_slice(), j, fx, fy) then exit for
        next

        select case j
            case 0 to 2, 12 to 14
                if my - fy > 30 then
                    x_(sq(), sq_p(), cube(), vis(), 1)                
                    for i = 9 to 17
                        master(x_1(i)).colour = sq(x_1(i + 3)).colour
                    next                    
                    for i = 18 to 20
                        master(x_1(i)).colour = sq(x_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_1())
                    for i = 0 to 8
                        master(x_2(i)).colour = sq(x_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(x_2(i)).colour = sq(x_2(i - 9)).colour
                    next
                    for i = 9 to 17
                        master(x_3(i)).colour = sq(x_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(x_3(i)).colour = sq(x_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_3())                
                end if
                
                if fy - my > 30 then             
                    x_(sq(), sq_p(), cube(), vis(), -1)
                    for i = 12 to 20
                        master(x_1(i)).colour = sq(x_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_1(i)).colour = sq(x_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), x_1())
                    for i = 3 to 11
                        master(x_2(i)).colour = sq(x_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(x_2(i)).colour = sq(x_2(i + 9)).colour
                    next
                    for i = 12 to 20
                        master(x_3(i)).colour = sq(x_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(x_3(i)).colour = sq(x_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), x_3())                     
                end if
                                                                                                         
            case 6 to 8, 15 to 17
                if my - fy > 30 then
                    z_(sq(), sq_p(), cube(), vis(), -1)
                    for i =12 to 20
                        master(z_1(i)).colour = sq(z_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_1(i)).colour = sq(z_1(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_1())
                    for i = 3 to 11
                        master(z_2(i)).colour = sq(z_2(i - 3)).colour
                    next
                    for i = 0 to 2
                        master(z_2(i)).colour = sq(z_2(i + 9)).colour
                    next
                    for i = 12 to 20
                        master(z_3(i)).colour = sq(z_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(z_3(i)).colour = sq(z_3(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), z_3())  
                end if

                if fy - my > 30 then                   
                    z_(sq(), sq_p(), cube(), vis(), 1)
                     for i = 9 to 17
                        master(z_1(i)).colour = sq(z_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_1(i)).colour = sq(z_1(i - 9)).colour
                    next
                    'c
                    clockwise(sq(), master(), z_1())
                    for i = 0 to 8
                        master(z_2(i)).colour = sq(z_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(z_2(i)).colour = sq(z_2(i - 9)).colour
                    next
                    for i = 9 to 17
                        master(z_3(i)).colour = sq(z_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(z_3(i)).colour = sq(z_3(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), z_3())                                 
                end if            
                          
            case 3 to 5, 9 to 11            
                if mx - fx > 30 then
                    y_(sq(), sq_p(), cube(), vis(), 1)
                    for i = 12 to 20
                        master(y_1(i)).colour = sq(y_1(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_1(i)).colour = sq(y_1(i + 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_1())                            
                    for i = 3 to 11
                        master(y_2(i)).colour = sq(y_2(i - 3)).colour
                    next
                    for i = 0 to 2 
                        master(y_2(i)).colour = sq(y_2(i + 9)).colour
                    next                    
                    for i = 12 to 20
                        master(y_3(i)).colour = sq(y_3(i - 3)).colour
                    next
                    for i = 9 to 11
                        master(y_3(i)).colour = sq(y_3(i + 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_3())                     
                end if
                    
                if fx - mx > 30 then
                    y_(sq(), sq_p(), cube(), vis(), -1)
                    for i = 9 to 17
                        master(y_1(i)).colour = sq(y_1(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_1(i)).colour = sq(y_1(i - 9)).colour
                    next
                    ' ac
                    anti_clockwise(sq(), master(), y_1())                      
                    for i = 0 to 8
                        master(y_2(i)).colour = sq(y_2(i + 3)).colour
                    next
                    for i = 9 to 11
                        master(y_2(i)).colour = sq(y_2(i - 9)).colour
                    next                        
                    for i = 9 to 17
                        master(y_3(i)).colour = sq(y_3(i + 3)).colour
                    next
                    for i = 18 to 20
                        master(y_3(i)).colour = sq(y_3(i - 9)).colour
                    next
                    ' c
                    clockwise(sq(), master(), y_3())                    
                end if        
        end select
        
    end if        

    for i = 0 to 53
       sq(i) = master(i)              
    next     
        
    sleep 50            
loop

Post Reply