لعبة XO
ببساطة شديدة , في هذا المقال نشرعُ في بناء لعبة XO باستخدام فلَتر مع تطبيق بعضِ مفاهيم ادارة الحالات والريفربود سويةً جنباً إلى جنب.
ونبدأ أولاً بتثبيت الريفربود وذلك من خلال استدعاء أمر موجّه الأوامر:
ثم بعد ذلك نقوم باضافة ProviderScope إلى دالة main في الصفحة الأولى:
بدايةً حتّى نبدأ في بناء الواجهة اخترنا لكم واجهةً بسيطةً خاليةً من التعقيد , فيها صفحة تحوي عاموداً من القطع , وفيه قطعة نصية وتحتها قطعة من نوع القطعة المجدولة GridView , ثم في داخلها حاوية والحاوية بداخل حساس للضغط حتى اذا ما ضغط المستخدم استدعى دالة الضغط.
الصفحة هي من نوع الصفحة المستهلكة المتفاعلة ConsumerStatefulWidget.
وقبل أن نعرض الكود البرمجي علينا أن نعرج قليلاً على المنطق البرمجي للعبة , هناك قاعدة واحدة , اذا تتالت ثلاث اختيارات وتشابهت فهي الفائزة سواءً كانت X أو O.
لنطبق هذه القاعدة علينا حصر الاحتمالات الفائزة وهي كالتالي:
اذاً نحتاجُ دالةً تتحقق من تحقق هذا الشرط , وهو تتالي المتغيرات داخل هذه المصفوفة الثنائية أو القائمة , ولنوضح الأمر أكثر قمنا بتعريف لوحة اللعبة على هذا الشكل :
ورمزنا هنا بصفر للخيار الفارغ , فواحد هو X واثنين هو O.
ثم حددنا اللاعب الأصل عن طريق متغيرٍ منطقي , وحددنا اللاعب الفائز عن طريق متغيرٍ نصي , ثم قمنا ببناء الحالة عن طريق هذه الأسس فصار شكلها كالتالي:
قمنا ايضاً بصنع حالةٍ للعب وهي مقسمة الى أساسية , فائزة , ومتعادلة.
بعد ذلك قمنا ببناء كلاس المتحكّم على طريقة الريفربود من خلال كلاسٍ يدعى StateNotifier , فصار لدينا بالشكل التالي :
تقوم دالة setIndex بالتأكد أولاً من حالة اللعب , فإذا لم تكن حالة اللعبة أساسية فذلك يعني أن اللعبة انتهت فتعيد اللعبة إلى وضعها الأساسي.
ثم بعد ذلك تتحقق من خلو مكان اللاعب فحيث انه ان صار مساوياً لصفر فذلك يعني إمكانية تثبيت اللعب.
ثم بعد ذلك تقوم الدالة بالتأكد من أن ما اختاره اللاعب الأول أم اللاعب الثاني من خلال متغير isComputer وذلك عبر استدعاء دالة getPlayer والتي ترجع اللاعب المختار.
ثم بعد ذلك تأتي دالة checkWinner والتي تتحقق من وجود أي حالةٍ فائزة من الحالات المذكورة , فإن كانت هناك حالةٌ فائزة حددت اللاعب الفائز , ثم حولت الحالة إلى وجود فائز.
تأتي بعد ذلك دالةٌ أخرى وهي التي تتحقق من وجود التعادل وذلك حينما تخلو المصفوفة من أي ارقام 0 فتعني أن الحالة تعادل.
ثم بعد ان تتأكد تأتي الدالة التي تحول اللعب من اللاعب الأول الى الثاني في حالةِ أنه لم يفز أحد.
ثم بعد ذلك قمنا بصناعة مزوّد Provider يزوّد الحالة والمتحكّم للشاشة , وقمنا من خلاله باستدعاء الدوال وعرض الحالة على الشاشة.
أما الشاشة فقمنا بكتابة برنامجها على النحو التالي:
تقوم الواجهة بالتأكد من الحالة وعرض النص المناسب , فإما تختار بين اللاعبين أو تعرض اللاعب الفائز أو أنها تعرض تعادل , كما أنها تغير الألوان تبعاً لذلك.
بحكم أن برنامجنا يركّز على المنطق وكيفية صنعِ لعبةٍ بسيطة من خلال الريفربود فلم نوسع مجالاً لعرض كود الواجهة الرئيسية.
وللإستزادة وتجربة المشروع على غت هب: