السلام عليكم كيف الحال اخواني
انشاء الله بخير اليوم انشاء الله راح نسوي لعبة snake
بسيطه جدا بس من غير food
وهذه اللعبه راح
نسويها بلغة جافا 6 او
J2SE 2....... بيني
وبينكم النسخه مهي مهمه في حالتنا ذي لانه انا ما استخدمت كلاسات
جديده زي مثلا كلاس Scanner
اول حاجه لازم نعرف
اش هي الفكره الي راح استخدمها هنا وهي عباره عن رسم مربعات لها نفس
الابعاد ولكن الي يميزها انها في احداثيات مختلفه بس بشرط تكون وراء
بعض يعني متسلسله
بحيث انه المربع
الاول لما يتغير مكانه لازم يجي بداله المربع الثاني والثاني اذا تغير
مكانه لازم ياخذ مكانه القديم المربع الثالث وهلم جرا (طابور من
المربعات)
قبل لا نبدا في عملية
الرسم خلوني اقلكك او اذكركم بانه لغة الجافا هي عباره عن لغة كلاسات
او Class-Based Language يعني ما
تقدر تسوي اي برنامج الا لازم يكون عباره عن كلاس
بمعني اخر يعني مو
زي لغة سي ++ الي عن طريقها تقدر تسوي برنامج بدون كلاس الجافا لازم
يكون عندك كلاس يحتوي على ال main method
وهذا الكلاس يسمى في الجافا
Main Class الي عن
طريقه راح نسوي run للـ application
تبعنا ..... المهم خلونا نتعرف على الثلاثة كلاسات
الي راح اسويها عشان نصمم اللعبه البسيطه وهي:
1) SnakeNode
وهذا الكلاس هو اللبنه الاساسيه للعبتنا بحيث انه
يحتوي على 3 متغيرات وهي متغيرين من نوع int
وهما x و y الي
راح استخدمهم عشان اعطي احداثيات لكل مربع
او لكل
instance انشئها من الكلاس SnakeNode
اما المتغير الثالث هو عباره عن متغير من نوع
SnakeNode من نفس نوع هذا الكلاس وراح اسميه
child وراح استخدمه عشان
اشير الى الـ
instance الي لازم تجي بعد هذي الـ instance
الي انا حاليا شغال فيها
ملاحظه: لما انا
اسوي او انشئ instance اول مره راح اخليها
تأشر على ولا حاجه يعني تأشر على null
ملاحظه: انا لما
اقول تأشر ما اقصد بكلامي هذا انه نفس العملية الي تصير في لغة سي ++
الي يسمونها الـ pointers ....... الصوره
الي تحت توضح العملية
2)
SnakeManager وهذا الكلاس هو الي مسؤول على تنظيم
عملية خليني اقول سير المربعات او الـ instances
المنشئه من الكلاس SnakeNode
وهي عبارة عن اضافة مربع جديد وتنسيق
اماكنهم بالطريقه
المذكوره فوق وهذا الكلا يحتوي على متغير واحد من نوع SnakeNode
اسمه head راح استخدمه
كدليل او index في عملية الرسم يعني هو الي
راح اغير مكانه اما باقي
المربعات راح تتغير
اماكنها حسب ما ذكر اعلاه اوتوماتيكيا. وكمان راح اعرف في هذا الكلاس
ثلاثه methods وهي اولا getLastChild
وهذي هي الي راح ترجعلي اخر مربع موجود في
الطابور, ثانيا
addChild ومن اسمها هذي راح استخدمها لإضافة
مربع جديد, ثالثا updateXY وهذي هي الي راح
تساعدني على تنظيم حركة سير المربع بحيث انه كل واحد لازم يجي في
مكان المربع الي
قبله اما المربع الي انا سميته head هو الي
راح ياخذ مكان جديد ولكن بقية المربعات راح تاخذ مكان الي قبلها
(يعني من جد طابور ولكن بحسب الاتجاه)
الصوره الي تحت تبين
العملية كلها
3) SnakeRun
وهذا الكلاس هو الكل في الكل يعني main
Class هو الي عن طريقه راح اشغل برنامجي وفيه راح
يصير الانتراكشن ما بين المستخدم والكمبيوتر وفيه راح يتم الرسم
ااو حاجه لازم اسوي
فروم زي اي فورم في لغة فيجوال بيسك ولكن هنا انا ما اقدر اسويه
بالماوس يعني لازم اكتب الكود كامل من وإلى بس بصراحة الكود مره بسيط
وكل الي ابغاه منكم
شوية تركيز وانشاء
الله نستفيد من بعض بس قبل كل شيء خولني اشرح الكد حق الكلاسين الي فوق
وهما بالترتيب SnakeNode and then SnakeManager
اول حاجه خلونا نشوف
الكود حق SnakeNode
زي ما انتوا شايفين
الكلاس هذا مره بسيط وما يلزمه شرح عباره عن تعريف متغيرات واعطاء قيم
لها واخذ قيمها حب ما نحتاج ب الي ابغى انبه عليه هو الموجود في سطر
رقم 5
انا معرف
constructor ياخذ قيمتين الي هي عباره عن مكان
المربع الي راح انشئه بس لو تلاحظوا هنا انا بشكر افتراضي خليت الـ
child هنا يساوي null
لانه انا راح اعطيه قيمه بعدين عن
طريق الكلاس
SnakeManager الي راح يديرلي الموضوع كله ......
خلونا نشوف الكود حق كلاس SnakeManager
وهنا زي مانتوا
شايفين انا معرف head من نوع
SnakeNode في السطر الثاني وهذا راح اعتبره مربع
خاص راح يفيدني ويريحني في عملية اعطاء اماكن لكل المربعات يعني تخيلوا
لو ان
مجموع المربعات 5000
مربع ولكل مربع لازم اعطي قيمه للـ x & y يعني
لازم لعطي قيمه لـ 10000 وهذه عملية مزعجه لانه لا ننسى انه الكمبيوتر
صنع عشان يسهل علينا العمليات الحسايبه
لو تلاحظوا في الـ
constructor لهذا الكلاس الي موجود في السطر
الرابع انا اعطيت قيمه ابتدائيه للـ x& y
للـ head وهي 50 عشان المربع يظهر في النقطه
(50,50) من الفروم الي راح
انشئه في الكلا
الاخير الي هو SnakeRun .... في السطر رقم 8
انا سويت method اسمها getLastChild
وهذه الميثود راح ترجعلي refrence
لآخر مربع موجود عندي ممكن يكون المربع رقم
1000 او المربع رقم 1
المهم هذا راح يفيدنا في اضافة مربع جديد ب هنا الرفرنس مش زي الـ
pointer الي في لغة سي++ لا تلخبطوا .... في
سطر 17 انا مسوي ميثود الي راح تضيفلي
مربع فعليا وراح
ارلها x & y لهذا المربع الجديد ولو تلاحظوا
في سطر رقم 18 انا استخدمت الميثود getLastChild
الي راح ترجعلي اخر مربع وراح يكون نوعه من كلاس
SnakeNode
وعن طريقه راح نخلي
الـ child له يأشر على المربع الجديد بدل ما
يأشر على null وهذا المربع الجديد الـ
child له راح ياشر بشكل افتراضي على
null زي ما شفنا في كود SnakeNode
في سطر رقم 8 من الـ
constructor ....... في سطر 21 في ميثود
اسمها updateXY وهي الي راح تساعدني
في تغير الـ x & y لكل المربعات وانا هنا
راح ارسلها الموقع الي هو عباره عن نقطه
رفرنس للمربع الحالي
الي انا ابغى اغير مكانه بنائا على المربع الي قبله يعن اول مربع راح
ارسله لها الي هو الـ head والاحداثيات الي
تبعه بس المشكله الكمبيوتر ما يفهم لا ننسى انه لسا ما زال
مجرد آله كيف هو راح
يعرف انه هذا المربع هو الـ head ولا لا ؟!
هنا تخدمنا الـ IF Statement وطريقة عمل
الميثود هذه عباره عن تخزين مكان المربع الحالي عشان نعطيه للمربع الي
بعده
وبعدين نشوف هل هذا
المربع هو الـ head ؟ اذا كان نعم غير
الرفرنس وخليها يأشر على الـ child تبع الـ
head وكمان لازم نفحص يمكن يكون احنا وصلنا
للـ child تبع اخر مربع الي هو عباره
عن null
وهذه مشكله بحد ذاتها وعشان كذا لازم استخدم
if ثانيه واشوف اذا انا فعلا وصلت لآخر شيءاوقف,
اذا لا اول شيء اخزن مكان المربع الحالي زي ما هو موجود في السطرين 30
و 31
وبعدين اغير مكان
المربع الحالي بمكان المربع الي كان قبله والي انا ارسلت مكانه للميثود
كـ parameter (سطر 33 و 34) وبعدين استدعي
نفس الميثود updateXY ولكن بدل ما ارسلها
الـ head
وموقعه ارسلها الـ child
حق المربع الحالي والموقع القديم حق المربع الحالي.... الصور الي تحت
تبين عملية اضافة مربع جديد في حالةه اذا كان الـ head
هو المربع الوحيد او اذا كان
هناك اكثر من مربع
غير الـ head
لو تلاحظوا انا هنا
بدل ما استخدم for loop في الميثود
updateXY استخدمت الـ recursion technique
مع انه الـ recursion
يستهلك الذاكره اكثر من الـ for loop ولكن
بعض الاحيان يكون افضل من الـ for loop وفي
حالتنا هذه
انا ماني عارف كم
مربع موجود حاليا في الطابور (queue) ولكن
كل الي اعرفه انه الـ child لآخر مربع
يأشر على null فلما اوصله اوقف العمليه
وبإمكانك تحل المشكله هذي بإستخدام while loop
بس يبغالك تتنبه لأول مربع الي
الـ head
...
واخر شيء الي هو الـ
SnakeRun كود وهو تقريبا اصعب كود في هذا
الدرس وهذا الكلاس هو المسؤول عن تحويل الكلام الي قلناه فوق الي
مربعات وكمان هو الي راح اسوي فيه الانتراكشن ما
بين المستخدم
والكمبيوتر وعشان اشرحه لازم ندخل مواضيع كثيره في الجافا الي هي
event handling و creating forms
و using Timer class
وميثودز كثيره جدا
وانشاء الله راح
اشرحها بالتفصيل الممل بإذن واحد احد وانشاء الله نستفيد من بعض ولا
تبخلوا علينا يا شباب وبنات... و الكود حق SnakeRunموجود
في الصوره تحت
بس الفت انتباهكم الى
انه الاسطر من 1 الى 3 مش ظاهره في الصوره الي فوق وهذه الاسطر مهمه
عشان كذا راح اكتبلكم ايها تحت بالترتيب:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
وهذي الصوره الي تحت
هي الناتج الاخير لهذه الثلاث كلاسات
هذا الخط الاخضر الي
فوق هو عباره عن مربعات كثيره بس لو تلاحظوا من الشكل الي فوق كل مربع
ياخذ مكان المربع الي قبله وإلى الان اللعبه ماهي كامله لانه ناقصها
شيء وحد
ناقصها كلاس نسويه
ونسميه Food وهو راح يكون مسؤول عن النقاط او الطعم الي لازم نصيده
وراح يكون سهل جدا وانشاء الله في الدرس الجاي راح نكمل البرنامج
ملاحظه: لازم نخزن كل
الكلاسات في نفس الفلودر او الـ path يعني
مثلا ما يصير نخزن كود كلاس SnakeNode
في الـ D وكود كلاس
SnakeRun في الـ C
لازم يكونوا في نفس المكان.