Here is my crack at the 15 puzzle. I got it done in about an hour. Have fun.

Code:
```'Fifteen  by Jim Klutho
' PB 8.04

#COMPILE EXE
#DIM ALL
#INCLUDE "WIN32API.INC"

'--------Constants-----------------------
%IDM_FILE_EXIT        = 1001
%IDM_FILE_NEW         = 1002
%IDC_FIFTEEN          = 1000

'--------Types--------------------------

TYPE Square
theLabel  AS STRING * 2
theColor  AS LONG
theBackGround AS LONG
END TYPE

'--------Globals------------------------
GLOBAL s() AS Square
GLOBAL b() AS LONG
GLOBAL lpPoint AS POINTAPI
GLOBAL hDlg AS LONG
GLOBAL hBoard AS LONG
'--------Declares------------------------
DECLARE SUB FifteenRedraw
DECLARE SUB InitGame
DECLARE SUB MakeRandomBoard
'--------Functions-----------------------
SUB InitGame
LOCAL countx AS LONG
LOCAL county AS LONG
LOCAL mycount AS LONG

REDIM s(15) AS square
REDIM b(3,3)
FOR countx=0 TO 15
IF countx=0 THEN
s(countx).theLabel=""
ELSE
s(countx).theLabel=FORMAT\$(countx)
END IF
IF countx = 0 THEN
s(countx).theColor=%WHITE
s(countx).theBackGround=%WHITE
ELSEIF countx MOD 2 THEN
s(countx).theColor=%BLACK
s(countx).theBackGround=%WHITE
ELSE
s(countx).theColor=%GREEN
s(countx).theBackGround=%WHITE
END IF
NEXT countx

mycount=1
FOR county=0 TO 3
FOR countx = 0 TO 3
b(countx,county)=mycount
INCR mycount
NEXT countx
NEXT county
b(3,3)=0
END SUB

SUB MakeRandomBoard
LOCAL direction AS LONG
LOCAL countx AS LONG
LOCAL county AS LONG
LOCAL x AS LONG
'random  1 is up, 2 is down,  3 is right, 4 is left

FOR x = 1 TO 1000
direction = RND(1, 4)
FOR county= 0 TO 3
FOR countx = 0 TO 3
IF  b(countx,county)= 0 THEN
IF direction = 1 AND county <> 0 THEN SWAP b(countx,county),b(countx,county - 1)
IF direction = 2 AND county <> 3 THEN SWAP b(countx,county),b(countx,county + 1)
IF direction = 3 AND countx <> 3 THEN SWAP b(countx,county),b(countx + 1,county)
IF direction = 4 AND countx <> 0 THEN SWAP b(countx,county),b(countx - 1,county)
END IF
NEXT countx
NEXT county
NEXT x

END SUB

CALLBACK FUNCTION ShowFifteenProc()

LOCAL Result AS LONG
LOCAL countx AS LONG
LOCAL county AS LONG
LOCAL mycount AS LONG

SELECT CASE AS LONG CBMSG
CASE %WM_INITDIALOG

CASE %WM_NCACTIVATE
STATIC hWndSaveFocus AS DWORD
IF ISFALSE CBWPARAM THEN
hWndSaveFocus = GetFocus()
ELSEIF hWndSaveFocus THEN
SetFocus(hWndSaveFocus)
hWndSaveFocus = 0
END IF

CASE %WM_COMMAND
SELECT CASE AS LONG CBCTL
CASE %IDC_FIFTEEN
'%STN_CLICKED or %STN_DBLCLK assumed
Result=GetCursorPos (lpPoint)
Result=ScreenToClient (CBHNDL,lpPoint)

IF Result <> 0 THEN
countx=lpPoint.x\125
county=lpPoint.y\125
END IF

IF b(countx,county)=0 THEN
BEEP
ELSE
'check for blank to the right
IF countx <> 3 THEN 'check for out of bounds
IF b(countx + 1,county)=0 THEN SWAP b(countx + 1,county),b(countx,county):  FifteenRedraw : GOTO checkdone
END IF
'check for blank to the left
IF countx <> 0 THEN 'check for out of bounds
IF b(countx - 1,county)=0 THEN SWAP b(countx - 1,county),b(countx,county):  FifteenRedraw : GOTO checkdone
END IF
'check for blank down
IF county <> 3 THEN 'check for out of bounds
IF b(countx,county + 1)=0 THEN SWAP b(countx,county + 1),b(countx,county):  FifteenRedraw : GOTO checkdone
END IF
'check for blank up
IF county <> 0 THEN 'check for out of bounds
IF b(countx,county - 1)=0 THEN SWAP b(countx ,county - 1),b(countx,county):  FifteenRedraw : GOTO checkdone
END IF
END IF
checkdone:

CASE %IDM_FILE_NEW
InitGame
MakeRandomBoard
FifteenRedraw

CASE %IDM_FILE_EXIT
DIALOG END CBHNDL , 0

END SELECT
END SELECT
END FUNCTION

SUB FifteenRedraw
LOCAL countx AS LONG
LOCAL county AS LONG
LOCAL mycolor AS LONG
LOCAL offset AS LONG

GRAPHIC CLEAR %WHITE

GRAPHIC COLOR %BLACK, %WHITE
GRAPHIC BOX (0, 0) - (500, 500)
GRAPHIC LINE (125, 0) - (125, 500)
GRAPHIC LINE (250, 0) - (250, 500)
GRAPHIC LINE (375, 0) - (375, 500)
GRAPHIC LINE (0, 125) - (500, 125)
GRAPHIC LINE (0, 250) - (500, 250)
GRAPHIC LINE (0, 375) - (500, 375)

GRAPHIC FONT "Times New Roman", 36, 0

FOR county=0 TO 3
FOR countx = 0 TO 3
IF b(countx,county) < 10 THEN offset = 20 ELSE offset = 5
GRAPHIC COLOR s(b(countx,county)).theColor, s(b(countx,county)).theBackGround
GRAPHIC SET POS (125 * countx + 30 + offset, 125 * county + 35 )
GRAPHIC PRINT s(b(countx,county)).theLabel
NEXT countx
NEXT county

GRAPHIC REDRAW
END SUB

FUNCTION AttachMENU1(BYVAL hDlg AS DWORD) AS DWORD

LOCAL hPopUp1 AS DWORD

END FUNCTION

FUNCTION ShowFifteen(BYVAL hParent AS DWORD) AS LONG
LOCAL lRslt AS LONG

DIALOG NEW PIXELS, hParent, "Fifteen Puzzle", 70, 70, 510, 525, TO hDlg

CONTROL ADD GRAPHIC, hDlg, %IDC_FIFTEEN, "", 5, 0, 500, 500, %SS_NOTIFY
CONTROL HANDLE hDlg,%IDC_FIFTEEN TO hBoard

GRAPHIC ATTACH hDlg, %IDC_FIFTEEN, REDRAW