در این قسمت میخواهیم بهطور کلی مروری بر مقررات بازی کنیم.
منچ یک بازی حداکثر ۴ نفره است. هر کدام از این ۴ بازیکن یکی از رنگهای «قرمز»، «آبی»، «سبز» و «زرد» را انتخاب میکنند و ۴ مهره با رنگ خودشان دارند که در ۴ گوشهی صفحه قرار دارند. (جمعاً ۱۶ مهره) هدف این است که هر بازیکن ۴ مهره رنگ خودش را به ۴ خانه همرنگ خودش در وسط صفحه برساند.
بازی به نوبت انجام میشود، ابتدا نوبت بازیکن «قرمز»، سپس بازیکن «آبی»، بعد از آن بازیکن «سبز» و پس از آن نوبت بازیکن «زرد» است و همین ترتیب تکرار میشود.
هر کس در نوبت خودش تاس میاندازد. تاس عددی بین ۱ تا ۶ را نشان میدهد و میتواند مهره خودش را در جهت مشخص شده، به تعداد عدد ظاهر شده به جلو ببرد. هرکس برای اینکه یکی از مهرههایش را وارد نوار اصلی بازی کند، باید یک بار عدد ۶ بیاورد تا بتواند این کار را انجام دهد.
اگر عدد تاس بیشتر از تعداد خانههایی باشد که پیشروی آن مهره قرار دارد یا در خانهی مقصد یک مهره دیگر از همان بازیکن باشد، هیچ حرکتی انجام نمیشود. توجه کنید اگر مهره بازیکن دیگری باشد، مهره آن بازیکن به قسمت گوشه میرود. همچنین پریدن مهرهها از روی یکدیگر مجاز است.
از شما میخواهیم اتفاقات این بازی را شبیهسازی کنید.
از شما میخواهیم برنامهای بنویسید که عدد ظاهر شده روی تاس را مانند ورودیهای نمونه چاپ کند.
در تنها سطر ورودی، عدد صحیح و مثبت آمده، که نشاندهندهی عدد ظاهر شدهی تاس است.
مانند خروجیهای نمونه، عدد ظاهر شده تاس را به صورت استاندارد چاپ کنید.
یکی از ابزارهایی که برای پیادهسازی بازی منچ به آن نیاز داریم، «تاس» است. به همین منظور، میخواهیم تابع get_dice
را پیادهسازی کنیم. این تابع هیچ آرگومانی ورودی نمیگیرد. این تابع بعد از هر بار فرخوانی، مقدار عددی که روی تاس، بعد از انداختن ظاهر میشود را نشان میدهد.
برای رسیدن به این هدف، با داشتن سه عدد اول () ، و دنباله تصادفی را به این صورت میسازیم:
حال از روی دنبالهی عدد ظاهر شده در پرتاب ام را که با نشان میدهیم؛ از این رابطه بدست میآید:
از شما میخواهیم تابع get_dice
را طوری پیادهسازی کنید که بعد از بار صدا کردن مقدار را چاپ کند. یعنی در اولین فراخوانی get_dice
، مقدار ، در دومین فراخوانی get_dice
، مقدار و... برگردانده شود.
در سطر اول ورودی، بهترتیب سه عدد اول ، و داده میشود.
در سطر دوم ورودی، عدد صحیح و مثبت داده میشود.
خروجی سطر دارد، عدد نوشته شده در سطر ام مقدار تابع get_dice
بعد از بار فرخوانی است.
در این بخش از پروژه، فرض کنید یک بازیکن داریم که تنهایی منچ بازی میکند. بهطور دقیقتر، این بازیکن رنگ «قرمز» را انتخاب میکند؛ ۴ مهره قرمز، در ۴ خانهی گوشه بالا سمت راست، قرار میدهد. این چهار مهره را با رشتههای R1
، R2
، R3
و R4
نشان میدهیم.
این بازیکن درخواست دارد. هر درخواست در یک سطر ورودی داده میشود.
این درخواست یعنی بازیکن قرمز میخواهد تاس بیاندازد.
این درخواست یعنی بازیکن قرمز، میخواهد تاس بیاندازد.
اگر عدد ظاهر شده از پرتابهای قبلی وجود دارد که هنوز حرکت متناسبی برای آن انجام نشده، پیام invalid dice rolling
را در یک سطر چاپ کنید.
در غیر این صورت با استفاده از تابع get_dice
که در بخش قبلی پیادهسازی شده، یک عدد دریافت کنید. اگر عدد ۶ ظاهر شد، این عدد را جزو اعداد ظاهر شده در نظر بگیرید و مجدداً تاس بیاندازید. این کار را آنقدر تکرار میکنیم که دیگر ۶ ظاهر نشود.
تضمین میشود که فرآیند پرتاب تاس، پایان پذیر باشد. از شما میخواهیم تمام اعداد ظاهر شده را در یک سطر، با یک فاصله از هم، چاپ کنید.
برای بهتر متوجه شدن این درخواست، مثالهای نمونه را بررسی کنید.
این درخواست یعنی بازیکن قرمز، میخواهد مهرهی را وارد بازی کند.
تضمین میشود m
یکی از مقدارهای R1
، R2
، R3
یا R4
باشد.
that is in
را در یک سطر چاپ کنید.you need six
را در یک سطر چاپ کنید.busy starting cell
را در یک سطر چاپ کنید.اگر چند مورد از شرایط بالا برقرار بود، موردی که زودتر بیان شد را در نظر بگیرید و پیام آن را چاپ کنید.
در صورتی که هیچکدام از حالتهای بالا اتفاق نیافتد، یکی از ۶های ظاهر شده در پرتاب تاس را حذف کنید و مهرهی را وارد خانه اولیه قرمز (خانه ۱) کنید و شمارهی خانهای که مهره وارد آن شده را در یک سطر چاپ کنید.
برای بهتر متوجه شدن این درخواست، مثالهای نمونه را بررسی کنید.
این درخواست یعنی بازیکن قرمز میخواهد مهرههای خود را واحد حرکت دهد.
تضمین میشود m
یکی از مقدارهای R1
، R2
، R3
یا R4
باشد. همجنین تضمین میشود s
یکی از اعداد تا باشد.
invalid move
را در یک سطر چاپ کنید.it is not in
را در یک سطر چاپ کنید.you can not move
را در یک سطر چاپ کنید.destination is busy
را در یک سطر چاپ کنید.اگر چند مورد از شرایط بالا برقرار بود، موردی که زودتر بیان شد را در نظر بگیرید و پیام آن را چاپ کنید.
در صورتی که هیچکدام از حالتهای بالا اتفاق نیافتد، یکی از های ظاهر شده در پرتاب تاس را حذف کنید و مهرهی را واحد به جلو ببرید و شمارهی خانهای که مهره وارد آن شده را چاپ کنید.
برای بهتر متوجه شدن این درخواست، مثالهای نمونه را بررسی کنید.
این درخواست یعنی بازیکن میخواهد از همهی اعداد ظاهر شده توسط تاس صرف نظر کند و هیچ حرکتی بهازای این اعداد انجام ندهد.
این درخواست باید باعث لغو شدن همهی پرتابهای تاسی شود که تا کنون انجام شده است.
برای بهتر متوجه شدن این درخواست، مثالهای نمونه را بررسی کنید.
در سطر اول ورودی، بهترتیب سه عدد اول ، و داده میشود.
در سطر دوم ورودی، عدد صحیح و مثبت داده میشود.
در سطر بعدی، در هر سطر، یکی از چهار درخواست که توضیح آن در متن سوال آمده میآید.
خروجی متناسب با هر درخواست را در یک سطر جداگانه چاپ کنید.
در این بخش میخواهیم بازی را برای چهار بازیکن پیادهسازی کنیم.
مهرههای بازیکن «قرمز» R1
، R2
، R3
و R4
هستند که در ابتدا به ترتیب در خانههای ، ، و قرار دارند. خانهی شروع برای «قرمز» است. هدف بازیکن قرمز این است که این ۴ مهره را (به هر ترتیبی) بهخانههای ، ، و ببرد.
مهرههای بازیکن «آبی» B1
، B2
، B3
و B4
هستند که در ابتدا به ترتیب در خانههای ، ، و قرار دارند. خانهی شروع برای «آبی» است. هدف بازیکن قرمز این است که این ۴ مهره را (به هر ترتیبی) بهخانههای ، ، و ببرد.
مهرههای بازیکن «سبز» G1
، G2
، G3
و G4
هستند که در ابتدا به ترتیب در خانههای ، ، و قرار دارند. خانهی شروع برای «سبز» است. هدف بازیکن قرمز این است که این ۴ مهره را (به هر ترتیبی) بهخانههای ، ، و ببرد.
مهرههای بازیکن «زرد» Y1
، Y2
، Y3
و Y4
هستند که در ابتدا به ترتیب در خانههای ، ، و قرار دارند. خانهی شروع برای «قرمز» است. هدف بازیکن قرمز این است که این ۴ مهره را (به هر ترتیبی) بهخانههای ، ، و ببرد.
نکاتی که باید در این حالت در نظر بگیریم.
نوبتها به ترتیب برای رنگهای «قرمز»، «آبی»، «سبز» و «زرد» است و بعد از یک دور گردش نوبتها، مجدداً به همین ترتیب نوبت آنها میشود. این روند تا آخر ادامه دارد.
هر بازیکن در نوبت خودش، باید یکبار تاس را با موفقیت بریزد. (توجه کنید اگر ۶ ظاهر شود بهصورت خودکار باید روند تاس ریختن ادامه یابد.)
سپس باید با سه درخواست «ورود مهره»، «حرکت مهره» و «رها کردن» همهی حرکات تاسی که انداخته را تمام کند.
توجه کنید زمانی که کار با ارسال پیام تمام شود، یعنی عملیات با موفقیت انجام نشده، پس نوبتها نیز تغییری نمیکنند.
اگر نوبت یک رنگ باشد هر درخواستی که بخواهد باعث تغییر در وضعیت مهرههای دیگر ایجاد کند باید با پیام it is not your turn
را چاپ کنید.
اکنون که چند مهره وجود دارد، ممکن است حرکت یک مهره به خانهای باشد که مهرهای از رنگ دیگر وجود دارد. در این صورت شما باید مهرهای که در آن خانه قرار دارد را از آن نقطه بردارید و به اولین (کم شماره ترین) خانهی گوشهای مربوط به آن رنگ ببرید.
در خواستها همان حالتهای بخش قبلی را دارند ولی حالتهای مهره () میتواند هر کدام از ۱۶ رشتهی بالا باشد.
در سطر اول ورودی، بهترتیب سه عدد اول ، و داده میشود.
در سطر دوم ورودی، عدد صحیح و مثبت داده میشود.
در سطر بعدی، در هر سطر، یکی از چهار درخواست که توضیح آن در متن سوال آمده میآید.
خروجی متناسب با هر درخواست را در یک سطر جداگانه چاپ کنید.
در این بخش از پروژه، میخواهیم بعد از هر عملیات، چه موفق چه ناموفق وضعیت صفحهی بازی نمایش داده شود.
صفحه بازی بدون مهرهها به صورت زیر است.
هر دو خانهی oo
و xx
یکی از خانهها را نشان میدهد و .
خالی بودن صفحه را نشان میدهد.
حال از شما میخواهیم وضعیت مهرهها در صفحه را به این صورت نمایش دهید.