RALTechnologies

مقالات · الهندسة

تصميم لوحة لعب عادلة: الرياضيات وراء LetterLock.

LetterLock هي لعبتنا اللوحية للأسئلة والمعلومات العامة. يتنافس فريقان على حجز الحروف في لوحة من الخلايا السداسية، ويتسابقان لوصل ضلعيهما. وتحت الأسئلة تختبئ قطعة صغيرة من الرياضيات تجعل اللعبة عادلة، وبعض الهندسة التي تضمن أنها تعلن الفائز الصحيح دائمًا.

مشكلة اللوحة الكلاسيكية

برنامج المسابقات التلفزيوني الذي ألهم LetterLock استخدم لوحة من الخلايا السداسية، على أحد الفريقين أن يعبرها في اتجاه، وعلى الآخر أن يعبرها في الاتجاه الآخر. لم تكن اللوحة مربعة بمقاييس الشبكة السداسية، فلم يكن المساران بالطول نفسه: كان على أحد الفريقين دائمًا أن يقطع مسافة أقصر. في برنامج تلفزيوني هذه مجرد غرابة. لكن في لعبة يلعبها الناس مرة بعد مرة مع أصدقائهم، فهي ظلم مدمج سيلاحظه الفريق الخاسر حتمًا.

استعارة اللوحة من لعبة Hex

الحل يأتي من Hex، وهي لعبة اتصال اخترعها Piet Hein بشكل مستقل في الأربعينيات، ثم John Nash بعده ببضع سنوات. تُلعب Hex على معيّن من الخلايا السداسية، عادةً 11 في 11. يملك أحد اللاعبين الضلعين الأيمن والأيسر، ويملك الآخر الضلعين العلوي والسفلي. يتناوب اللاعبان على حجز الخلايا، وأول من يصل ضلعيه بسلسلة متصلة يفوز.

للمعيّن تناظر جميل: أدِره فتتحول مشكلة اليمين واليسار إلى مشكلة الأعلى والأسفل. كلا اللاعبين يواجه المهمة بالشكل نفسه تمامًا، وبعدد الخلايا نفسه تمامًا بين ضلعيه. ويستخدم LetterLock اللوحة نفسها بثلاثة أحجام: 4 × 4 للعبة سريعة، و5 × 5 للنسخة الكلاسيكية، و7 × 7 لمباريات أطول وأكثر استراتيجية.

لماذا لا تنتهي اللوحة السداسية بالتعادل أبدًا

من الحقائق المدهشة والمريحة جدًا في Hex أن اللعبة لا يمكن أن تنتهي بالتعادل. إن امتلأت كل الخلايا، فلدى لاعب واحد بالضبط سلسلة فائزة. الفكرة ببساطة أن الخلايا السداسية تلتقي ثلاثًا عند كل نقطة، لا أربعًا أبدًا. في الشبكة المربعة، يمكن لمربعين متقابلين قطريًا أن يتلامسا عند زاوية، فيسمح ذلك لمساري اللاعبين بأن "يتقاطعا" عند تلك النقطة. أما في الشبكة السداسية فلا توجد زوايا كهذه: حيثما تلامست خليتان لك، فهما تتشاركان ضلعًا كاملًا، وبالتالي فإن السلسلة من ضلع إلى آخر جدار صلب لا يستطيع اللاعب الآخر اختراقه. إما أنك بنيت هذا الجدار، أو أن خصمك وجد طريقًا للالتفاف حوله، وهذه هي سلسلته الفائزة.

هذا أكثر من مجرد معلومة طريفة. فقد ثبت أن هذه النتيجة، التي تُسمى غالبًا مبرهنة Hex، مكافئة لمبرهنة النقطة الثابتة لبراور، وهي نتيجة شهيرة في الطوبولوجيا. أما في لعبة سهرة، فمعناها أبسط: كل مباراة LetterLock لها فائز، فلا يضطر أحد إلى اختراع وسيلة لكسر التعادل في آخر الليل.

من يبدأ أولًا؟

لدى Hex أيضًا أفضلية معروفة للاعب الأول. أثبت Nash بحجة "سرقة الاستراتيجية" أن اللاعب الأول يملك من حيث المبدأ استراتيجية فائزة: الخلية الإضافية لا يمكن أن تضرّك أبدًا، فلو كان لدى اللاعب الثاني استراتيجية فائزة، لاستطاع اللاعب الأول أن يسرقها ويفوز. لا أحد يعرف ما هي هذه الاستراتيجية على اللوحات الكبيرة، لكن الأفضلية حقيقية.

لاعبو Hex المتشددون يستخدمون قاعدة التبديل: بعد الحركة الأولى، يمكن للاعب الثاني أن يختار أخذ تلك الحركة لنفسه. جرّبنا ذلك في LetterLock ثم أزلناه لاحقًا، لأن القرار الإضافي في لعبة سهرة سريعة أربك الناس أكثر مما أفادهم. بدلًا من ذلك، يبدّل LetterLock في كل لعبة من سلسلة أفضل 3 أو أفضل 5 مَن يختار أولًا والاتجاه الذي يلعب فيه كل فريق، ويمنح اللوحة حروفًا جديدة في كل لعبة. وعلى امتداد السلسلة، يحصل الفريقان على الفرص نفسها.

وهناك أيضًا لمسة تجعل LetterLock مختلفة عن Hex الصرفة: حجز الخلية ليس مضمونًا. عليك أن تجيب عن سؤال إجابة صحيحة، وإن أخطأت، يستطيع خصمك أن يخطف الخلية. هذا يجعل أفضلية الحركة الأولى أصغر بكثير عمليًا، ويضيف طبقة من الاستراتيجية ليست في Hex: الخلية التي تهم الفريقين قيمتها أعلى، واختيارها بحرف لا يثق به فريقك قد يسلّمها لخصمك.

اكتشاف الفائز بشكل صحيح

أهم قاعدة في اللعبة هي "من فاز؟"، ويتم التحقق منها بعد كل حجز. إن أخطأ هذا التحقق ولو مرة، فلا قيمة لأي شيء آخر في اللعبة. لذلك بنيناه بأسلوب الاختبار أولًا، قبل أن توجد أي شاشة.

Union-find

تستخدم اللعبة بنية union-find (وتُسمى أيضًا بنية المجموعات المنفصلة). لكل فريق عقدتان افتراضيتان تمثلان ضلعيه. حين يحجز فريق خلية، نضمّها إلى أي خلايا مجاورة يملكها الفريق مسبقًا، وإلى عقدة الضلع إن كانت الخلية على ذلك الضلع. ويفوز الفريق في اللحظة التي تصبح فيها عقدتا ضلعيه في المجموعة نفسها. كل تحقق يستغرق وقتًا شبه ثابت، فهو سريع حتى على أكبر لوحة.

مرجع تحقق بطيء وصحيح بوضوح

الكود السريع من السهل أن يخطئ بطرق خفية، لذلك تقارنه الاختبارات بتعبئة فيضية بسيطة عن قصد: ابدأ من كل خلية يملكها الفريق على أحد الضلعين، وانتقل إلى الخلايا المجاورة التي يملكها الفريق، وانظر إن كان المسار يصل إلى الضلع الآخر. هي أبطأ، لكنها سهلة القراءة وسهلة الثقة. ثم تولّد الاختبارات أعدادًا كبيرة من اللوحات العشوائية وترتيبات الحركات العشوائية، وتشترط أن تتفق الطريقتان في كل مرة، وعلى كل أحجام اللوحة.

أحداث، لا لقطات

كل إجراء في اللعبة (اختيار، أو إجابة صحيحة، أو خطف، أو تراجع) يُسجَّل حدثًا في سجل يُضاف إليه فقط، وتُحسب اللوحة من هذه الأحداث. هذا يجعل التراجع أمرًا بسيطًا، ويجعل اللعبة المحفوظة قائمة قصيرة من الأحداث، ويعني أن الغرف عبر الإنترنت تستطيع إرسال الأحداث نفسها إلى كل جهاز. وإن اختلفت شاشتان يومًا على حالة اللوحة، فسجل الأحداث سيُظهر بالضبط أين حدث ذلك.

لماذا يهم هذا أبعد من مجرد لعبة

هذه العادات هي نفسها التي نحملها إلى أنظمة عملائنا: حدّد المنطق الذي سيُحدث أكبر ضرر لو كان خاطئًا، واكتبه كودًا واضحًا منفصلًا عن الواجهة، واختبره مقابل نسخة أبسط ومستقلة، وسجّل التغييرات أحداثًا حتى تستطيع دائمًا أن تشرح كيف وصلت إلى الحالة الحالية.

يمكنك تجربة اللوحة بنفسك على letterlock.raltech.dev، وقراءة القواعد الكاملة ودليل الاستراتيجية، أو الاطلاع على دراسة حالة LetterLock كاملة.