هزنا مرشحاتك العقلية ، وكانت النتيجة إجابة. طريقة العمل ، وسوف تكون دائما فعالة. كل ما يجب القيام به هو التخلص من عبء التحيز الإضافي ...
ريمون جونز " مستوى الضوضاء "لم يظهر
دجاز من الصفر. لطالما كنت مولعا بألعاب الألغاز والألغاز ، وأمارس البرمجة بقدر ما أستطيع أن أتذكرها ، لكن فكرة محرك "عالمي" معين لم يكن من الممكن أن تتخطى رأيي. كنت متشككا في هذه الفكرة. حتى رأيت
Zillions . لسوء الحظ ، لم يعد المنتج في ذلك الوقت قيد التطوير ، ولم يكن الكود المصدري متاحًا ، وفي الواقع ، كان البرنامج يعمل فقط في نظام Windows. بعد بعض الوقت ، قررت تناول مشروع مفتوح.
كما قلت سابقًا ، لم يكن لدي أي أكواد مصدر ، لكنني
لمست Zillions قليلاً واكتشفت فكرته الرئيسية - الحد الأقصى لإعادة استخدام رمز التطبيق ، والذي يسمح باستخدام نفس الإنشاءات في أشكال مختلفة ، والتي تبدو مختلفة تمامًا عن بعضها البعض الحالات. كان كل شيء عن usecase الصحيح. وقد وضعت
خطة .
لعبة الداما
وضعت هذه العائلة المهمة ولكن الاستخفاف بها للغاية حجر الأساس للمشروع. جميع ألعاب "لعبة الداما" تشبه بعضها البعض وتختلف فقط في التفاصيل. فيما يتعلق بتصميم اللعبة ، فهي متحدة جميعًا بثلاثة أفكار رئيسية:
- عن طريق الاختيار
- تأخذ الأولوية
- تحرك مركب
لا تثير الفقرة الأولى أي أسئلة خاصة ، ولكن إذا كان التطوير يركز على ألعاب الشطرنج ، فقد يكون ذلك مفاجأة. ليس في جميع الألعاب ، يتم الالتقاط في نفس الحقل حيث تكمل القطعة الحركة. مع التحركات ذات الأولوية ، الأمور أكثر إثارة للاهتمام قليلاً. في لعبة الداما ، تتيح لك هذه القاعدة بناء لعبة جماعية معقدة ، وجذب العدو إلى مصائد تعمل وفقًا لمبدأ "إعطاء أقل - التقاط أكثر".
بالطبع ، تم تنفيذ آلية التحركات ذات الأولوية في Zillions (وتم ترحيلها من هناك إلى Dagaz). وبدون ذلك ، فإن جميع ألعاب الداما تقريبًا (المضمنة بالتأكيد في "مجموعة الرجل المحترم" لألعاب الطاولة التي تعد إلزامية للتنفيذ) لا يمكن أن تعمل بشكل صحيح. الأمر كله يتعلق بالتفاصيل. دعونا نرى كيف تم تنفيذ هذه الآلية:
في الزيليون(move-priorities jump-type normal-type) ... (define checker-shift ( $1 (verify empty?)
هذا وصف كامل تقريبًا لأبسط لعبة مدقق. يتم تقديم مفهوم أوضاع الحركة (
نوع الحركة ) في
ZRF ، ويتيح
لنا بناء أولويات الحركة أن نقول إنه إذا كانت هناك تحركات ذات أولوية أعلى (يأخذ) ، فلا ينبغي اعتبار أولوية أقل (تحركات هادئة). يمكن تحديد مستويات الأولوية وأكثر من مستويين ، في هذا الصدد ، التصميم عالمي جدًا ، لكن في العمل على الألعاب في Dagaz ، واجهت بعض القيود على هذه الآلية.
في هذه
اللعبة ، التي اخترعها سليمان غولومب ، بالإضافة إلى لعبة الداما ، هناك أيضًا قطع شطرنج. تكمن الصعوبة في حقيقة أن الاستيلاء ، مع الحفاظ على أولوية لعبة الداما ، ليس كذلك بالنسبة لقطع الشطرنج (وإلا سيكون من السهل للغاية مصائدها وأكلها). لن يعمل تحديد الأولويات الساذجة باستخدام أولويات
نقل الكلمات الرئيسية في هذه اللعبة.
في الواقع ، إذا لم يتم تضمين قطع الشطرنج في حركات الأولوية ، إذا كانت هناك إمكانية لأخذ قطعة المدقق وقطعة شطرنج ، فلن نتمكن من لعب قطعة شطرنج ، نظرًا لأن التقاط الشيك هو أولوية. إذا تم اعتبار حركات الشطرنج ذات أولوية متساوية ، فسنكون ملزمين بأخذ قطع الشطرنج كلما سنحت الفرصة. كل من هذه تتناقض مع قواعد اللعبة.
في Zillions ، لم يتم حل هذه المشكلة من الناحية العملية. وكان هذا هو السبب الرئيسي الذي فكرت في إدخال آلية تمديد جافا سكريبت في Dagaz. الفكرة في حد ذاتها بسيطة للغاية: بما أن بعض ميكانيكا اللعبة يصعب التعبير عنها في ZRF ، فلماذا لا يتم تقديم مرحلة ما بعد المعالجة من الحركات؟ في هذه الحالة ، تقوم وحدة الامتداد بفحص القائمة الكاملة للحركات التي تم إنشاؤها بالكامل ويمكنها اتخاذ قرارات بشأن رفض بعض الحركات. إليك ما
تبدو عليه
لشاشمت :
رمز بسيط ومدمج var CheckInvariants = Dagaz.Model.CheckInvariants; Dagaz.Model.CheckInvariants = function(board) { var design = Dagaz.Model.design; var types = []; types.push(design.getPieceType("Bishop")); types.push(design.getPieceType("Camel")); var isPriority = false; _.each(board.moves, function(move) { if (isCapturing(board, move)) { if (_.indexOf(types, getType(board, move)) < 0) isPriority = true; } }); if (isPriority) { _.each(board.moves, function(move) { if (!isCapturing(board, move)) { move.failed = true; } }); } CheckInvariants(board); }
في المستقبل ، تطورت فكرة الامتدادات وازدهرت بلون رائع. حصلت على آلية مريحة وقوية لترميز العديد من الألعاب التي سيكون تنفيذها على ZRF النقي مشكلة للغاية ، ولكن هل هذا يعني أن تحديد الأولويات في نمط ZRF قديم؟ بالطبع لا! أولاً ، إن كتابة سطر واحد في ZRF أسهل من خمسين في JavaScript ، ولكن الأهم من ذلك ، أن الأولويات على غرار ZRF "الصعبة" تعمل بطريقة لا تتولد بها حتى التحركات ذات الأولوية المنخفضة! هذا مهم من حيث الأداء. توليد الحركات في دغاز عملية مكلفة للغاية.
لعبة أخرى ذات أولويات صعبةDablot هي لعبة تشبه إلى حد ما
المسودات الإيطالية ، ولكنها أكثر قديمة. بالإضافة إلى الشخصيات العادية ، هناك "أمراء" و "ملوك" فيه ، والشخصيات الأصغر سناً ليس لها الحق في التغلب على كبار السن. لكن هذا ليس هو الصعوبة. للملوك (وفي بعض أصناف اللعبة للأمراء أيضًا) ، يكون الالتقاط اختياريًا! هنا تنشأ نفس المشكلة كما هو الحال مع
ششمت . إذا أعلنا أن الملك أولوية ، فسننتهك بشكل صارخ قواعد اللعبة ، وإلا فلن نتمكن من هزيمة الملك بإمكانية معركة بديلة برقم بسيط. فقط محرك تمديد Dagaz يحل هذه المشكلة.
بالمناسبة ، مع "المسودات الإيطالية" كل شيء ليس بهذه البساطة. في العديد من أنواع المسودات ، هناك قاعدة تنص على أن اللاعب ملزم بأخذ أكبر عدد ممكن من القطع. أي أنه لا يستطيع مقاطعة سلسلة الالتقاطات فحسب ، بل يجب عليه اختيار المسار الذي سيأخذ فيه المزيد من القطع! للأسباب التي سأناقشها أدناه ، لا يمكن تنفيذ هذه القاعدة في Zillions بشكل عام واضطر المطورون إلى ترميزها. في المسودات الإيطالية ، تبدو "قاعدة الأغلبية" أكثر تعقيدًا: "أنت بحاجة إلى التغلب على أكبر عدد ممكن من مسودات الخصم ، ومع وجود خيارات معركة متساوية ، يجب عليك التغلب على أكبر عدد ممكن من السيدات".
التحركات المركبة هي العنصر الثاني المهم في ألعاب لعبة الداما. من المهم للغاية أن
اختبار الالتقاط الصحيح في "
المسودات التركية " أركض بشكل دوري حتى الآن. بضع مرات عندما كسرت النموذج بالتغييرات التالية ، لقد ساعدني ذلك حقًا.
يتحرك - مركب وجزئيدعونا نرى كيف يتم تنفيذ التحركات المركبة في ZRF (define checker-shift ( $1 (verify empty?) (if (in-zone? promotion) (add King) else add ) )) (define checker-jump ( $1 (verify enemy?) capture $1 (verify empty?) (if (in-zone? promotion) (add King) else (add-partial jump-type) ) )) (define king-shift ( $1 (verify empty?) add )) (define king-jump ( $1 (verify enemy?) capture $1 (verify empty?) (add-partial jump-type) ))
هذه هي الطريقة البسيطة. يقول الأمر
الإضافي الجزئي أن الحركة يمكن أن تستمر (مع نفس القطعة ، هذا أمر مهم) إذا كان لا يزال هناك تحركات مع الوضع المحدد. بمعنى آخر: "يجب أن يستمر الشكل في الظهور ، بينما توجد مثل هذه الفرصة." يبدو أن كل شيء على ما يرام ، ولكن هناك تحذير واحد. ترى Zillions أن مثل هذه الخطوة تأخذ خطوة "جزئية" منفصلة. دعونا نرى ما يمكن أن يؤدي هذا إلى.
في هذه
اللعبة ، يتم تحديد عدد "الخطوات" التي تؤديها قطعة ما بواسطة الرمز الذي تقف عليه. Now Now move و Damyo يمشي (قطعة تحمل علامة حمراء). في Zillions ، بعد الانتهاء من حركتين جزئيتين ، يمكنها الانتقال بسهولة إلى الزاوية العلوية اليسرى ، حيث لم تعد قادرة على إجراء آخر حركة متبقية (لا يمكنك العودة). يحظر أيضًا أخذ قطعة الخصم في الخطوة الجزئية الثانية. في Zillions لا توجد طريقة لحظر تسلسل التحركات التي تؤدي إلى طريق مسدود.
في Dagaz ، الأمر مختلف! يتم
دائمًا تجميع سلسلة من التحركات الجزئية في حركة مركبة كاملة. الخطوة التي لا يمكن إتمامها ببساطة لن تحدث! هذا هو نهج أكثر كثافة للموارد ، ونتيجة لذلك ، فإن إنشاء قائمة نقل في Dagaz عملية مكلفة للغاية. لكن مزاياه كبيرة. على سبيل المثال ، يتلقى الروبوت كامل الحركة المركبة بالكامل ولا يجب أن يتطلع إلى الأمام ، مع تنفيذ الحركات الجزئية المتبقية.
والأهم من ذلك ، أن هذا النهج يوفر الفرصة للنظر في القائمة الكاملة للحركات المقبولة المشروطة ، وإجراء عمليات فحص أكثر تعقيدًا ، ومنع بعض الحركات اعتمادًا على وجود الآخرين. على سبيل المثال ، يتم تطبيق "قاعدة الأغلبية" ، التي ذكرتها أعلاه ، في داغاز بكل
بساطة . وعلاوة على ذلك ، ل "لعبة الداما الإيطالية" أيضا. قام مطورو Zillions "بحل" المشكلة التي عرفوها لألعاب لعبة الداما من خلال فك خيار خيار "الالتقاطات
القصوى " ، ولكن هناك عددًا كبيرًا من الألعاب مع فحوصات معقدة أخرى ، لم يكن لديهم أي فكرة عنها في ذلك الوقت!
في عملية العمل على ألعاب جديدة ، تم تطوير مفهوم الحركة المركبة أيضًا. اقترح
Fanorona و
Pasang ميكانيكا ألعاب مثيرة للاهتمام ، حيث يجب على اللاعب الذي يقوم بهذه الخطوة اختيار مجموعة من القطع التي أزيلت من اللوحة:
أيضًا ، تعتبر
Fanorona واحدة من تلك الألعاب النادرة التي يحق فيها للاعب مقاطعة سلسلة الالتقاطات. الالتقاط الأول فيه إلزامي ، لاحقًا ، في نفس الخطوة - وفقًا لتقدير اللاعب. في Dagaz ، يتم تنفيذ هذا الخيار (
جزئي جزئي ) عن طريق تحريك الرقم في مكانه. يمكن أن يكون Missclick هنا ، وهذا ، على ما يبدو ، ليس مريحًا للغاية ، ولكن مع مقدمة
مدير الجلسة ، يمكن الآن استعادة الحركات الخاطئة.
وكان هناك تطور آخر للموضوع هو تحركات "إطلاق النار". لقد
صنعتهم أولاً في
Hanga Roa و
Ko Shogi ، لكن كما اتضح لاحقًا ، لقد قمت بذلك بشكل خاطئ! لم ينجح التنفيذ الخاطئ تحت سيطرة برامج الروبوت (وبما أنه لا يزال لدي أي روبوت لكلتا هاتين الألعابتين ، فلا غرابة في أنني لم ألاحظ أي شيء). بعد ذلك بكثير ، عندما فعلت
Amazons ، تمكنت من توطين المشكلة وحلها. وصلت هذه الفكرة إلى ذروتها في
لعبة اخترعها أحد مواطنينا في عام 1957.
هناك مشكلة أخرى تتعلق بتنفيذ التحركات المركبة في دجاز. الحقيقة هي أن قائمة التحركات المسموح بها ، من حالة لعبة معينة ، يتم تشكيلها على الفور - الأمر برمته. في Zillions ، بحركاتها الجزئية ، هذا ليس حرجًا للغاية ، ولكن في Dagaz ، إذا أتيحت الفرصة لـ "الدائرة في مكانها" ، فلن تكتمل مرحلة إنشاء الحركة أبدًا (من الواضح أنه من المستحيل حل هذه المشكلة بالامتدادات ، لأنه من السهل التعامل معها لا تصل). إليك إحدى الألعاب التي يعد هذا أمرًا مهمًا:
هنا لا تتم إزالة القطع من اللوحة ويمكن القفز على نفس القطعة عدة مرات على التوالي. يتمثل الحل الواضح في حظر زيارة نفس الحقل مرتين في كل مرة ، لكن كان علي الدخول في النواة لتنفيذ هذا الفحص. كان هذا يشبه إلى حد ما تنفيذ خيار "
الالتقاط المؤجل " ، لكن بما أنني فعلت
المسودات الروسية قبل ذلك بكثير ، كانت هناك مشاكل أقل بكثير في ذلك.
لسوء الحظ ، هناك ألعاب لا يتم حفظ هذه الشيكات فيهاتنص قواعد
Stapeldammen (هذا هو نوع من "
الأعمدة " بشكل صريح على أن نفس القطعة يمكن التغلب عليها عدة مرات في كل مرة. وتعود القطعة التي تؤدي هذه الخطوة إلى نفس الموقف عدة مرات وتستمر في المعركة ، بينما في العدو هناك أشكال في الأعمدة .. لا يمكن للتحركات المركبة لـ Dagaz أن تتعامل مع هذه المشكلة ، منطق معركة Pole Drafts معقدة للغاية بالنسبة للنواة ، ولن تصل إلى الامتدادات ، لأن حلقة الحلقة يتم حلها ، بالطبع ، هناك طريقة للخروج:
لا توجد حركات جزئية في Dagaz ، لكن يمكننا محاكاةها عن طريق تخطي الخطوة التالية من قبل الخصم (يتم استخدام نفس الأسلوب في
الشارات ). ويتم تنفيذ هذا المنطق بسهولة من خلال
الامتداد . نحن ببساطة نحظر جميع التحركات في ظل ظروف معينة ، وخيار
التمرير = القسري يولد تلقائيًا حركة فارغة. هنا
لعبة أخرى مع مضاهاة مماثلة.
التحركات المركبة المركبة بتقسيم جزئي إلى تحركات جزئية ليست جيدة جدًا لبوتات الذكاء الاصطناعي ، لكن في بعض الأحيان ، لا يوجد أي مخرج آخر.
بشكل عام ، فإن مفهوم المركب يحرك الحياة ويتطور. في الآونة الأخيرة ، كان عليّ أن أجعل خيارًا جديدًا (
كامل جزئي ) في
لعبة مصرية قديمة.
بالإضافة إلى إكمال حركة الأرقام تلقائيًا على طول الأسهم ، فإنه يحتوي أيضًا على حلول تقنية أخرى مثيرة للاهتمام. ولكن عن هذا بعض الوقت الآخر.