بازی ما شامل 21 کارت با محتوایی اعم از شش شخصیت، شش مکان و نه اتاق است. در ابتدا با استفاده از تعریف کلاس در جاوا، کلاسی به اسم گیم تعریف میکنیم. اطلاعاتی همچون تعداد بازیکن ها، آرایه ای شامل تاس هر بازیکن در هر دور بازی و متد هایی برای تاس انداختن برای هر بازیکن و پخش کردن کارت ها با توجه به تعداد بازیکن ها تعریف میکنیم.
کلاس گیم :
اولین چالش در رابطه با متد تاس : در اولین مرحله یک کلاس جدا برای تاس انداختن تعریف کرده بودیم که با توجه به مفهوم ارث بری در جاوا، کلاس تاس مشتق کلاس گیم حساب میشد و با توجه به پابلیک بودن اطلاعات تعریف شده داخل کلاس گیم، کلاس تاس نیز تمام آنها را دارا بود اما به دلایلی تعداد بازیکن هارا صفر در نظر میگرفت و برنامه با هربار اجرا به مشکل بر میخورد، برای مواجه شدن با این مشکل کلاس تاس را حذف کرده و محاسبه تاس را در غالب یک متد در کلاس گیم تعریف کردیم. در این متد با دریافت تعداد بازیکن ها یک آرایه به همین سایز تشکیل میدهد که اولین درایه آن تاس بازیکن حقیقی و به ترتیب درایه های دیگر با توجه به جایگاهی که دارند مخصوص بازیکنان دیگر هستند. ( برای مثال سومین درایه لیست برای بازیکن شماره سه است.)
جدا کردن کارت های جواب : تمام 21 کارت را در یک لیست با سایز مناسب اد کرده و با استفاده از قابلیت انتخاب یک عدد رندوم در جاوا اندیس کارت های رندوم را پیدا میکنیم ( سه کارت انتخاب کرده، یک کارت از هر دسته) و برای ساده تر شدن نوشتن برنامه یک لیست جواب درست کرده و سه کارت جواب را داخل آن اد میکنیم.
چالش دشته بندی کارت ها : ابتدا تمام هارک ها را با استفاده از هشمپ دسته بندی کردم اما این کار فقط باعث پیچیده و سخت تر شدن برنامه میشد، در نتیجه از لیست استفاده کردم و اندیس هر درایه در لیست را ابزاری برای دستیابی به عناصر لیست قرار دادم.
متد پخش کردن کارت ها : متد پخش کردن کارت ها دو ورودی دارد، لیستی که میخواهیم از میان آن کارت ها را انتخاب کنیم و تعداد کارت هایی که هر بازیکن قرار است دریافت کند. تعداد بازیکن ها چهار عدد مختلف ( 3 ، 4، 5 و 6 ) میتواند باشد. بعد از جدا کردن کارت ها جواب 18 کارت باقی میماند که آنها را به دو حالت بین بازیکن ها تقسیم میکنیم.
حالت اول : اگر تعداد بازیکن ها 3 یا 6 باشد، به راحتی میتوان 18 کارت را بین آنها تقسیم کرد، به 3 بازیکن 6 کارت و به 6 بازیکن 3 کارت میدهیم.
حالت دوم : این حالت وقتی رخ میدهد که تعداد بازیکن ها 4 یا 5 نفر باشد و نتوان به راحتی 18 کارت را بین آنها تقسیم کرد، در این صورت تعدادی کارت اضافه خواهیم داشت تا تعداد کارت های بازی به تعدا بازیکنان بخش پذیر باشد. اگر تعداد بازیکن ها 4 باشد آنگاه دو کارت اضافه و برای هر بازیکن 4 کارت خواهیم داشت و ارگ تعداد بایکن ها 5 باش آنگاه 3 کارت اضافه و برای هر بازیکن 3 کارت خواهیم داشت.
نحوه کار متد جدا کردن کارت ها : همانطور که گفته شد ورودی این متد یک لیست از تمام کارت ها و تعداد کارت های مورد نیاز هر بازیکن است و خروجی آن یک لیست از کارت های بازیکن است. در بدنه متد با استفاده از کلاس رندوم یک عدد در بازه صفر تا سایز لیست ورودی ( اندیس درایه رندوم ) را انتخاب کرده و آن درایه را وارد لیست خروجی کرده و از لیست ابتدایی حذف میکنیم تعدادی کارت در لیست ورودی باقی میماند که نیاز دارد داشته باشد. پس برای اخرین بازیکن از این متد استفاده نمیکنیم و لیست کارت های بازیکن آخر (که شما باشید) مساوی لیست کل کارت ها است.
حدس زدن برای روند بازی باید بازیکن حقیقی ما یک مکان، یک اتاق و یک شخصیت را به عنوان حدس خود ارائه دهد. برای گرفتن ورودی ای به عنوان حدس اتاق از متدی در کلاس پلی به نام روم استفاده میکنیم. تمام اتاق ها موجود را در یک لیست قرار میدهیم، بعد از نمایش دادن تمامی اتاق ها به بازیکن حقیقی از او میخواهیم تا با توجه به زوجیت تاس خود اتاق مورد نظرش را انتخاب کند. متد انتخاب اتاق های تصادفی : بعد از این کار به متدی برای انتخاب اتاق دیگر بازیکنان، به طور رندوم و با توجه به قوانین کفته شده، نیاز داریم. چهار حالت برای انتخاب اتاق بعدی، با توجه به اتاق قبلی داریم که به نوبت حالت ها را بررسی میکنیم. وروردی این اتاق یک لیست از اتاق هایی که هر بازیکن در حال حاضر حضور دارد است به همراه تعداد بازیکنان. 1 - حالت یک : هنگام شروع بازی شما میتوانید در هر خانه که مایل هستید مستقر شوید پس هیچ محدودیتی جز زوجیت تاس شما برای انتخاب اتاق شما وجود ندارد. در اینجا دو لیست از اتاق ها تشکیل میدهیم، اتاق های با شماره زوج و اتاق های با شماره فرد. سپس عددی رندوم دریافت کرده و اتاق مورد متناظر با همان جایگاه را از لیست متناسب انتخاب میکنیم. 2 – حالت دوم : حالت دوم زمانی رخ میدهد که شما در پذیرایی یا اتاق اول حضور داشته باشید که مجاور با هیچ کدام از اتاق ها حساب نمیشود. در این صورت بازهم هیچ محدودیت برای حرکت نخواهید داشت و تنها شرط موجود حرکت حتکی شما است، به عبارتی شما نمیتوانید در اتاقی که حضور دارید باقی بمانید پس اتاق شماره یک را از لیست موجود حذف کرده و سپس با توجه به زوجیت تاس بقیه مراحل را طبق حالت یک پیش میبریم. 3 – حالت سوم : این حالت، حالتی است که شما در یک اتاق با عدد زوج حضور داشته باشید ( حال نه میتوانید در اتاق خود باقی بمانید و نه میتوانید به اتاق های مجاور بروید) پس ما زوجیت تاس را در نظر میگیریم و در صورت زوج بودن شماره خانه ای که در آن حضور دارید را از لیست اتاق های زوج حذف میکنیم و سپس با استفاده از رندوم اتاق مورد نظر را پیدا میکنیم. و اگر عدد روی تاس برای بازیکن فرد باشد شماره اتاق های محاور با اتاق فعلی را پیدا کرده و آنها را از اتاق های فرد حذف میکنیم و دوباره با استفاده از کلاس رندوم شماره اتاق را برای بازیکن انتخاب میکنیم. 4 – حالت چهارم : حالت چهارم برعکس حالت سوم رخ میدهد که ما برای انتخاب اتاق همان روش حالت سوم را در پیش میگیریم. در حالت های سوم و چهارم یک ارایه از اندیس هایی که مجاور هم قرار دارند تشکیل میدهیم که با توجه به شماره اتاق، اندیس شماره اتاق های مجاور را پیدا کرده و از لیست حذف کنیم. در نهایت یک لیست به نام روم خواهیم داشت که اولین درایه آن اتاق انتخابی بازیکن حقیقی و دیگر درایه های آن اتاق های متناظر با شماره بازیکن در لیست به طور تصادفی است. چالش های این قسمت : در ابتدا ارایه ای که برای تاس تعریف کرده بودیم و در متد انتخاب اتاق های کلاس پلی از آن استفاده میکردیم خالی فرض میشد، در نهایت متوجه دلیل این اتفاق شدم که هنگامی که آن را به ارث میبرد خالی است و برای حل کردن این موضوع درایه ای از تاس های بازیکنان را نیز جزو ورودی های این متد در نظر گرفتم و مشکل برطرف شد، بعد از این اتفاق متوجه شدم میتوانستم برای کلاس تاس نیز همین کار را بکنم تا مشکل حل شود اما وجود متدی برای تاس کافی بود و ایجاد یک کلاس برتری ای نسبت به متد نداشت برای همین متد تاس را نگه داشته و مانند قبل نوشتن برنامه را ادامه دادم. در ادامه متدی برای دریافت حدس شخصیت و حدس مکان تعریف میکنیم. متد چک : بعد از اینکه حدس ها را ایتفاده از متد و کلاس پلی دریافت کردیم حالا لازم است متدی به نام چک جهت چک کردن کارت های هر بازیکن تعریف کنیم تا بررسی کند حدس اولیه ما که به عنوان پرسش مطرح میشود دست هر بازیکن قرار دارد یا خیر. در این متد لیست کارت های هر بازیکن و سه حدس خودمان را به عنوان ورودی وارد میکنیم. سپس به نوبت چک میکنیم که آیا در حدس های ما در کارت های دیگران وجود دارد یا خیر. در صورت وجود داشتن حلقه شکسته میشود و بازیکن دارای کارت، کارت حدس بازیکن حقیقی را به آن نشان میدهد و در غیر این صورت خروجی متد استرینگی با محتوای "من این کارت را ندارم" خواهد بود. متد فاینال چک : متد دیگری به نام فاینال چک تعریف میکنیم که در نهایت برنده و بازنده را مشخص میکند. ورودی این متد لیست کارت های جواب و سه حدس بازیکن حقیقی است که به نوبت آنها را مقایسه میکند. اگر هر سه حدس درست باشند بازیکن حقیقی برنده، اگر حداقل یک حدس غلط وجود داشته باشد بازیکن حقیقی بازنده اعلام میشود. چالشی دیگر : متوجه شدم در خروجی برنامه برخی اطلاعات دو بار نمایش داده میشوند به دنبال حل این موضوع متوجه شدم که
کلاس پلینگ : در این کلاس روند بازی، ترتیب استفاده از متد های کلاس های دیگر، و اطلاعاتی مانند این تعریف شده است که در نهایت تصمیم میگیریم که آیا حدس نهایی داشته باشیم یا خیر.