السلام عليكم كيف الحال اخواني انشاء الله بخير اليوم انشاء الله راح نسوي لعبة 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 لازم يكونوا في نفس المكان.
اخوكم Robatic .....
Hosted by www.Geocities.ws

1