قرار گرفتن یک اسپرایت در یک ردیف خاص
#1
سلام
یه سوالی برام پیش اومد ولی کاری از دستم بر نیومد سوالم این بود که اگه بخوایم یه برنامه شبیه به  دوز  بسازم چطور بهش بگم اگه مثلا  ضربدر ها در یک ردیف پر بودند متوجه بشه و مثلا یه کاری بکنه حالا اون یه  کار مهم نیست میخوام بدونم چطور متجوه بشه که ردیف با ضربدر پر شده و بازی تموم هست !
  پاسخ


 سپاس شده توسط:
#2
(1399/7/7، 11:42 عصر)Hossein.Bararian نوشته است: سلام
یه سوالی برام پیش اومد ولی کاری از دستم بر نیومد سوالم این بود که اگه بخوایم یه برنامه شبیه به  دوز  بسازم چطور بهش بگم اگه مثلا  ضربدر ها در یک ردیف پر بودند متوجه بشه و مثلا یه کاری بکنه حالا اون یه  کار مهم نیست میخوام بدونم چطور متجوه بشه که ردیف با ضربدر پر شده و بازی تموم هست !
سلام؛
راه های زیادی برای تحلیل این مسئله وجود داره اما به نظرم میتونین به کمک آرایه ها بهتر مسئله رو تحلیل کنین. 
به صورت پیشفرض بازی تیک تاک تو (دوز) با سه تا ردیف و سه تا ستون انجام میشه. به هر حال اگر هم جدول ما 3 × 3 نباشه باید حاصلضرب ستون ها و ردیف هاش یک مجذور کامل بشه تا بتونیم برای ماتریس (جدول) قطر متصور بشیم. به عبارت دیگه باید تعداد سطرها و ستون های ماتریس (جدول) یکسان باشه. از بحث ابعاد جدول که بگذریم میرسیم به تحلیل اینکه کی بازی تموم میشه.
طبق قاعده بازی هر وقت یک بازیکن بتونه یک سطر (ردیف) رو به صورت قطری، افقی و یا عمودی مرتب کنه بازی به نفع اون بازیکن به اتمام میرسه. برای اینکه بتونیم مشخص کنیم چه زمانی بازی به اتمام میرسه و کدوم بازیکن برنده شده بهتره یک تابع تعریف کنیم و با حرکت هر کدوم از بازیکن ها اون تابع رو اجرا کنیم. اگر هر یک از بازیکن ها تونسته بودن مطابق قاعده بازی یک ردیف رو قطری، افقی و یا عمودی با علامت خودشون پر کنن یعنی اینکه باید تابعی که تعریف کردیم خاتمه رقابت رو اعلام کنه و اگر هم اتفاقی نیفتاده بود خُب بازی همچنان در جریان خواهد بود. من در اینجا اسم این تابع رو fetch_winner میگذارم.
قبل از اینکه راجع به عملکرد تابع بحث کنیم فرض کنیم وضعیت فعلی بازی به شکل زیر باشه:
[تصویر:  Picture2.png]
(در آرایه ها شمارش به جای شروع از یک از صفر شروع میشود.)
صرف نظر از حالت فعلی که در بازی حاکم هست همونطور که گفتیم باید سه حالت رو بررسی کنیم. واضحه که هر کدوم از این سه حالت درست در اومدن یعنی بازی به اتمام رسیده.
  • * حالت اول: تمامی خانه های یکی از ستون های جدول (0 و 1 و 2) دارای یک مقدار مساوی (X یا O) باشند.
  • * حالت دوم: قطر ماتریس (جدول) 3 × 3 ترسیم شده حاوی مقادیر یکسان X یا O باشد. برای پیدا کردن تعداد عناصری که روی قطر این جدول (ماتریس) قرار دارن کافیه تعداد ستون های جدول رو بدونیم که خُب مشخصاً توی مثال فعلی سه هست. با یک نگاه ساده میفهمیم که موقعیت هر یک از سه عناصر روی قطر برابر با (0 و 0)، (1 و 1) و (2 و 2) هست.  
  • حالت سوم: تمامی خانه های یکی از سطرهای جدول دارای یک مقدار مساوی (X یا O) باشند.
با توجه به چیزایی که گفتیم بریم تابع fetch_winner رو تعریف کنیم. قبل از اون باید یک آرایه با نام table به پروژه اضافه کنیم و حرکات هر دو بازیکن رو در داخل اون آرایه ذخیره کنیم. علاوه بر اون یک دیکشنری (آرایه انجمنی) به نام values هم به پروژه اضافه میکنیم که نقش اساسی توی عملکرد تابع ما داره.
[تصویر:  dc443fbf1a38d4719bfa56e080856d00.png?trs...c148cf0e26]
[تصویر:  5a1d97c12e493a37f630e42793c772f5.png?trs...c148cf0e26]
[تصویر:  fc1c5b77367311fa8508fcfb506d8049.png?trs...c148cf0e26]
[تصویر:  99af0ee74e032f457135ef83e2c6e7f2.png?trs...c148cf0e26]
خُب ما توی هر مرحله بررسی های لازم رو انجام دادیم. راجع به تابع توضیح میدم تا متوجه اتفاقاتی که رُخ میده بشین.
در ایونت شماره دو به کمک یک حلقه هر یک از ستون های آرایه رو دریافت و در یک کلید دیکشنری ذخیره میکنیم. کلیدهایی که مربوط به اطلاعات هر ستون در دیکشنری میشن با کلیدواژه nc و یک عدد (که شروع شمارش از صفر انجام میشه) نام گذاری میشن. 
در ایونت هـای سوم تا پنجم خانه های افقی (سطرهای) آرایه رو بررسی میکنیم. منتهی چون یکبار ستون ها رو در دیکشنری ذخیره کردیم لازم نیست که مجدد یک حلقه برای آرایه بسازیم و میتونیم با ایجاد یک حلقه برای دیکشنری سطرهای آرایه رو استخراج و ذخیره کنیم. سطرهای آرایه در کلیدهایی با کلیدواژه nl و یک عدد (که شروع شمارش از صفر انجام میشه) نام گذاری میشن. 
 در ایونت های ششم تا دهم خانه های قطری آرایه رو استخراج و ذخیره میکنیم. مشخصاً برای هر آرایه دو بعدی مطابق شکل زیر میشه دو قطر تعریف کرد.
[تصویر:  en.png]
هر یک از قطرهای آرایه با کلیدهایی با کلیدواژه nd و یک عدد (شمارش از صفر شروع میشه) مشخص میشن. برای استخراج قطر دوم آرایه به جای تشکیل حلقه محتویات جیسون کلیدهای دیکشنری رو دریافت کردیم و با توجه به اونها و به کمک عبارات باقاعده قطر دوم رو استخراج کردیم. در اصل میتونستیم به جای تن دادن به این همه پیچیدگی فقط ستون های آرایه رو به کمک حلقه استخراج کنیم و بعد بقیه موارد رو از روی همون ستون های استخراج شده و ذخیره شده در دیکشنری صرفاً با تکیه بر محتویات جیسون دیکشنری و عبارات باقاعده دریافت کنیم. 
در ایونت های یازدهم تا بیستم بعد از اینکه سطرهای افقی، عمودی و قطری آرایه رو استخراج کردیم وقتشه مشخص کنیم که آیا برنده ای داریم یا خیر. توی این قسمت به جای تشکیل حلقه و بررسی دونه به دونه کلیدهای دیکشنری از عبارات باقاعده کمک گرفتیم. در ایونت بیستم هم گفتیم شرایطی بررسی بشه که در اون هیچ بازیکنی برنده نشده.
اگر هیچ برنده ای نداشته باشیم مقدار  No winner! و اگر هر یک از بازیکن هایی که علامت X یا O رو انتخاب کردن بازی رو بردن برنده شدن مقدار  Player 'X|O' winned the game! به عنوان خروجی تابع برگشت داده می شود.
در ایونت بیست و یکم و بیست و دوم منحصراً به بررسی مشکل ساختاری در آرایه میپردازیم. در صورتی که مشکل ساختاری در آرایه وجود داشت مقدار  Invalid movements! به عنوان خروجی تابع نمایش داده میشه. منظورم از مشکل ساختاری در آرایه در اینجا اینه که به اشتباه ما دو سطر افقی، عمودی و یا قطری رو با علائم یکسان X یا O پر شده ببینیم. مثلاً:
[تصویر:  Picturea1.png]
خُب توی شکل بالا به طور واضحی می بینیم که مشکل ساختاری داریم. همونطور که مشخصه دو سطر عمودی مقادیر خونه هاشون یکسان در اومده که طبق قاعده بازی چنین چیزی نباید رُخ بده. پس حالا متوجه شدیم که ایونت های بیست و یکم و بیست و دوم چه کاری رو انجام میدن!
خُب حالا وقتشه تابع مون رو به کار ببندیم. فرض کنیم همونطور که گفتیم وضعیت فعلی بازی به شکل زیر باشه:
[تصویر:  Picture2.png]
کـامـلاً واضحه که بازیکنی که علامت X رو انتخاب کرده برنده است چرا که ستون صفر رو تونسته با علامت انحصاری خودش به طور کامل پر کنه. اگر ابعاد آرایه table رو 3×3 و عناصرش رو مطابق شکل تعریف کنیم می بینیم که تابع با موفقیت پیغام Player 'X' winned the game! رو به عنوان خروجی نمایش میده.
[تصویر:  deaa773f7d618e58110f2bbcc219471c.png?trs...c148cf0e26]
در حین پردازش آرایه تعریف شده کلیدهای دیکشنری به شکل زیر هستن:
[تصویر:  9c9d5523c9ede26124eca197c7294c4e.png?trs...c148cf0e26]
اینم از این! چیزایی که گفتیم قسمت اعظم کار شما برای ساخت یک بازی دوز رو شامل میشه. سورس مطـالـب رو میتونین از اینجا دانلود کنین.
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط: amin hosseini ، Amirhesam.KH ، M.gh ، magry ، Hossein


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Information پرداخت درون برنامه مایکت کوردوا ya mahdi 0 230 1404/1/17، 05:43 عصر
آخرین ارسال: ya mahdi
  نحوه خروجی اندروید کوردوا ya mahdi 0 177 1404/1/11، 04:06 عصر
آخرین ارسال: ya mahdi
Wink حل شده مقادير لازم در environment variable ᔕinaᗪehghani 24 11,596 1403/10/23، 12:10 صبح
آخرین ارسال: Tggi
  تپسل .....فروشگاه Hamidreza 3 1,932 1403/10/22، 11:57 عصر
آخرین ارسال: Tggi
  خروجی اندروید با Intel xdk ya mahdi 0 130 1403/8/25، 02:08 عصر
آخرین ارسال: ya mahdi

پرش به انجمن: