A simple Rubiks Cube Puzzle
// Project: RubiksCube
// Created: 2018-12-08
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle( "RubiksCube" )
SetWindowSize( 1024, 768, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window
// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 ) // since version 2.0.22 we can use nicer default fonts
#constant KEY_NUMPAD_0 96
#constant KEY_NUMPAD_1 97
#constant KEY_NUMPAD_2 98
#constant KEY_NUMPAD_3 99
#constant KEY_NUMPAD_4 100
#constant KEY_NUMPAD_5 101
#constant KEY_NUMPAD_6 102
#constant KEY_NUMPAD_7 103
#constant KEY_NUMPAD_8 104
#constant KEY_NUMPAD_9 105
#constant KEY_SPACE 32
#constant KEY_A 65
#constant KEY_D 68
#constant KEY_E 69
#constant KEY_F 70
#constant KEY_G 71
#constant KEY_Q 81
#constant KEY_R 82
#constant KEY_S 83
#constant KEY_T 84
#constant KEY_W 87
#constant KEY_X 88
#constant KEY_Z 90
type cubePiece
id as integer
num as integer
x as integer
y as integer
z as integer
startX as integer //used for checking if solved
startY as integer
startZ as integer
endtype
global rubiks as cubePiece[27]
//front face start locations
rubiks[0].num=1:rubiks[0].x=-1:rubiks[0].y=1:rubiks[0].z=-1
rubiks[1].num=2:rubiks[1].x=0:rubiks[1].y=1:rubiks[1].z=-1
rubiks[2].num=3:rubiks[2].x=1:rubiks[2].y=1:rubiks[2].z=-1
rubiks[3].num=4:rubiks[3].x=-1:rubiks[3].y=0:rubiks[3].z=-1
rubiks[4].num=5:rubiks[4].x=0:rubiks[4].y=0:rubiks[4].z=-1
rubiks[5].num=6:rubiks[5].x=1:rubiks[5].y=0:rubiks[5].z=-1
rubiks[6].num=7:rubiks[6].x=-1:rubiks[6].y=-1:rubiks[6].z=-1
rubiks[7].num=8:rubiks[7].x=0:rubiks[7].y=-1:rubiks[7].z=-1
rubiks[8].num=9:rubiks[8].x=1:rubiks[8].y=-1:rubiks[8].z=-1
//middle start locations
rubiks[9].num=10:rubiks[9].x=-1:rubiks[9].y=1:rubiks[9].z=0
rubiks[10].num=11:rubiks[10].x=0:rubiks[10].y=1:rubiks[10].z=0
rubiks[11].num=12:rubiks[11].x=1:rubiks[11].y=1:rubiks[11].z=0
rubiks[12].num=13:rubiks[12].x=-1:rubiks[12].y=0:rubiks[12].z=0
rubiks[13].num=14:rubiks[13].x=0:rubiks[13].y=0:rubiks[13].z=0
rubiks[14].num=15:rubiks[14].x=1:rubiks[14].y=0:rubiks[14].z=0
rubiks[15].num=16:rubiks[15].x=-1:rubiks[15].y=-1:rubiks[15].z=0
rubiks[16].num=17:rubiks[16].x=0:rubiks[16].y=-1:rubiks[16].z=0
rubiks[17].num=18:rubiks[17].x=1:rubiks[17].y=-1:rubiks[17].z=0
//back start locations
rubiks[18].num=19:rubiks[18].x=-1:rubiks[18].y=1:rubiks[18].z=1
rubiks[19].num=20:rubiks[19].x=0:rubiks[19].y=1:rubiks[19].z=1
rubiks[20].num=21:rubiks[20].x=1:rubiks[20].y=1:rubiks[20].z=1
rubiks[21].num=22:rubiks[21].x=-1:rubiks[21].y=0:rubiks[21].z=1
rubiks[22].num=23:rubiks[22].x=0:rubiks[22].y=0:rubiks[22].z=1
rubiks[23].num=24:rubiks[23].x=1:rubiks[23].y=0:rubiks[23].z=1
rubiks[24].num=25:rubiks[24].x=-1:rubiks[24].y=-1:rubiks[24].z=1
rubiks[25].num=26:rubiks[25].x=0:rubiks[25].y=-1:rubiks[25].z=1
rubiks[26].num=27:rubiks[26].x=1:rubiks[26].y=-1:rubiks[26].z=1
for num = 0 to 26
rubiks[num].id=createObjectBox(1,1,1)
If rubiks[num].num<=9 then setObjectColor(rubiks[num].id,255,0,0,255)
If rubiks[num].num>9 and rubiks[num].num<=18 then setObjectColor(rubiks[num].id,255,255,0,255)
If rubiks[num].num>18 and rubiks[num].num<=27 then setObjectColor(rubiks[num].id,0,0,255,255)
SetObjectPosition(rubiks[num].id,rubiks[num].x,rubiks[num].y,rubiks[num].z)
rubiks[num].startX=rubiks[num].x:rubiks[num].startY=rubiks[num].y:rubiks[num].startZ=rubiks[num].z
next
do
if GetRawKeyState(38)=1 Then MoveCameraLocalZ(1,1)
if GetRawKeyState(40)=1 Then MoveCameraLocalZ(1,-1)
if GetRawKeyState(39)=1 Then MoveCameraLocalX(1,1)
if GetRawKeyState(37)=1 Then MoveCameraLocalX(1,-1)
If GetRawKeyState(KEY_Q)=1
rotateTopRowAroundY()
endif
If GetRawKeyState(KEY_A)=1
rotateMiddleRowAroundY()
endif
If GetRawKeyState(KEY_Z)=1
rotateBottomRowAroundY()
endif
If GetRawKeyState(KEY_W)=1
rotate2TopRowAroundY()
endif
If GetRawKeyState(KEY_S)=1
rotate2MiddleRowAroundY()
endif
If GetRawKeyState(KEY_X)=1
rotate2BottomRowAroundY()
endif
If GetRawKeyState(KEY_E)=1
rotateLeftColumaroundX()
endif
If GetRawKeyState(KEY_R)=1
rotateMiddleColumaroundX()
endif
If GetRawKeyState(KEY_T)=1
rotateRightColumaroundX()
endif
If GetRawKeyState(KEY_D)=1
rotate2LeftColumaroundX()
endif
If GetRawKeyState(KEY_F)=1
rotate2MiddleColumaroundX()
endif
If GetRawKeyState(KEY_G)=1
rotate2RightColumaroundX()
endif
If GetRawKeyState(KEY_SPACE)=1
shuffle()
endif
Print( "RUBIKS CUBE PUZZLE" )
Print( "Use the numeric Keypad to rotate cube pieces." )
Print( "Q,A,Z rotate clockwise around the y axis.")
Print( "W,S,X rotate anti-clockwise around the y axis.")
Print( "E,R,T rotate clockwise around the X axis.")
Print( "D,F,G rotate anti-clockwise around the X axis.")
Print( "Space to shuffle.")
if isSolved() then Print("Solved")
Sync()
loop
function unfixAll()
for num = 0 to 26
FixObjectToObject(rubiks[num].id,0)
next num
endfunction
function getIdByLocation(x as integer,y as integer,z as integer)
num=-1
repeat
inc num
until rubiks[num].x=x and rubiks[num].y=y and rubiks[num].z=z
endfunction rubiks[num].id
function setObjectNewlocation(id as integer,x as integer,y as integer,z as integer)
num=-1
repeat
inc num
until rubiks[num].id=id
rubiks[num].x=x:rubiks[num].y=y:rubiks[num].z=z
SetObjectPosition(rubiks[num].id,x,y,z)
endfunction
function isSolved()
num=-1:flag=1
repeat
inc num
if rubiks[num].startX<>rubiks[num].x then flag=0
if rubiks[num].startY<>rubiks[num].y then flag=0
if rubiks[num].startZ<>rubiks[num].z then flag=0
until num=26
endfunction flag
function shuffle()
for t = 1 to 10
ran=(random(1,6))
select ran
case 1:
rotateTopRowAroundY()
endcase
case 2:
rotateMiddleRowAroundY()
endcase
case 3:
rotateBottomRowAroundY()
endcase
case 4:
rotateRightColumaroundX()
endcase
case 5:
rotateMiddleColumaroundX()
endcase
case 6:
rotateLeftColumaroundX()
endcase
endselect
next t
endfunction
function rotateTopRowAroundY()
id1=getIdByLocation(-1,1,-1)
id2=getIdByLocation(0,1,-1)
id3=getIdByLocation(1,1,-1)
id4=getIdByLocation(-1,1,0)
id5=getIdByLocation(0,1,0)
id6=getIdByLocation(1,1,0)
id7=getIdByLocation(-1,1,1)
id8=getIdByLocation(0,1,1)
id9=getIdByLocation(1,1,1)
setObjectNewlocation(id1,-1,1,1)
setObjectNewlocation(id2,-1,1,0)
setObjectNewlocation(id3,-1,1,-1)
setObjectNewlocation(id4,0,1,1)
setObjectNewlocation(id5,0,1,0)
setObjectNewlocation(id6,0,1,-1)
setObjectNewlocation(id7,1,1,1)
setObjectNewlocation(id8,1,1,0)
setObjectNewlocation(id9,1,1,-1)
endfunction
function rotate2TopRowAroundY()
id1=getIdByLocation(-1,1,-1)
id2=getIdByLocation(0,1,-1)
id3=getIdByLocation(1,1,-1)
id4=getIdByLocation(-1,1,0)
id5=getIdByLocation(0,1,0)
id6=getIdByLocation(1,1,0)
id7=getIdByLocation(-1,1,1)
id8=getIdByLocation(0,1,1)
id9=getIdByLocation(1,1,1)
setObjectNewlocation(id1,1,1,-1)
setObjectNewlocation(id2,1,1,0)
setObjectNewlocation(id3,1,1,1)
setObjectNewlocation(id4,0,1,-1)
setObjectNewlocation(id5,0,1,0)
setObjectNewlocation(id6,0,1,1)
setObjectNewlocation(id7,-1,1,-1)
setObjectNewlocation(id8,-1,1,0)
setObjectNewlocation(id9,-1,1,1)
endfunction
function rotateMiddleRowAroundY()
id1=getIdByLocation(-1,0,-1)
id2=getIdByLocation(0,0,-1)
id3=getIdByLocation(1,0,-1)
id4=getIdByLocation(-1,0,0)
id5=getIdByLocation(0,0,0)
id6=getIdByLocation(1,0,0)
id7=getIdByLocation(-1,0,1)
id8=getIdByLocation(0,0,1)
id9=getIdByLocation(1,0,1)
setObjectNewlocation(id1,-1,0,1)
setObjectNewlocation(id2,-1,0,0)
setObjectNewlocation(id3,-1,0,-1)
setObjectNewlocation(id4,0,0,1)
setObjectNewlocation(id5,0,0,0)
setObjectNewlocation(id6,0,0,-1)
setObjectNewlocation(id7,1,0,1)
setObjectNewlocation(id8,1,0,0)
setObjectNewlocation(id9,1,0,-1)
endfunction
function rotate2MiddleRowAroundY()
id1=getIdByLocation(-1,0,-1)
id2=getIdByLocation(0,0,-1)
id3=getIdByLocation(1,0,-1)
id4=getIdByLocation(-1,0,0)
id5=getIdByLocation(0,0,0)
id6=getIdByLocation(1,0,0)
id7=getIdByLocation(-1,0,1)
id8=getIdByLocation(0,0,1)
id9=getIdByLocation(1,0,1)
setObjectNewlocation(id1,1,0,-1)
setObjectNewlocation(id2,1,0,0)
setObjectNewlocation(id3,1,0,1)
setObjectNewlocation(id4,0,0,-1)
setObjectNewlocation(id5,0,0,0)
setObjectNewlocation(id6,0,0,1)
setObjectNewlocation(id7,-1,0,-1)
setObjectNewlocation(id8,-1,0,0)
setObjectNewlocation(id9,-1,0,1)
endfunction
function rotate2BottomRowAroundY()
id1=getIdByLocation(-1,-1,-1)
id2=getIdByLocation(0,-1,-1)
id3=getIdByLocation(1,-1,-1)
id4=getIdByLocation(-1,-1,0)
id5=getIdByLocation(0,-1,0)
id6=getIdByLocation(1,-1,0)
id7=getIdByLocation(-1,-1,1)
id8=getIdByLocation(0,-1,1)
id9=getIdByLocation(1,-1,1)
setObjectNewlocation(id1,1,-1,-1)
setObjectNewlocation(id2,1,-1,0)
setObjectNewlocation(id3,1,-1,1)
setObjectNewlocation(id4,0,-1,-1)
setObjectNewlocation(id5,0,-1,0)
setObjectNewlocation(id6,0,-1,1)
setObjectNewlocation(id7,-1,-1,-1)
setObjectNewlocation(id8,-1,-1,0)
setObjectNewlocation(id9,-1,-1,1)
endfunction
function rotateBottomRowAroundY()
id1=getIdByLocation(-1,-1,-1)
id2=getIdByLocation(0,-1,-1)
id3=getIdByLocation(1,-1,-1)
id4=getIdByLocation(-1,-1,0)
id5=getIdByLocation(0,-1,0)
id6=getIdByLocation(1,-1,0)
id7=getIdByLocation(-1,-1,1)
id8=getIdByLocation(0,-1,1)
id9=getIdByLocation(1,-1,1)
setObjectNewlocation(id1,-1,-1,1)
setObjectNewlocation(id2,-1,-1,0)
setObjectNewlocation(id3,-1,-1,-1)
setObjectNewlocation(id4,0,-1,1)
setObjectNewlocation(id5,0,-1,0)
setObjectNewlocation(id6,0,-1,-1)
setObjectNewlocation(id7,1,-1,1)
setObjectNewlocation(id8,1,-1,0)
setObjectNewlocation(id9,1,-1,-1)
endfunction
function rotateRightColumaroundX()
id3=getIdByLocation(1,1,-1)
id6=getIdByLocation(1,0,-1)
id9=getIdByLocation(1,-1,-1)
id12=getIdByLocation(1,1,0)
id15=getIdByLocation(1,0,0)
id18=getIdByLocation(1,-1,0)
id21=getIdByLocation(1,1,1)
id24=getIdByLocation(1,0,1)
id27=getIdByLocation(1,-1,1)
setObjectNewlocation(id3,1,1,1)
setObjectNewlocation(id6,1,1,0)
setObjectNewlocation(id9,1,1,-1)
setObjectNewlocation(id12,1,0,1)
setObjectNewlocation(id15,1,0,0)
setObjectNewlocation(id18,1,0,-1)
setObjectNewlocation(id21,1,-1,1)
setObjectNewlocation(id24,1,-1,0)
setObjectNewlocation(id27,1,-1,-1)
endfunction
function rotate2RightColumaroundX()
id3=getIdByLocation(1,1,-1)
id6=getIdByLocation(1,0,-1)
id9=getIdByLocation(1,-1,-1)
id12=getIdByLocation(1,1,0)
id15=getIdByLocation(1,0,0)
id18=getIdByLocation(1,-1,0)
id21=getIdByLocation(1,1,1)
id24=getIdByLocation(1,0,1)
id27=getIdByLocation(1,-1,1)
setObjectNewlocation(id3,1,-1,-1)
setObjectNewlocation(id6,1,-1,0)
setObjectNewlocation(id9,1,-1,1)
setObjectNewlocation(id12,1,0,-1)
setObjectNewlocation(id15,1,0,0)
setObjectNewlocation(id18,1,0,1)
setObjectNewlocation(id21,1,1,-1)
setObjectNewlocation(id24,1,1,0)
setObjectNewlocation(id27,1,1,1)
endfunction
function rotateMiddleColumaroundX()
id3=getIdByLocation(0,1,-1)
id6=getIdByLocation(0,0,-1)
id9=getIdByLocation(0,-1,-1)
id12=getIdByLocation(0,1,0)
id15=getIdByLocation(0,0,0)
id18=getIdByLocation(0,-1,0)
id21=getIdByLocation(0,1,1)
id24=getIdByLocation(0,0,1)
id27=getIdByLocation(0,-1,1)
setObjectNewlocation(id3,0,1,1)
setObjectNewlocation(id6,0,1,0)
setObjectNewlocation(id9,0,1,-1)
setObjectNewlocation(id12,0,0,1)
setObjectNewlocation(id15,0,0,0)
setObjectNewlocation(id18,0,0,-1)
setObjectNewlocation(id21,0,-1,1)
setObjectNewlocation(id24,0,-1,0)
setObjectNewlocation(id27,0,-1,-1)
endfunction
function rotate2MiddleColumaroundX()
id3=getIdByLocation(0,1,-1)
id6=getIdByLocation(0,0,-1)
id9=getIdByLocation(0,-1,-1)
id12=getIdByLocation(0,1,0)
id15=getIdByLocation(0,0,0)
id18=getIdByLocation(0,-1,0)
id21=getIdByLocation(0,1,1)
id24=getIdByLocation(0,0,1)
id27=getIdByLocation(0,-1,1)
setObjectNewlocation(id3,0,-1,-1)
setObjectNewlocation(id6,0,-1,0)
setObjectNewlocation(id9,0,-1,1)
setObjectNewlocation(id12,0,0,-1)
setObjectNewlocation(id15,0,0,0)
setObjectNewlocation(id18,0,0,1)
setObjectNewlocation(id21,0,1,-1)
setObjectNewlocation(id24,0,1,0)
setObjectNewlocation(id27,0,1,1)
endfunction
function rotateLeftColumaroundX()
id3=getIdByLocation(-1,1,-1)
id6=getIdByLocation(-1,0,-1)
id9=getIdByLocation(-1,-1,-1)
id12=getIdByLocation(-1,1,0)
id15=getIdByLocation(-1,0,0)
id18=getIdByLocation(-1,-1,0)
id21=getIdByLocation(-1,1,1)
id24=getIdByLocation(-1,0,1)
id27=getIdByLocation(-1,-1,1)
setObjectNewlocation(id3,-1,1,1)
setObjectNewlocation(id6,-1,1,0)
setObjectNewlocation(id9,-1,1,-1)
setObjectNewlocation(id12,-1,0,1)
setObjectNewlocation(id15,-1,0,0)
setObjectNewlocation(id18,-1,0,-1)
setObjectNewlocation(id21,-1,-1,1)
setObjectNewlocation(id24,-1,-1,0)
setObjectNewlocation(id27,-1,-1,-1)
endfunction
function rotate2LeftColumaroundX()
id3=getIdByLocation(-1,1,-1)
id6=getIdByLocation(-1,0,-1)
id9=getIdByLocation(-1,-1,-1)
id12=getIdByLocation(-1,1,0)
id15=getIdByLocation(-1,0,0)
id18=getIdByLocation(-1,-1,0)
id21=getIdByLocation(-1,1,1)
id24=getIdByLocation(-1,0,1)
id27=getIdByLocation(-1,-1,1)
setObjectNewlocation(id3,-1,-1,-1)
setObjectNewlocation(id6,-1,-1,0)
setObjectNewlocation(id9,-1,-1,1)
setObjectNewlocation(id12,-1,0,-1)
setObjectNewlocation(id15,-1,0,0)
setObjectNewlocation(id18,-1,0,1)
setObjectNewlocation(id21,-1,1,-1)
setObjectNewlocation(id24,-1,1,0)
setObjectNewlocation(id27,-1,1,1)
endfunction
code needs a bit of refinement but its works and altho it don't texure the faces like an actual rubiks cube it does work like one
but would need to add the rotations instead of just moving when proper texture facing is used

fubar