خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را
پروژه دانشجویی رایگان : بازی جورچین
در این آموزش یک پروژه بازی تحت ویندوز که با زبان برنامه نویسی VB.NET طراحی شده است ارائه می دهیم. البته توضیحاتی نیز در مورد کدهای مختلف این پروژه و الگوریتم های آن ارائه می دهیم تا اگر تمایل داشتید با هر زبان برنامه نویسی دیگر نیز این پروژه را طراحی کنید، امکانش را داشته باشید. در قدم اول از فایل اجرایی برنامه و چگونگی اجرای برنامه شروع می کنیم.
برای دانلود سورس کد این پروژه بر روی لینک زیر کلیک کنید :
➊ بعد از اینکه این بازی را اجرا کنید صفحه زیر را خواهید دید که محیط اصلی اجرای بازی جورچین می باشد.
➋ بر روی منوی "بازی جورچین" کلیک کنید و سپس "مرحله یک" را انتخاب نمایید.
➌ محیط اجرای بازی نمایش داده می شود.
➍ در قسمت "انتخاب تصویر" می توانید از بین گزینه های موجود تصویر دیگری را نیز انتخاب نمایید.
➎ با کلیک بر هر روی هر تکه از پازل، آن تکه به سمت خانه خالی کنار آن حرکت می کند و در واقع جابجا می شود. در نهایت با انجام این جابجایی ها باید تصویر را مشابه راهنمای آن که در سمت راست آمده است، تکمیل نمایید.
➏ بعد از اینکه تصویر را تکمیل کنید، به صورت اتوماتیک آن یک تکه خالی هم پر می شود و آهنگی برای شما پخش می شود. همچنین رکورد زمانی شما نیز در پایین صفحه درج می شود.
➐ بعد از اتمام بازی می توانید با کلیک بر روی دکمه "بازی جدید"، بازی را مجددا از نو شروع کنید.
برای چینش تصاویر از یکسری Label استفاده کرده ایم و در واقع به تعداد 9 کنترل Label دقیقا در خانه های 1 تا 9 چیده ایم. هنگامیکه در برنامه می خواهیم محل تصاویر را تعیین کنیم و یا تصاویر را حرکت بدهیم، از ویژگی Location این Label ها استفاده کرده ایم.
به کدهای زیر توجه کنید، رویه ResetPicturesPositions کار ایجاد یک بازی جدید را انجام می دهد :
همانطور که می بینید، به این شکل موقعیت PictureBox ها را از روی موقعیت Label ها گرفته ایم. ضمن اینکه از ویژگی Tag در کنترلهای Label نیز در طول بازی استفاده کرده ایم. در بخشی از این کد کنترل Timer را آغاز می کنیم.
تکه کد زیر، هنگام کلیک بر روی تصاویر فراخوانی می گردد :
نکته اول در مورد این تکه کد اینست که با استفاده از فراخوانی رویداد Click سایر کنترل های PictureBox همه را در یک رویه مجتمع کرده ایم. یعنی کاربر روی هر کدام از تصاویر که کلیک کند برنامه شما وارد این تکه کد می شود.
در خط اول این کد یک کنترل Label با نام nullLabel معرفی شده است و توسط یک Function با نام ReturnNullLabel مقدار دهی شده است. بیایید نگاهی به فانکشن مربوطه بیندازیم :
فانکشن ReturnNullLabel کار ساده ای را انجام می دهد. این فانکشن تک تک کنترلهای Label را بررسی می کند و هر کدام از آنها که مقدار ویژگی تگ آن برابر با 1 باشد، برمیگرداند.
سپس یک خط کد شرطی وجود دارد که توسط آن بررسی می شود که آیا کنترل PictureBox مربوطه امکان حرکت دارد و یا نه. در واقع بررسی به این شکل انجام می شود که اگر یکی از خانه های اطراف آن کنترل PictureBox خالی باشد، امکان حرکت به آن خانه را خواهد داشت. این بررسی توسط فانکشن IsPicCanMove انجام می شود. این فانکشن یک ورودی دارد که ورودی آن همان کنترل PictureBox ای می باشد که روی آن کلیک صورت گرفته است.
اگر خروجی فانکشن IsPicCanMove مقدار True باشد اتفاق های بعدی می افتد. اولی کار اینست که صدایی پخش می شود که صدای حرکت تصویر می باشد. این کار توسط فانکشن playMoveSound صورت می پذیرد. در ادامه این فانکشن را می بینید :
فانکشن playMoveSound با استفاده از متد Play در Audio که جزء کلاسهای پیش فرض موجود در دات نت می باشد، عملیات پخش صدا را انجام می دهد. فایلهای صوتی مربوطه در مسیر برنامه موجود می باشند.
بعد از انجام کارهای بالا ابتدا ویژگی Tag مربوط به کنترل خالی با تصویر فعلی که قرار است جابجا شود، تغییر می کند، تا در مراجعات بعدی تشخیص کنترل Label خالی توسط نرم افزار ساده تر صورت پذیرد. سپس با استفاده از ویژگی Location محل قرار گیری تصویر به کنترل خالی منتقل می شود.
در هر بار کلیک شما بر روی تصاویر رویه IsGameWin فراخوانی می شود. کار این رویه اینست که بررسی کند که آیا بازی خاتمه یافته است و همه تصاویر به درستی چیده شده اند یا نه. در صورت تکمیل بازی صدای نهایی برنده شدن در بازی پخش می گردد و تصویر نیز کامل می شود.
دانلود پروژه
برای دانلود سورس کد این پروژه بر روی لینک زیر کلیک کنید :
آموزش کار با بازی جورچین
➊ بعد از اینکه این بازی را اجرا کنید صفحه زیر را خواهید دید که محیط اصلی اجرای بازی جورچین می باشد.
➋ بر روی منوی "بازی جورچین" کلیک کنید و سپس "مرحله یک" را انتخاب نمایید.
➌ محیط اجرای بازی نمایش داده می شود.
➍ در قسمت "انتخاب تصویر" می توانید از بین گزینه های موجود تصویر دیگری را نیز انتخاب نمایید.
➎ با کلیک بر هر روی هر تکه از پازل، آن تکه به سمت خانه خالی کنار آن حرکت می کند و در واقع جابجا می شود. در نهایت با انجام این جابجایی ها باید تصویر را مشابه راهنمای آن که در سمت راست آمده است، تکمیل نمایید.
➏ بعد از اینکه تصویر را تکمیل کنید، به صورت اتوماتیک آن یک تکه خالی هم پر می شود و آهنگی برای شما پخش می شود. همچنین رکورد زمانی شما نیز در پایین صفحه درج می شود.
➐ بعد از اتمام بازی می توانید با کلیک بر روی دکمه "بازی جدید"، بازی را مجددا از نو شروع کنید.
کد مربوط به ایجاد بازی جدید
برای چینش تصاویر از یکسری Label استفاده کرده ایم و در واقع به تعداد 9 کنترل Label دقیقا در خانه های 1 تا 9 چیده ایم. هنگامیکه در برنامه می خواهیم محل تصاویر را تعیین کنیم و یا تصاویر را حرکت بدهیم، از ویژگی Location این Label ها استفاده کرده ایم.
به کدهای زیر توجه کنید، رویه ResetPicturesPositions کار ایجاد یک بازی جدید را انجام می دهد :
Private Sub ResetPicturesPositions()
'ایجاد بازی جدید
pic1.Location = lbl8.Location
pic2.Location = lbl7.Location
pic3.Location = lbl6.Location
pic4.Location = lbl5.Location
pic5.Location = lbl4.Location
pic6.Location = lbl3.Location
pic7.Location = lbl2.Location
pic8.Location = lbl1.Location
pic1.Visible = True
pic2.Visible = True
pic3.Visible = True
pic4.Visible = True
pic5.Visible = True
pic6.Visible = True
pic7.Visible = True
pic8.Visible = True
lbl1.Tag = "0"
lbl2.Tag = "0"
lbl3.Tag = "0"
lbl4.Tag = "0"
lbl5.Tag = "0"
lbl6.Tag = "0"
lbl7.Tag = "0"
lbl8.Tag = "0"
lbl9.Tag = "1"
PicHelp.Left = (lbl3.Left + lbl3.Width) + 10
lblSecond.Text = "0"
Timer1.Start()
End Sub
'ایجاد بازی جدید
pic1.Location = lbl8.Location
pic2.Location = lbl7.Location
pic3.Location = lbl6.Location
pic4.Location = lbl5.Location
pic5.Location = lbl4.Location
pic6.Location = lbl3.Location
pic7.Location = lbl2.Location
pic8.Location = lbl1.Location
pic1.Visible = True
pic2.Visible = True
pic3.Visible = True
pic4.Visible = True
pic5.Visible = True
pic6.Visible = True
pic7.Visible = True
pic8.Visible = True
lbl1.Tag = "0"
lbl2.Tag = "0"
lbl3.Tag = "0"
lbl4.Tag = "0"
lbl5.Tag = "0"
lbl6.Tag = "0"
lbl7.Tag = "0"
lbl8.Tag = "0"
lbl9.Tag = "1"
PicHelp.Left = (lbl3.Left + lbl3.Width) + 10
lblSecond.Text = "0"
Timer1.Start()
End Sub
همانطور که می بینید، به این شکل موقعیت PictureBox ها را از روی موقعیت Label ها گرفته ایم. ضمن اینکه از ویژگی Tag در کنترلهای Label نیز در طول بازی استفاده کرده ایم. در بخشی از این کد کنترل Timer را آغاز می کنیم.
کد مربوط به کلیک روی تصاویر
تکه کد زیر، هنگام کلیک بر روی تصاویر فراخوانی می گردد :
Private Sub pic1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles pic1.Click, pic2.Click, pic3.Click, pic4.Click, pic5.Click, pic6.Click, pic7.Click, pic8.Click
'------------------------------------
'حركت تصاوير به جاي خالي
Dim nullLabel As Label = ReturnNullLabel()
If IsPicCanMove(sender) = True Then
playMoveSound("WHOOSH.WAV")
nullLabel.Tag = "0"
Dim AcoardingLabel As Label = ReturnAcoardinLabel(sender)
AcoardingLabel.Tag = "1"
sender.location = nullLabel.Location
End If
IsGameWin()
'--------------------------------
End Sub
Handles pic1.Click, pic2.Click, pic3.Click, pic4.Click, pic5.Click, pic6.Click, pic7.Click, pic8.Click
'------------------------------------
'حركت تصاوير به جاي خالي
Dim nullLabel As Label = ReturnNullLabel()
If IsPicCanMove(sender) = True Then
playMoveSound("WHOOSH.WAV")
nullLabel.Tag = "0"
Dim AcoardingLabel As Label = ReturnAcoardinLabel(sender)
AcoardingLabel.Tag = "1"
sender.location = nullLabel.Location
End If
IsGameWin()
'--------------------------------
End Sub
نکته اول در مورد این تکه کد اینست که با استفاده از فراخوانی رویداد Click سایر کنترل های PictureBox همه را در یک رویه مجتمع کرده ایم. یعنی کاربر روی هر کدام از تصاویر که کلیک کند برنامه شما وارد این تکه کد می شود.
در خط اول این کد یک کنترل Label با نام nullLabel معرفی شده است و توسط یک Function با نام ReturnNullLabel مقدار دهی شده است. بیایید نگاهی به فانکشن مربوطه بیندازیم :
Private Function ReturnNullLabel() As Label
'کنترل برچسب خالي را برميگرداند
If lbl1.Tag = 1 Then
Return lbl1
Exit Function
End If
'--------------------------
If lbl2.Tag = 1 Then
Return lbl2
Exit Function
End If
'--------------------------
If lbl3.Tag = 1 Then
Return lbl3
Exit Function
End If
'--------------------------
If lbl4.Tag = 1 Then
Return lbl4
Exit Function
End If
'--------------------------
If lbl5.Tag = 1 Then
Return lbl5
Exit Function
End If
'--------------------------
If lbl6.Tag = 1 Then
Return lbl6
Exit Function
End If
'--------------------------
If lbl7.Tag = 1 Then
Return lbl7
Exit Function
End If
'--------------------------
If lbl8.Tag = 1 Then
Return lbl8
Exit Function
End If
'--------------------------
If lbl9.Tag = 1 Then
Return lbl9
Exit Function
End If
'--------------------------
Return Nothing
End Function
'کنترل برچسب خالي را برميگرداند
If lbl1.Tag = 1 Then
Return lbl1
Exit Function
End If
'--------------------------
If lbl2.Tag = 1 Then
Return lbl2
Exit Function
End If
'--------------------------
If lbl3.Tag = 1 Then
Return lbl3
Exit Function
End If
'--------------------------
If lbl4.Tag = 1 Then
Return lbl4
Exit Function
End If
'--------------------------
If lbl5.Tag = 1 Then
Return lbl5
Exit Function
End If
'--------------------------
If lbl6.Tag = 1 Then
Return lbl6
Exit Function
End If
'--------------------------
If lbl7.Tag = 1 Then
Return lbl7
Exit Function
End If
'--------------------------
If lbl8.Tag = 1 Then
Return lbl8
Exit Function
End If
'--------------------------
If lbl9.Tag = 1 Then
Return lbl9
Exit Function
End If
'--------------------------
Return Nothing
End Function
فانکشن ReturnNullLabel کار ساده ای را انجام می دهد. این فانکشن تک تک کنترلهای Label را بررسی می کند و هر کدام از آنها که مقدار ویژگی تگ آن برابر با 1 باشد، برمیگرداند.
سپس یک خط کد شرطی وجود دارد که توسط آن بررسی می شود که آیا کنترل PictureBox مربوطه امکان حرکت دارد و یا نه. در واقع بررسی به این شکل انجام می شود که اگر یکی از خانه های اطراف آن کنترل PictureBox خالی باشد، امکان حرکت به آن خانه را خواهد داشت. این بررسی توسط فانکشن IsPicCanMove انجام می شود. این فانکشن یک ورودی دارد که ورودی آن همان کنترل PictureBox ای می باشد که روی آن کلیک صورت گرفته است.
Private Function IsPicCanMove(ByVal picName As PictureBox) As Boolean
'اين روال نام كنترل تصوير را مي گيرد و مشخص مي كند كه آيا مي تواند حركت كند يا نه
Dim acordingLabel As Label
acordingLabel = ReturnAcoardinLabel(picName) 'برچسب فعال
Dim NullLabel As Label = ReturnNullLabel() 'برچسب خالي
Select Case acordingLabel.Name
Case lbl1.Name '2 , 4
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl2.Name '1,3,5
'----------------------------------
If NullLabel.Name = lbl1.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl3.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl3.Name '2,6
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl4.Name '1,5,7
'----------------------------------
If NullLabel.Name = lbl1.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl7.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl5.Name '2,4,6,8
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl6.Name '5,3,9
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl3.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl9.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl7.Name '8,4
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl8.Name '7,5,9
'----------------------------------
If NullLabel.Name = lbl7.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl9.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl9.Name '8,6
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
End Select
'------------------------------------
Return False
End Function
'اين روال نام كنترل تصوير را مي گيرد و مشخص مي كند كه آيا مي تواند حركت كند يا نه
Dim acordingLabel As Label
acordingLabel = ReturnAcoardinLabel(picName) 'برچسب فعال
Dim NullLabel As Label = ReturnNullLabel() 'برچسب خالي
Select Case acordingLabel.Name
Case lbl1.Name '2 , 4
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl2.Name '1,3,5
'----------------------------------
If NullLabel.Name = lbl1.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl3.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl3.Name '2,6
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl4.Name '1,5,7
'----------------------------------
If NullLabel.Name = lbl1.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl7.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl5.Name '2,4,6,8
'----------------------------------
If NullLabel.Name = lbl2.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl6.Name '5,3,9
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl3.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl9.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl7.Name '8,4
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl4.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl8.Name '7,5,9
'----------------------------------
If NullLabel.Name = lbl7.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl5.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl9.Name Then
Return True
Exit Function
End If
'----------------------------------
Case lbl9.Name '8,6
'----------------------------------
If NullLabel.Name = lbl8.Name Then
Return True
Exit Function
End If
'----------------------------------
If NullLabel.Name = lbl6.Name Then
Return True
Exit Function
End If
'----------------------------------
End Select
'------------------------------------
Return False
End Function
اگر خروجی فانکشن IsPicCanMove مقدار True باشد اتفاق های بعدی می افتد. اولی کار اینست که صدایی پخش می شود که صدای حرکت تصویر می باشد. این کار توسط فانکشن playMoveSound صورت می پذیرد. در ادامه این فانکشن را می بینید :
Private Sub playMoveSound(ByVal SoundFileName As String)
'پخش اهنگ موقع حركت
Try
My.Computer.Audio.Play(Application.StartupPath & "\Snd\" & SoundFileName, AudioPlayMode.WaitToComplete)
Catch ex As Exception
End Try
End Sub
'پخش اهنگ موقع حركت
Try
My.Computer.Audio.Play(Application.StartupPath & "\Snd\" & SoundFileName, AudioPlayMode.WaitToComplete)
Catch ex As Exception
End Try
End Sub
فانکشن playMoveSound با استفاده از متد Play در Audio که جزء کلاسهای پیش فرض موجود در دات نت می باشد، عملیات پخش صدا را انجام می دهد. فایلهای صوتی مربوطه در مسیر برنامه موجود می باشند.
بعد از انجام کارهای بالا ابتدا ویژگی Tag مربوط به کنترل خالی با تصویر فعلی که قرار است جابجا شود، تغییر می کند، تا در مراجعات بعدی تشخیص کنترل Label خالی توسط نرم افزار ساده تر صورت پذیرد. سپس با استفاده از ویژگی Location محل قرار گیری تصویر به کنترل خالی منتقل می شود.
در هر بار کلیک شما بر روی تصاویر رویه IsGameWin فراخوانی می شود. کار این رویه اینست که بررسی کند که آیا بازی خاتمه یافته است و همه تصاویر به درستی چیده شده اند یا نه. در صورت تکمیل بازی صدای نهایی برنده شدن در بازی پخش می گردد و تصویر نیز کامل می شود.
Private Sub IsGameWin()
If pic1.Location = lbl1.Location And pic2.Location = lbl2.Location And _
pic3.Location = lbl3.Location And pic4.Location = lbl4.Location _
And pic5.Location = lbl5.Location And pic6.Location = lbl6.Location _
And pic7.Location = lbl7.Location And pic8.Location = lbl8.Location Then
'----------------------------------
cboPics.Enabled = False
PicHelp.Location = lbl1.Location
PicHelp.BringToFront()
Timer1.Stop()
Application.DoEvents()
playMoveSound("LoopyMusic.wav")
cboPics.Enabled = True
End If
End Sub
If pic1.Location = lbl1.Location And pic2.Location = lbl2.Location And _
pic3.Location = lbl3.Location And pic4.Location = lbl4.Location _
And pic5.Location = lbl5.Location And pic6.Location = lbl6.Location _
And pic7.Location = lbl7.Location And pic8.Location = lbl8.Location Then
'----------------------------------
cboPics.Enabled = False
PicHelp.Location = lbl1.Location
PicHelp.BringToFront()
Timer1.Stop()
Application.DoEvents()
playMoveSound("LoopyMusic.wav")
cboPics.Enabled = True
End If
End Sub
نمایش دیدگاه ها (0 دیدگاه)
دیدگاه خود را ثبت کنید: