تصویر آموزشی پخش قابل تنظیم کارت؛ مرتبط با موضوع نوشته

پخش کارت بدون عددهای قفل‌شده

مسئله‌ای که باید حل می‌کردم

از همان هسته می‌خواستم هم پخش تعداد ثابت و هم خالی‌کردن کامل دسته را داشته باشم. تعداد بازیکن یا کارت نباید از قانون حکم به همهٔ بازی‌ها سرایت کنه.

پیاده‌سازی در نسخهٔ فعلی

CardDealer.Deal با DealMode مسیر مناسب را انتخاب می‌کنه. پخش ثابت هم حالت نوبتی یک‌کارت و هم پخش یک‌جای دست داره؛ حالت دوم دسته را تا پایان بین بازیکنان می‌چرخاند.

تصمیم و هزینهٔ طراحی

DealConfig تصمیم مرتب‌سازی بعد از پخش را هم نگه می‌دارد. خروجی DealResult تعداد بازیکنان، کارت‌های پخش‌شده و باقی‌مانده را گزارش می‌کنه؛ شمارش از نمایش مستقل می‌ماند.

مرزهای فعلی

اعتبارسنجی کمبود کارت در پخش ثابت پیش از برداشت انجام می‌شود. این سرویس از خودش قانون چندمرحله‌ای حکم یا شرط بدون‌جفت جوکر را نمی‌سازد؛ آن‌ها مسئولیت لایهٔ بازی‌اند.

دو تقسیم یکسان در تعداد، متفاوت در ترتیب

فرض کن سه بازیکن هرکدام دو کارت لازم دارن. در مسیر DealFixedRoundRobin، کارت‌های اول تا سوم به سه بازیکن می‌رسن و دور بعد کارت دوم هر دست را می‌سازد. در DealFixedPerPlayer، ابتدا دو کارت پشت سر هم به نفر اول داده می‌شود و بعد نوبت نفر دوم هست. تعداد نهایی یکسان هست، اما با یک ترتیب دسته، اعضای دست‌ها یکسان نخواهند بود. به همین دلیل DealOneCardAtATime صرفاً تنظیم ظاهری نیست؛ این گزینه بر تخصیص منطقی کارت‌ها اثر می‌گذارد و باید با قاعدهٔ بازی هماهنگ انتخاب بشه.

در حالت DealUntilDeckEmpty، شمارندهٔ بازیکن پس از هر برداشت با باقی‌ماندهٔ تقسیم بر تعداد بازیکنان جلو می‌رود. اگر تعداد کارت‌ها بر تعداد بازیکنان بخش‌پذیر نباشد، برخی نفرات یک کارت بیشتر می‌گیرندد؛ این پیامد مستقیم ترتیب شروع از بازیکن اول فهرست هست. CardDealer راهی برای تعیین شروع از وسط همان فهرست ارائه نمی‌کنه. بازی می‌تواند فهرست مناسب را آماده کنه، اما باید تفاوت ترتیب صندلی‌ها با ترتیب ورودی این متد را بفهمد. نسبت دادن عدالت یا تقارن خودکار به این حلقه، بیشتر از چیزی هست که کد تضمین می‌کنه.

Validate نبودن دسته، فهرست خالی، بازیکن null و مقدار نامعتبر CardsPerPlayer را پیش از تقسیم رد می‌کنه. نکتهٔ ظریف این هست که مثبت بودن CardsPerPlayer حتی در حالت خالی کردن دسته هم بررسی می‌شود، هرچند حلقهٔ آن حالت از این عدد استفاده نمی‌کنه. پس ساخت DealConfig باید کل قرارداد فعلی را رعایت کنه. بعد از تقسیم نیز SortHandsAfterDeal برای همهٔ دست‌ها اجرا می‌شود و DealResult شمارش‌ها را گزارش می‌دهد. این گزارش برای بررسی توزیع مفید هست، اما زمان‌بندی انیمیشن، صدای پخش کارت و مرحلهٔ انتخاب حکم در مسئولیت آن نیستند.

چیزی که از این مرحله یاد گرفتم

برای من، قابل استفادهٔ مجدد بودن یعنی حذف عددهای بی‌دلیل. سرویس پخش کاری محدود و روشن انجام می‌دهد و هر بازی می‌تواند زمان و ترتیب فراخوانی آن را خودش تعیین کنه.

معرفی بازی دلو

مثال عملی پخش قابل تنظیم کارت

اگر بخواهی پخش قابل تنظیم کارت را در یک پروژهٔ کوچک بررسی کنی، بهتر است از یک موقعیت محدود شروع کنی. برای دو بازی، تعداد بازیکن و اندازهٔ دست اولیه را تغییر بده، بدون اینکه منطق نمایش بازنویسی شود. ورودی را ثابت نگه دار و نتیجهٔ مورد انتظار را پیش از اجرای نسخه بنویس. این کار کمک می‌کند تفاوت میان رفتار منطقی و چیزی که صرفاً روی صفحه دیده می‌شود روشن بماند. سناریوی این بخش آموزشی است و ادعای نتیجهٔ واقعی یک آزمایش روی کاربران دلو ندارد.

خطای رایج و علت آن

عددهای ثابت در انیمیشن یا حلقهٔ پخش باعث کم‌وزیاد شدن کارت در حالت تازه می‌شوند. این خطا معمولاً وقتی پنهان می‌ماند که فقط مسیر موفق و ظاهر نهایی را ببینیم. برای پیدا کردن علت، آخرین وضعیت درست را از نخستین وضعیت نادرست جدا کن و ببین تغییر دقیقاً در کدام مرز رخ داده است. قانون تعداد کارت را تعیین می‌کند و نمایش فقط برنامهٔ پخش را اجرا می‌کند. اگر این تفاوت در قرارداد مشخص نباشد، اصلاح یک نشانه ممکن است همان مسئله را در بخش دیگری دوباره ایجاد کند.

چطور نتیجه را بررسی کنیم؟

جمع کارت‌های پخش‌شده و باقی‌مانده باید با تعداد آغازین دسته برابر باشد. اجرای یک‌باره برای نتیجه‌گیری کافی نیست؛ یک بار مسیر معمول و بار دیگر همان موقعیت را با ورودی مرزی یا تکرار اقدام بررسی کن. اگر نتیجه فرق دارد، ورودی و شرایط اجرا را همراه خروجی نگه دار تا مقایسه قابل بازسازی باشد. جدول زیر خلاصهٔ مشخصات همین سناریو است و برای ثبت نتیجهٔ بررسی به کار می‌آید.

بخش بررسیآنچه باید ثبت شود
موقعیت آزمایشیبرای دو بازی، تعداد بازیکن و اندازهٔ دست اولیه را تغییر بده، بدون اینکه منطق نمایش بازنویسی شود.
ریسک اصلیعددهای ثابت در انیمیشن یا حلقهٔ پخش باعث کم‌وزیاد شدن کارت در حالت تازه می‌شوند.
روش بررسیجمع کارت‌های پخش‌شده و باقی‌مانده باید با تعداد آغازین دسته برابر باشد.
مرز نتیجه‌گیریقانون تعداد کارت را تعیین می‌کند و نمایش فقط برنامهٔ پخش را اجرا می‌کند.

پرسش‌های کاربردی دربارهٔ پخش قابل تنظیم کارت

از کجا شروع کنم؟

از همان موقعیت محدود این مطلب شروع کن: برای دو بازی، تعداد بازیکن و اندازهٔ دست اولیه را تغییر بده، بدون اینکه منطق نمایش بازنویسی شود. ابتدا نتیجهٔ مورد انتظار را مشخص کن و بعد سراغ پیاده‌سازی یا ابزار برو. وقتی مسیر پایه قابل توضیح و بررسی شد، می‌توان حالت‌های بیشتری اضافه کرد. ساخت همهٔ حالت‌ها از ابتدا، فهم علت خطا را سخت‌تر می‌کند.

چه زمانی می‌توانم بگویم این بخش درست کار می‌کند؟

زمانی که رفتار در موقعیت تعریف‌شده با قرارداد سازگار باشد و محدودیت‌های آن روشن بمانند. جمع کارت‌های پخش‌شده و باقی‌مانده باید با تعداد آغازین دسته برابر باشد. موفقیت در این آزمون دربارهٔ همان سناریو شاهد می‌دهد؛ از آن نمی‌توان بدون بررسی دربارهٔ همهٔ دستگاه‌ها، همهٔ قوانین محلی یا همهٔ حجم‌های داده نتیجه گرفت. قانون تعداد کارت را تعیین می‌کند و نمایش فقط برنامهٔ پخش را اجرا می‌کند.

برای ادامهٔ همین موضوع، هستهٔ مشترک دلو؛ یک میز برای چند بازی و بازی دلو را ببین. زمینهٔ ساخت این پروژه‌ها و معرفی سازنده در صفحهٔ کیان پاک نعمت آمده است.

آخرین دولاگ‌ها

تصویر آموزشی تله‌متری ورود پاسور؛ مرتبط با موضوع نوشته

ورود و تله‌متری پاسور در ساختار مشترک

اضافه‌شدن پاسور باید هم حالت انتخاب‌شده را درست منتقل کند و هم رویداد عمومی معتبر بسازد. من ورود پرداخت‌شده و تله‌متری را ادامهٔ ساختار مشترک دیدم، با حفظ اعتبار کار هم‌تیمی‌ام.

ادامهٔ مطلب
تصویر آموزشی انیمیشن جمع‌کردن پاسور؛ مرتبط با موضوع نوشته

نمایش انتخاب و جمع‌کردن پاسور

حرکت پاسور باید نشان بدهد کدام کارت بازی شد و کدام کارت‌های زمین جمع شدند. در ادغام کار هم‌تیمی‌ام، ترتیب نمایش برای فهم نتیجه همان‌قدر مهم بود که خود capture.

ادامهٔ مطلب
تصویر آموزشی ربات پاسور؛ مرتبط با موضوع نوشته

تصمیم ربات پاسور از روی گزینه‌های جمع‌کردن

ربات پاسور هم‌تیمی‌ام از گزینه‌های قانونی انتخاب می‌کند، نه از کارت‌های مخفی حریف. برای ادغام، همین مرز اطلاعات برای من مهم‌تر از اسم هوش مصنوعی بود.

ادامهٔ مطلب
Dalo