مسئلهای که باید حل میکردم
ربات نباید برای حدسزدن بازی به کارتهای مخفی حریف نگاه کنه. چیزی که لازم داشتم حافظهٔ کارتهای بازیشده و نشانههای عمومی خالیشدن خال بود.
پیادهسازی در نسخهٔ فعلی
HokmBotMemoryModel.RecordCardPlayed شناسهٔ هر کارت را یک بار ثبت میکنه. اگر بازیکن خال آغاز را دنبال نکند، voidSuitsBySeat آن صندلی را در آن خال علامت میزند.
تصمیم و هزینهٔ طراحی
ResetForNewHand حافظه، شناسهها و خالهای خالی را پاک میکنه و حکم دست جدید را تعیین میکنه. RemainingTrumpCountEstimate از سیزده کارت حکم، کارتهای مشاهدهشده را کم میکنه.
مرزهای فعلی
تخمین حکم باقیمانده محل دقیق کارتها را نمیگوید. فقدان مشاهده هم اثبات داشتن خال نیست؛ باید بین دانستهٔ عمومی و حدس استراتژیک فرق بگذارم.
مشاهدهٔ خالِ نداشته، نه دیدن دست حریف
فرض کن دور با پیک آغاز شده و یک صندلی کارت دیگری بازی میکنه. در حکم معتبر، این حرکت شاهدی عمومی هست که آن صندلی دیگر پیک نداره. RecordCardPlayed این مشاهده را از FailedToFollowLeadSuit میگیرد و در voidSuitsBySeat ثبت میکنه. استنتاج به رعایت قانون قبلی وابسته هست؛ اگر حرکت نامعتبر به حافظه وارد بشه، نتیجهٔ استراتژیک نیز میتواند آلوده بشه. بنابراین حافظه باید از مسیر پذیرفتهشدهٔ بازی تغذیه بشه، نه صرفاً از لمس کارت در رابط. این کلاس قانون حرکت را دوباره اجرا نمیکنه و مالک اعتماد ورودی نیست.
پیش از ثبت، آماده بودن حافظه، معتبر بودن صندلی، کارت استاندارد و خال آغاز بررسی میشوند. playedInstanceIds از ورود دوبارهٔ همان نمونه جلوگیری میکنه، در حالی که playedCards جزئیات مشاهدهها را نگه میدارد. دو کاربرد جستوجو نیز از هم جدا هستند: HasCardInstanceBeenPlayed دربارهٔ نمونهٔ مشخص پاسخ میدهد و HasCardBeenPlayed با خال و رتبه کار میکنه. در یک دستهٔ استاندارد حکم این اطلاعات به تخمین کارتهای بالاتر کمک میکنند؛ اما تبدیل این مدل به دستهای با نسخههای تکراری کارت، نیازمند بازبینی همین فرضهای شمارش خواهد بود.
تخمین باقیماندهٔ حکم از سیزده منهای تعداد حکمهای مشاهدهشده ساخته میشود و منفی نمیشود. این عدد همهٔ حکمهای بازینشده را توصیف میکنه، نه فقط حکمهای دست حریف؛ کارتهای خود بات نیز تا وقتی بازی نشدهاند در آن هستند. مصرفکننده باید اگر لازم هست دانستههای دست خود را جدا کم کنه. ResetForNewHand شناسهها، مشاهدهها و پرچمهای خال خالی را پاک میکنه و حکم تازه را میگذارد؛ Clear علاوه بر پاکسازی، IsReady را false میکنه. این تفاوت مانع آن هست که دانش یک دست به اشتباه شواهد دست بعدی فرض بشه.
چیزی که از این مرحله یاد گرفتم
برای من، حافظه یعنی تبدیل اتفاقهای قابل مشاهده به اطلاعات قابل استفاده. این راهبرد توضیحپذیرتر از یک رباتی هست که بدون نشاندادن دلیل، همیشه کارت درست را از وضعیت مخفی پیدا کنه.
مثال عملی حافظهٔ ربات حکم
یک روش کاربردی برای بررسی حافظهٔ ربات حکم این است که به جای چند تغییر همزمان، تنها یک مسیر کوتاه بسازی. کارتهای آشکار دورهای قبلی را ثبت کن و قبل از دست بعدی حافظه را پاک کن. سپس وضعیت قبل و بعد را کنار هم قرار بده. چه بخشی از داده تغییر کرده و کدام بخش فقط ظاهر تازهای پیدا کرده است؟ پاسخ باید از همان تعریف موضوع بیاید. این موقعیت یک مثال آموزشی است و آمار واقعی محصول یا وعدهٔ قابلیت جدید محسوب نمیشود.
خطای رایج و علت آن
اگر حافظه به دست پنهان بازیکنان دسترسی داشته باشد، حریف منصفانه نخواهد بود. این خطا معمولاً وقتی پنهان میماند که فقط مسیر موفق و ظاهر نهایی را ببینیم. برای پیدا کردن علت، آخرین وضعیت درست را از نخستین وضعیت نادرست جدا کن و ببین تغییر دقیقاً در کدام مرز رخ داده است. کارت بازیشده شاهد است؛ کارت پنهان نباید به عنوان اطلاعات معلوم وارد تصمیم شود. اگر این تفاوت در قرارداد مشخص نباشد، اصلاح یک نشانه ممکن است همان مسئله را در بخش دیگری دوباره ایجاد کند.
چطور نتیجه را بررسی کنیم؟
اطلاعات قابل مشاهده، نتیجهٔ دور و بازنشانی حافظه را جداگانه بررسی کن. اجرای یکباره برای نتیجهگیری کافی نیست؛ یک بار مسیر معمول و بار دیگر همان موقعیت را با ورودی مرزی یا تکرار اقدام بررسی کن. اگر نتیجه فرق دارد، ورودی و شرایط اجرا را همراه خروجی نگه دار تا مقایسه قابل بازسازی باشد. جدول زیر خلاصهٔ مشخصات همین سناریو است و برای ثبت نتیجهٔ بررسی به کار میآید.
| بخش بررسی | آنچه باید ثبت شود |
|---|---|
| موقعیت آزمایشی | کارتهای آشکار دورهای قبلی را ثبت کن و قبل از دست بعدی حافظه را پاک کن. |
| ریسک اصلی | اگر حافظه به دست پنهان بازیکنان دسترسی داشته باشد، حریف منصفانه نخواهد بود. |
| روش بررسی | اطلاعات قابل مشاهده، نتیجهٔ دور و بازنشانی حافظه را جداگانه بررسی کن. |
| مرز نتیجهگیری | کارت بازیشده شاهد است؛ کارت پنهان نباید به عنوان اطلاعات معلوم وارد تصمیم شود. |
پرسشهای کاربردی دربارهٔ حافظهٔ ربات حکم
از کجا شروع کنم؟
از همان موقعیت محدود این مطلب شروع کن: کارتهای آشکار دورهای قبلی را ثبت کن و قبل از دست بعدی حافظه را پاک کن. ابتدا نتیجهٔ مورد انتظار را مشخص کن و بعد سراغ پیادهسازی یا ابزار برو. وقتی مسیر پایه قابل توضیح و بررسی شد، میتوان حالتهای بیشتری اضافه کرد. ساخت همهٔ حالتها از ابتدا، فهم علت خطا را سختتر میکند.
چه زمانی میتوانم بگویم این بخش درست کار میکند؟
زمانی که رفتار در موقعیت تعریفشده با قرارداد سازگار باشد و محدودیتهای آن روشن بمانند. اطلاعات قابل مشاهده، نتیجهٔ دور و بازنشانی حافظه را جداگانه بررسی کن. موفقیت در این آزمون دربارهٔ همان سناریو شاهد میدهد؛ از آن نمیتوان بدون بررسی دربارهٔ همهٔ دستگاهها، همهٔ قوانین محلی یا همهٔ حجمهای داده نتیجه گرفت. کارت بازیشده شاهد است؛ کارت پنهان نباید به عنوان اطلاعات معلوم وارد تصمیم شود.
برای ادامهٔ همین موضوع، هستهٔ مشترک دلو؛ یک میز برای چند بازی و بازی دلو را ببین. زمینهٔ ساخت این پروژهها و معرفی سازنده در صفحهٔ کیان پاک نعمت آمده است.




