اكنون به معرفي دو ريداد مي پردازم كه اولي تصاوير را درون Imageها لود مي كند و ديگري آنهار را به ترتيبي كه گفته شد مرتب مي‌كند . توجه كنيد كه شما بايد متغيرهاي بكار رفته در رويدادها را در قسمت عمومي تعريف كنيد ( اكثر متغيرها از نوع Integer مي باشند )

 

تعريف متغرها :

Dim I As Integer, J As Integer, N As Integer

Dim L As Integer, T As Integer 'L is Left , T is Top

Dim Msg As Integer, blnMove As Boolean, blnSolve As Boolean, blnEnd As Boolean

 

رويداد لود تصاوير :

Private Sub LoadImages()

    For I = 1 To 15

        imgNum(I - 1).Picture = LoadPicture(App.Path + "\img\" + Trim$(Str$(I)) + ".jpg")

    Next I

    imgBlank.Picture = LoadPicture(App.Path + "\img\Blank.jpg")

End Sub

 

رويداد چينش Imageها:

Private Sub ArrangeImages()

    T = 0

    L = 0

    imgBlank.Top = 180

    imgBlank.Left = 180

    For I = 1 To 15

        imgNum(I - 1).Top = T

        imgNum(I - 1).Left = L

        L = L + 60

        If I Mod 4 = 0 Then L = 0: T = T + 60

    Next I

End Sub

اكنون مي‌خواهم رويداد مهم ديگري را معرفي كنم كه باعث به هم ريختن تصاوير براي شروع بازي مي شود ؛ اين رويداد نياز به يك تايمر دارد تا تصاوير را به صورت متحرك به هم بريزد( البته شما مي توانيد از يك جلقه For نيز به جاي Timer استفاده كنيد كه در اين صورت به هم ريختن تصاوير به صورت يكباره و نه متحرك انجام مي‌شود )

Private Sub tmrMove_Timer()

Repeat:

    I = Int(Rnd * 15)

    If I = J Then GoTo Repeat

    If imgNum(I).Left = imgBlank.Left Then

       If imgNum(I).Top = imgBlank.Top + 60 Or imgNum(I).Top = imgBlank.Top - 60 Then

          T = imgBlank.Top

          imgBlank.Top = imgNum(I).Top

          imgNum(I).Top = T

          blnMove = True

       End If

    End If

    If imgNum(I).Top = imgBlank.Top Then

       If imgNum(I).Left = imgBlank.Left - 60 Or imgNum(I).Left = imgBlank.Left + 60 Then

          L = imgBlank.Left

          imgBlank.Left = imgNum(I).Left

          imgNum(I).Left = L

          blnMove = True

       End If

    End If

    If blnMove = True Then

       N = N + 1

       J = I

      Else

       GoTo Repeat

    End If

    blnMove = False

    If N = 87 Then tmrMove.Enabled = False: EnabledObjects (True)

End Sub

همانطور كه مشاهده كرديد نام تايمر tmrMove است ، Interval=100  و Enabled=False است . به دليل طولاني بودن توضيحات از ارائه آن پرهيز مي‌كنم و لي به اين بسنده مي‌كنم كه رويداد فوق با توليد عددي تصادفي بين 0 تا 14 شماره عكسي را كه بايد جابجا شود را مي يابد و در صورتي آنرا با عكس خالي(imgBlank) جابجا مي‌كند كه 1- آن عكس در مجاورت imgBlank باشد 2- آن عكس عكس جابجا شده قبلي نباشد .

شما بايد يك دكمه با نام cmdNew و Caption="New"  روي فرم قرار دهيد و اين رويدادها را از درون رويداد كليك دكمه New فراخواني كنيد :

Private Sub cmdNew_Click()

    blnEnd = False

    blnMove = False

    blnSolve = False

    LoadImages

    ArrangeImages

    N = 0

    J = 15

    tmrMove.Enabled = True

End Sub

 

شما براي انجام بازي بايد روي Imageها كليك كنيد كه كد آن چنين است :

Private Sub imgNum_Click(Index As Integer)

    If imgNum(Index).Left = imgBlank.Left Then

       If imgNum(Index).Top = imgBlank.Top + 60 Or imgNum(Index).Top = imgBlank.Top - 60 Then

          T = imgBlank.Top

          imgBlank.Top = imgNum(Index).Top

          imgNum(Index).Top = T

          CheckSolve

       End If

    End If

    If imgNum(Index).Top = imgBlank.Top Then

       If imgNum(Index).Left = imgBlank.Left - 60 Or imgNum(Index).Left = imgBlank.Left + 60 Then

          L = imgBlank.Left

          imgBlank.Left = imgNum(Index).Left

          imgNum(Index).Left = L

          CheckSolve

       End If

    End If

End Sub

عملكرد اين رويداد بدين صورت است كه با كليك روي هر عدد ( Imageهايي كه حاوي اعداد هستند يعني imgNum(0) تا imgNum(15)  ) در صورتيكه مجاور خانه خالي باشند ( يعني imgBlank  ) اقدام به جابجا كردن خانه مورد نظر با خانه خالي مي كند . همانطور كه در رويداد فوق مشاهده كرديد پس از انجام موفقيت آميز جابجايي رويدادي با نام CheckSolve فراخواني مي شود كه حل شدن بازي را كنترل مي كند يعني پس از هر بار حركت شروع به كنترل كردن جاي شماره ها مي كند تا پايان بازي تشخيص داده شود . رويداد CheckSolve به صورت زير است :

Private Sub CheckSolve()

    T = 0

    L = 0

    For I = 1 To 15

        If imgNum(I - 1).Top <> T Or imgNum(I - 1).Left <> L Then Exit Sub

        L = L + 60

        If I Mod 4 = 0 Then L = 0: T = T + 60

    Next I

    Msg = MsgBox("CONGRATULATION !!You solve the Puzzel!!Do you want to Play Again ?", vbYesNo,    "Win")

   If Msg = 6 Then  cmdNew_Click

End Sub

عملكرد رويداد CheckSolve بدين صورت است كه جايگاه ( يعني Top و Left ) تمامي تصاوير را از ابتدا چك مي كند و اگر هر كدام در جاي خود قرار نداشت از رويداد خارج خواهد شد و در صورت صحيح بودن جايگاه همه تصاوير ، پيغامي مبني بر اتمام بازي و برنده شدن شما نمايش داده خواهد شد . با كمي دقت مشاهده مي كنيد كه اين رويداد  عملكردي مشابه عملكرد رويداد Arrange دارد .

مي توانيد براي بازي خود يك تايمر و شمارنده قرار دهيد تا زمان سپري شده و همچنين تعداد جابجاييها را محاسبه كند .

همچنين مي توانيد يك دكمه با نام cmdSolve قرار دهيد تا تصاوير را با استفاده از رويداد Arrange مرتب كند و بازي را براي ما حل كند . شما مي توانيد رويدا cmdNew_Click را در رويداد Form_Load قرار دهيد تا به محض اجراي بازي ، بازي جديد شروع شو د .

با آرزوي توفيق براي شما .

پيغام تكراري آخر مبحث :

" ضمنا كامنت يادتان نرود چون كامنتهاي شما كمك فراواني به من و در نهايت به خود شما و سايرين مي كند . لازم به ذكر است كه كليه كامنتها ( نظرات ) شما يه صورت خصوصي بدست من مي رسد و در صورت مفيد بودن براي سايرين ، آنرا روي وبلاگ قرار مي دهم . "