تبليغاتX
آموزش ويژوال بيسيك و برنامه های موبایل
پاسخ به سوال آقاي رضا.ر (بازي Snake)

 

با سلام

در اين پست  مي خواهم ساختن Snake  يا همان بازي معروف مار را كه آقاي رضا.ر  خواسته بودند (در ضمن گفته بودند كه سورس نباشه و آموزش بدين)  به طور تقريبا كامل آموزش دهم .

 

همان طور كه ميدانيد اساس كار اين بازي ساده يك شي شبيه مار است كه كاربر سعي مي كند با كنترل آن طعمه هايي كه در مسير وجود دارد را بگيرد (به اصطلاح بخورد )  و امتياز كسب كند .

 

ما به عنوان برنامه نويس اين بازي ساده بايد چند چيز را طراحي كنيم :

 

1 – كادري كه مار درون آن حركت كند و اگر به ديواره آن برخورد كند  برنامه پيامي مبني بر باخت كاربر اعلام نمايد .

 

2 – يك شي شبيه مار كه كاربر با كليدهاي جهت دار بتواند آن را كنترل كند .

 

3 – طعمه اي كه به صورت تصادفي روي صفحه نمايش داده شود و كاربر بتواند آن را بگيرد و بر امتيازات او افزوده شود .

 

4 – قسمتي از برنامه كه امتياز كاربر  را نمايش دهد .

 

 

حال به صورت يك پروژه مراحل ساخت اين بازي ساده را با هم دنبال مي كنيم :

 

يك پروژه جديد با يك فرم ايجاد نماييد .

 

شما بايد اندازه فرم را به هر اندازه اي كه مايليد صفحه بازي شما باشد و كاربر در آن مار را حركت دهد  تغيير دهيد .

 

براي اينكه بتوانيم اندازه فرم را به درستي تعين كنيم  كمي درباره سيستم مختصات در ويژوال بيسيك توضيح مي دهم .

در ويژوال بيسيك ارتفاع و پهنا اشيا به ترتيب با مشخصه هاي  Height  و   Width تعين مي شود .

فاصله شي از سمت چپ فرم را خاصيت Left  و فاصله شي از بالاي فرم را خاصيت Top  تعين ميكند. هر چه شي به سمت پايين حركت كند خاصيت Top  آن بيشتر مي شود و هرچه  شي به سمت راست حركت كند خاصيت Left آن بيشتر مي شود .

 

حال كه با سيستم مختصات بيشتر آشنا شديم مي توانيم اندازه فرم را مشخص كنيم. ابتدا بايد از يك شي به عنوان مار استفاده كنيم كه مي توانيم از Image  و Picture  استفاده كنيم اما براي ساده تر شدن برنامه از كنترل Shape  استفاده مي كنيم . از جعبه ابزار يك كنترل Shape   بر روي فرم قرار دهيد. سپس مشخصه هاي  Height  و  Width  آن را برابر 255   قرار دهيد تا يك شي مربعي داشته باشيد . نام آن را به S  تغيير دهيد و خاصيت index  آن را برابر با صفر قرار دهيد . حال خاصيت FillStyle  را برابر با  0 – Solid  قرار دهيد تا توپر شود . يك  Shape    ديگر به فرم اضافه كنيد و نام آن را به P  تغيير دهيد .و بقيه مشخصات آن را مانند كنترل Shape   قبلي تنظيم كنيد و خاصيت Visible  آن را به False تغيير دهيد تا در موقع اجراي برنامه طعمه از ديد كاربر خارج شود . اين كنترل همان طعمه خواهد بود . يك كنترل Label  به فرم اضافه نماييد و نام آن را به lblstart  تغيير دهيد . و در خاصيت Caption آن اين جمله را تايپ نماييد " براي شروع كليد Enter  را فشار دهيد " .  درپايان هم يك كنترل   Timer  با نام  Timer1  به فرم بيفزاييد و خاصيت Interval  آن را به 150 تغيير داده و خاصيت Enabled  آن را برابر False  قرار دهيد .

همه كار كرديم جز تعين ارتفاع و پهنا ي فرم . بايد ارتفاع و پهنا ي فرم را طوري تنظيم كنيم كه بر 255 بخش پذير باشد . چون مقياس ما براي حركت مار 255 است مثلا ارتفاع (Height ) فرم را به 2550   تغيير مي دهيم تا كاربر بتواند مار را تا 10 خانه به صورت عمودي حركت دهد . و پهنا (Width ) فرم را 5100  قرار مي دهيم تا كاربر بتواند مار را تا 20 خانه به صورت افقي حركت دهد .

حال كار طراحي فرم و اشيا پايان يافته است و شكل نهايي فرم بدين صورت است :

 

 

 

 در ادامه بايد به سراغ قسمت مهم برنامه يعني كدنويسي  برويم. ابتدا متغير هاي زير را در قسمت General  فرم تعريف نماييد :

 

Dim key As String

Dim gamestart As Boolean

Dim t() As Integer

Dim l() As Integer

Dim tedad As Byte

 

 

متغير Key  مشخص مي كند كه كدام كليد جهت نما فشرده شده است . متغير gamestart  مشخص مي كند كه آيا بازي در حال اجرا است و يا هنوز شروع نشده است . دو متغير t()  و   l()  كه به صورت آرايه اي تعريف شده اند مختصات تمامي Shape هايي كه در طول برنامه ساخته خواهد شد را درون خود نگه مي دارند . و متغير  tedad  نيز تعداد طعمه هايي كه كاربر گرفته است را درون خود نگه مي دارد .

 

روي فرم دابل كليك كنيد و رويداد  KeyDown  آن دستورات زير را تايپ نماييد  :

 

If KeyCode = 13 And gamestart = False Then

Key = "chap"

lblstart.Visible = False

Timer1.Enabled = True

Gamestart = True

Call Tomeh

End If

 

If gamestart = True Then

 

If KeyCode = 38 And key <> "paeen" Then

key = "bala"

End If

 

If KeyCode = 37 And key <> "chap" Then

key = "rast"

End If

 

If KeyCode = 40 And key <> "bala" Then

key = "paeen"

End If

 

If KeyCode = 39 And key <> "rast" Then

key = "chap"

End If

 

End If

 

در رويداد  KeyDown  يك متغير به نام  KeyCode  وجود دارد كه كد اسكي كليد فشار داده شده را مشخص مي كند . ما با يك شرط ساده مي فهميم كه كاربر چه كليدي را فشار داده است . در خط اول در يك شرط مشخص مي كنيم كه اگر كاربر كليد Enter را فشار داد و بازي هنوز شروع نشده بود بازي آغاز شود و  متغير  key  با مقدار  chap  مقدار دهي شود كه اين كار مشخص مي كند كه پس از شروع بازي مار به سمت چپ حركت كند . سپس متني را كه پيامش فشار دادن كليد Enter براي شروع بازي بود مخفي مي كنيم .  سپس خاصيت Enabled  كنترل Timer  را با True  مقدار دهي مي نماييم تا فعال شود .(وقتي كه كد مورد نياز را براي تايمر نوشتيم متوجه مي شويد كه تايمر وظيفه حركت كنترل ها را بر عهده دارد ) .  در خط بعد هم متغير gamestart   را  با  True  مقدار دهي كرديم تا مشخص كنيم بازي شروع شده است در پايان هم تابع Tomeh  كه در ادامه آن را بررسي مي كنيم را فراخواني مي كنيم تا طعمه در يك مكان تصادفي ظاهر شود . در خطوط بعد هم مشخص مي كنيم كه اگر بازي شروع شده بود و كاربر كليدهاي جهت نما را فشار داد مار به حركت در آيد .

 

حال روي كنترل تايمر دابل كليك كنيد و در رويداد Timer   آن دستورات زير را درج كنيد :

 

For i = 1 To tedad - 1

If s(0).Top = s(i).Top And s(0).Left = s(i).Left Then

Call bakht

End If

Next i

If key = "chap" And s(0).Left <> 4845 Then

Call harekat

Call khordan

s(0).Left = s(0).Left + 255

 

ElseIf key = "rast" And s(0).Left <> 0 Then

Call harekat

Call khordan

s(0).Left = s(0).Left - 255

 

ElseIf key = "bala" And s(0).Top <> 0 Then

Call harekat

Call khordan

s(0).Top = s(0).Top - 255

 

ElseIf key = "paeen" And s(0).Top <> 1785 Then

Call harekat

Call khordan

s(0).Top = s(0).Top + 255

 

Else

Call bakht

End If

 

اين دستورات هم واضح هستند و فقط لازم است ذكر كنم كه  bakht  و  khordan  و  harekat  هر سه توابعي هستند كه در ادامه به تعريف آنها مي خواهيم پرداخت.

 

تابع باخت كارش اين است كه در صورت برخورد مار با بدن خود و يا برخورد با بدنه فرم يك پيغام مبني بر باخت كاربر به او اعلام نمايد و امتياز او كه در عنوان فرم قرار دارد را نيز درج نمايد و سپس از بازي خارج شود . تابع زير را به همين صورت تايپ كنيد :

 

Public Sub bakht()

Timer1.Enabled = False

MsgBox ("Your Score Is =" & " " & Me.Caption)

End

End Sub

 

 

حالا تابع harekat  كه باعث حركت مار به صورت يك مار واقعي مي شود را به اين صورت تعريف نماييد :

 

Public Sub harekat()

If tedad <> 0 Then

ReDim Preserve t(tedad - 1) As Integer

ReDim Preserve l(tedad - 1) As Integer

For i = 0 To tedad - 1

t(i) = s(i).Top

l(i) = s(i).Left

Next i

 

For f = 0 To tedad - 1

s(f + 1).Top = t(f)

s(f + 1).Left = l(f)

Next f

End If

End Sub

 

در اين تابع مشخص مي كنيم كه اگر طعمه اي توسط كاربر گرفته شده بود آن طعمه را به دنبال مار بكشاند .

تابع Tomeh  نيز كارش اين است كه طعمه را در يك مكان تصادفي قرار دهد كه به صورت زير تعريف مي شود  :

 

Public Sub tomeh()

Dim rt, rl As Integer

Randomize

rt = (Rnd * 7) + 1

rl = (Rnd * 18) + 1

p.Visible = True

p.Top = Fix(rt) * (255)

p.Left = Fix(rl) * (255)

End Sub

 

كه اين تابع هم نياز به توضيح ندارد و خيلي ساده است. در پايان هم تابع  khordan را تعريف مي كنيم :

 

Public Sub khordan()

 

If p.Top = s(0).Top And p.Left = s(0).Left Then

p.Visible = False

tedad = tedad + 1

Form1.Caption = tedad * 10

Load s(tedad)

s(tedad).Visible = True

Call tomeh

End If

 

End Sub

 

كار اين تابع هم اين است كه در صورت اينكه مختصات سر مار با مختصات طعمه برابر شد طعمه مخفي شود و ما دراز تر شده و بر امتياز كار بر افزوده شود .

 

 

تمام شد به همين راحتي شما يك بازي Snake  ساخته ايد .

چون سرم خيلي شلوغ است نمي توانم دستورات برنامه را خط به خط تجزيه و تحليل كنم اما اگر سوالي در مورد هر كدام از قسمت هاي اين برنامه و يا هر سوال ديگري در مورد ويژوال بيسيك و ويندوز  داشتيد بيان كنيد تا در اسرع و قت به آن پاسخ داده شود .

در ضمن سورس اين برنامه را از  این لینک  ميتوانيد دانلود كنيد .

 

پسورد فايل هم  www.skrsoft.blogfa.com  است.

 

 

لطفا نظرات خود را در مورد مطالب اين وبلاگ بيان نماييد !

 

/ نوشته شده در پنجشنبه پانزدهم شهریور 1386 و ساعت 14:17 در ارتباط با موضوع ویژوال بیسیک |