Столкнулся с тем, что накачав кучу исходников этой игры, поразился  непроработанностью и ошибками.
Первая версия, что я скачал прекрасно функционировала, но не было алгоритма первоначального запутывания
позиции, всё время первоначальная позиция была одна и та же.
Во всех других исходниках, генерация позиций присутствовала, но была медленной и не гарантировала того, что
эта позиция разрешимая. А в одном из исходников кроме всего прочего ещё и алгоритм перестановки страдал.
Первым делом я написал алгоритм генерации, он предельно простой, заключается в перестановке троек по вертикале и горизонтале,
можно в случайном порядке переставлять тройки, главное, чтобы в этой перестановке не учавствовала пустышка.
Затем я взял уже готовый алгоритм перестановки, только убрал дефект, довёл его до ума, и получилась хорошая игрушка, с неплохим дизайном.

На форме надо создать масив из 16 ляблей индексы проставить от 0 до 15, они делаются в виде квадратиков, установить размер шрифта 24 или больше ( в зависимости от размера лябля)
Ещё установить кнопку старта и ляблю куда счёт будет выводиться.
Вот код програмульки.:
Option Explicit
Dim ap(1 To 4, 1 To 4) As Integer
Dim x1, z1, i, j, k, l, vv, nn, mm, ct As Integer


Private Sub Command1_Click()
ct = 0
Randomize

For i = 1 To 4
For j = 1 To 4
ap(i, j) = mm
mm = mm + 1
Next j
Next i
mm = 1

For j = 1 To 21
nn = Int(Rnd * 2) + 1
vv = Int(Rnd * 2) + 1
k = Int(Rnd * 4) + 1
l = Int(Rnd * 4) + 1
If nn > 1 And k < 4 Then x1 = ap(k, 2): ap(k, 2) = ap(k, 4): ap(k, 4) = ap(k, 3): ap(k, 3) = x1
If vv > 1 And l < 4 Then z1 = ap(2, l): ap(2, l) = ap(4, l): ap(4, l) = ap(3, l): ap(3, l) = z1
If nn = 1 Then x1 = ap(k, 1): ap(k, 1) = ap(k, 3): ap(k, 3) = ap(k, 2): ap(k, 2) = x1
If vv = 1 Then z1 = ap(1, l): ap(1, l) = ap(3, l): ap(3, l) = ap(2, l): ap(2, l) = z1
Next j

Label1(0).Caption = ap(1, 1)
Label1(1).Caption = ap(1, 2)
Label1(2).Caption = ap(1, 3)
Label1(3).Caption = ap(1, 4)
Label1(4).Caption = ap(2, 1)
Label1(5).Caption = ap(2, 2)
Label1(6).Caption = ap(2, 3)
Label1(7).Caption = ap(2, 4)
Label1(8).Caption = ap(3, 1)
Label1(9).Caption = ap(3, 2)
Label1(10).Caption = ap(3, 3)
Label1(11).Caption = ap(3, 4)
Label1(12).Caption = ap(4, 1)
Label1(13).Caption = ap(4, 2)
Label1(14).Caption = ap(4, 3)
Label1(15).Caption = ap(4, 4)
For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
Command1.Visible = False

End Sub

Private Sub Form_Load()
Form1.Label2.Caption = 0
mm = 1
End Sub

Private Sub testir()
ct = ct + 1
Form1.Label2.Caption = ct

If Form1.Label1(0).Caption <> "1" Then Exit Sub
If Form1.Label1(1).Caption <> "2" Then Exit Sub
If Form1.Label1(2).Caption <> "3" Then Exit Sub
If Form1.Label1(3).Caption <> "4" Then Exit Sub
If Form1.Label1(4).Caption <> "5" Then Exit Sub
If Form1.Label1(5).Caption <> "6" Then Exit Sub
If Form1.Label1(6).Caption <> "7" Then Exit Sub
If Form1.Label1(7).Caption <> "8" Then Exit Sub
If Form1.Label1(8).Caption <> "9" Then Exit Sub
If Form1.Label1(9).Caption <> "10" Then Exit Sub
If Form1.Label1(10).Caption <> "11" Then Exit Sub
If Form1.Label1(11).Caption <> "12" Then Exit Sub
If Form1.Label1(12).Caption <> "13" Then Exit Sub
If Form1.Label1(13).Caption <> "14" Then Exit Sub
If Form1.Label1(14).Caption <> "15" Then Exit Sub
If Form1.Label1(15).Caption <> "16" Then Exit Sub

If ct < 200 Then
MsgBox ("You win " & ct & " GOLD"), vbOKOnly, "Start"
Else
MsgBox ("You win " & ct), vbOKOnly, "Start"
End If
Command1.Visible = True

End Sub

Private Sub Label1_Click(Index As Integer)
Dim i As Integer
Dim Str As String

For i = 0 To 15
Label1(i).Visible = True
Next

On Error GoTo 1

If Index > 0 And Index - 1 <> 3 And Index - 1 <> 7 And Index - 1 <> 11 Then
If Label1(Index - 1).Caption = "16" Then
Str = Label1(Index).Caption
Label1(Index).Caption = "16"
Label1(Index - 1).Caption = Str
For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
testir
Exit Sub
End If
End If

1
On Error GoTo 2

If Index < 15 And Index + 1 <> 4 And Index + 1 <> 8 And Index + 1 <> 12 Then
If Label1(Index + 1).Caption = "16" Then
Str = Label1(Index).Caption
Label1(Index).Caption = "16"
Label1(Index + 1).Caption = Str
For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
testir
Exit Sub
End If
End If

2
On Error GoTo 3

If Index > 3 Then
If Label1(Index - 4).Caption = "16" Then
Str = Label1(Index).Caption
Label1(Index).Caption = "16"
Label1(Index - 4).Caption = Str
For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
testir
Exit Sub
End If
End If

3
On Error GoTo 4

If Index < 12 Then
If Label1(Index + 4).Caption = "16" Then
Str = Label1(Index).Caption
Label1(Index).Caption = "16"
Label1(Index + 4).Caption = Str
For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
testir
Exit Sub
End If
End If

4

For i = 0 To 15
If Label1(i).Caption = "16" Then Label1(i).Visible = False
Next
End Sub