یک بازی ( بازی پازل )
اكنون به معرفي دو ريداد مي پردازم كه اولي تصاوير را درون 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 قرار دهيد تا به محض اجراي بازي ، بازي جديد شروع شو د .
با آرزوي توفيق براي شما .
پيغام تكراري آخر مبحث :
" ضمنا كامنت يادتان نرود چون كامنتهاي شما كمك فراواني به من و در نهايت به خود شما و سايرين مي كند . لازم به ذكر است كه كليه كامنتها ( نظرات ) شما يه صورت خصوصي بدست من مي رسد و در صورت مفيد بودن براي سايرين ، آنرا روي وبلاگ قرار مي دهم . "