لا يمكن نشر أي لعبة ذات لاعبین و توزيعھا دون إضافة خاصیة اللعب ضد الكومبیوتر, قد يبدو
الموضوع معقدا للوھلة الأولى و تطبیقه صعب جدا إذ أنه يعتبر ذكاءا صناعیا, لكن على
العكس, الأمر و تطبیقه لیس أصعب من برمجة اللعبة في حد ذاتھا طبعا بعد التعرف على
الألغوريتم المناسب و تعلم برمجته, و لھذا أقدم لكم ھذا الكتیب آملا أن يوضح لكم كیف تتم
العملیة.
اوتاه عق
لمستام عمد رمع عمل ,1666م ص ) 668ا طسقع0 7010
إذا, أول ما تم تعريفه, قبل تعريف الكلاس 068018, هو النوابت 0, أل (000/10ل, ... ثوابت
عادية نستعملها بدل أن نعطي لكل حالة أو لاعب رقم معين.
1 سنستخدمه في رسم الدوائر الخاصة باللاعب 0.
الكلاس 068018, بها ثلاث متغيرات, ؟*1101:80_« و لا10:80_« كل منهما سيأخذ
إحدائيات الخانة التي تم علبها الكليك بغرض رسم دائرة أو اكس بها, حسب اللاعب
«عدخ_« سيأخذ إحدى القيمتين, إما 0 أو «, سياخذ القيمة التي تمثل دور اللاعب
5616_« سيأخذ أحد القيم [10/10)ل, 01/101, //ال.088 أو 0171016 أو حالة اللعبة حاليا.
بقية الدوال الست, واضح من اسم كل دالة دورها, هذا الجدول يلخص دور كل دالة:
ع«ة65606» | تفريغ الخانات و إعادة اللعبة إلى حالتها الإبتدائية.
0851668 | رسم » أو 0 على مكان معين على الشاشة.
8 | رسم لوحة اللعبة بكل الرموز اللتي تم وضعها حاليا.
©060:9206588 | التحقفق من حالة اللعبة, فوز أحد اللاعبين أو التعادل أو
مواصلة اللعب
217 | الدالة التي تمرر الأدوار بين اللاعبين و تثبت حركة كل لاعب
الخطوة التالية, كتابة الكود الخاص بالملف 9801.080 و تعريف جسم الكلاس 66806 و
تعريف دوالها, انسخ الكود التالي على الملف؛
+ () عسدقاع عع <- نط
1- 2 لا10:60ه_«<-قنط
- دصعيط_«<-قتنطع
[] [1] 080 _س<-قنطع
- [2] [080]2ط_«<-قنط
) 0255892 ) علطام
(++ل :3 > 3 :0 - و عمناعودع
) لمسسلاف عم رمع عمل ,01668 0 ) 0720016686 : :0638 ٠7010
لسمع - 1.4 قساف + 1.4-) 91176622
(عاعامقاطع0ع عمذ) ع8 5 عسموتامعد : :عقف عصا
١ لعممقتطعمة جد [2] [0] 088 _سذ-قلط ع ععبقاطع20 د
لاح 1520018
(ه جد ععية1)201 عقاء ١
تمعد معنطوع
- 2 لقعع1ه_«<-قلطك 2 لمضاعنتك_«<-قتنطع
ما يهمنا شرحه في هذا الدرس هو الدالة لإقام, أول ما سنتحقق منه عند إستدعاء
هذه الدالة هو 1811116 -- ©+28_«, إي سنتحقق من أن اللعبة لم تنتهي.
ثم نريد أن نعرف لمن الدور حاليا, للاعب لل أو اللاعب 0, هذه المعلومة مخزنة في
المتغير ««نء_« و الذي ستكون قيمته الإبتدائية )ا حسب الدالة عة5666عع.
بعد معرفة اللاعب, نتحقق من أن الإحداتيات الموجودة في ؟10:60 سو الافععع1كه_«
صحيحة, و هذا بكون قيمها غير مساوية ل -1.
طبعا يجب أن تكون الخانة التي تم الضغط عليها من طرف اللاعب على اللوحة فارغة, أ]
أنه يجب أن تكون ؛
المناسبة على الخانة التي اختارها اللاعب ثم نمرر الدور للاعب الآخر و نتحقق من
بقي شيء واحد في هذه المرحلة, و هو كتابة محتوى الملف 1013:0.000, الملف
(1187. 61032" ,طذ1) تدعس قسودعد#
00-7 ,1.0 ,5 ماع ) لس 216 ) ,45.0) 91056150661176
)١7 لوقام <-عسة9
(7010) ممناعة 7018
سبق و ذكرت, شرح مفصل لكل هذا موجود في الدروس السابقة, ما يجب ملاحظته
المشروع بسيط جدا و سنهتم بالأساسيات فقط, لن يتم إضافة خيارات للعبة, كإعادة
اللعب و التراجع عن الحركة....الخ
يمكنك تحميل المشروع من هذا الرابط:
2. الألغوريتم *01101018
في كل دور يقوم بلعبه الحاسوب, يطبق فيه الألغوريتم *«00101018 لإيجاد أفضل حركة
ممكنة, و لإختيار أنسب الحركة, يولد البرنامج شجرة تمثل كل الحركات الممكنة مع
نتيجة كل حركة و يختار الحركة الموالية ذات أفضل نتيجة.
الدور سبقوم الحاسوب باللعب, أولا سبولد قائمة بكل الحركات الممكنة لخطوة واحدة, و
من أجل كل حركة سيولد شجرة بحسب فيها كل الحركات التي يمكن للاعب المنافس
أن يلعبها مع نتيجة كل حركة خلال أربعة أدوار فقط كما توضح الصورة:
كل مربع يمثل حركة يمكن أن يقوم بها الحاسوب و نتيجتها و كل دائرة تمثل حركة يقوم
بها اللاعب و نتيجتها, إذا مهمت الحاسوب هي إختيار حركة بحيث يقلل أكبر خسارة
ممكنة أو يفوز.
الألغوريتم يحسب النتائج بإستخدام دالة تقييم منفصلة تختلف حسب نوع اللعبة و
قوانينها, القيمة 0©- تمثل الخسارة و القيمة 80+ تمثل الفوز.
في الدور 3, من أجل كل مربع, يقوم الحاسوب باختيار الدائرة ذات أقل نتيجة ممكنة و
في المربع على أقصى البسار سيختار الحاسوب بين الدائرتين 10 و ©+, بما أن القيمة
0ه+ تمثل الفوز, فلا يجب اختيارها لأنها ستعود إلى المربع و هو دور اللاعب, لذلك
سيختار الحاسوب الحركات التي ستعطي أقل نتيجة للاعب, في هذه الحالة 10.
في الدور 2, الحاسوب سيختار الحركة ذات أكبر نتيجة ممكنة لأنها ستعود عليه, بين
القيمة 5 و القيمة 10 سيختار 10.
بتطبيق هذه القواعد و تحليل كل الشجرة سنجد أن أفضل حركة سيختارها الحاسوب
طبعا هذه الشجرة يتم تطبيقها على حركة واحدة ممكنة, نفترض أن الحاسوب سيلعب
ممكنة, من أجل كل حركة سيولد شجرة مثل السابقة و من أجل كل حركة في كل
الأشجار المولدة سيتم توليد أشجار فرعية و البحث فيها عن أفضل حركة, أي أن
الحاسوب أثناء البحث سيلعب كل الحركات الممكنة و يرى النتيجة و هذا سيأخذ وقت
كبير و خاصة في الألعاب الأكثر تعقيدا, لذلك يتم إستعمال العمق, عمق الشجرة أو عدد
ستعيد الحركة ذات أكبر نتبجة لصالح الحاسوب, 111081608 الدالة التي ستعيد الحركة
ذات أقل نتيجة للاعب.
الدالة «110018, من أجل كل حركة ممكنة 98018 سنرجع الحركة ذات أكبر نتيجة
بإستخدام الدالة 18«*110176ا,
بعلم - > 65_06
في الدالة 0801076 سنرجع أفضل حركة, الحركة ذات أكبر نتيجة, لذلك نولد القائمة
0065, قائمة كل الحركات الممكنة في الدور التالي و من إجل كل حركة ممكنة
©9800, يلعب الحاسوب هذه الحركة عن طريق (ع«92) 01810008 ثم يستدعي الدالة
نتيجة ممكنة, و هي تمثل دور اللاعب, طبعا الألغوريتم تراجعي, أي أن كل دالة
تستدعي الدالة الأخرى إلى أن تنتهي اللعبة و تحصل على فائز أو تصل إلى عمق
محدد, و في الأخير نخزن في 5658076 الحركة ذات أكبر نتيجة لصالح الحاسوب, و
تواصل إلى أن نحصل على أفضل حركة, نرجعها و ينتهي الأمر.
لكن قبل ذلك لا بد من تعريف الدالة ©1101107, طبعا هي مشابهة للدالة السابقة غير
أنها تقوم بالعكس.