• لطفا توجه داشته باشید، برای حل سوالات باید از جاوا ۸ استفاده کنید.

در زمان مسابقه می‌توانید سوال‌های خود را از قسمت "سوال بپرسید" مطرح کنید.

چشمک


شما قرار است بخشی از بازی چشمک را پیاده‎‌سازی کنید. در این نسخه از بازی قوانین زیر وجود دارد.

  • در ابتدای بازی، کارت‎‌ها بین بازیکن‌‎ها توزیع می‌‎شود. روی یکی از کارت‌ها علامت (چشمک) قرار دارد.
  • بازیکنی که کارت چشمک دارد (چشمک‎‌زن)، در هر مرحله از بازی می‌‎تواند به یک یا چند بازیکن دیگر چشمک بزند.
  • با دریافت چشمک توسط یک بازیکن، آن بازیکن می‎‌میرد (حذف می‌‎شود).
  • هر بازیکن می‎‌تواند حدس بزند، چه کسی چشمک‌‎زن است:
    • اگر حدس وی درست باشد، برنده شده و بازی تمام می‌‎شود؛
    • وگرنه، می‎‌میرد (حذف می‎‌شود).
  • اگر در بازی، حداکثر دو نفر باقی بمانند، بازی تمام شده و چشمک‌‎زن پیروز می‌‎شود.

فایل Source را دانلود کرده، وارد بسته ir.mci.wink شده و محتوای آن را ببینید:

توضیحات:🔗

  • واسط WinkGame: این واسط را باید پیاده‌‎سازی کنید (در کلاس WinkGameImpl).
  • واسط Dealer: یک متد deal() دارد که به هر یک از بازیکن‌‎ها، یک کارت تخصیص می‌‎دهد که تنها یکی از آن‌‎ها علامت چشمک دارد. این واسط توسط ما پیاده‎‌سازی می‌‎شود.
  • کلاس Card: نشان‌دهنده کارتی است که بین بازیکن‎‌ها پخش می‎‌شود.
  • واسط PlayerState: واسطی شامل متدهایی برای دریافت وضعیت و انتقال وضعیت بازیکن است. این واسط یک متد state() دارد که وضعیت فعلی بازیکن را در قالب یک enum (از نوع PlayerState.State) بر می‎‌گرداند.
  • واسط Player: از واسط PlayerState ارث‌‎بری می‌‎کند. هر شی که به عنوان بازیکن در برنامه وجود دارد از نوع Player است. این واسط نیز توسط ما پیاده‎‌سازی می‎‌شود.

نمودار وضعیت بازیکن:🔗

شکل زیر، نمودار وضعیت بازیکن را نشان می‎‌دهد. با فراخوانی هر یک از متدها روی شیِ بازیکن، انتقال وضعیت انجام می‎‌شود. وضعیت‌‎ها در واقع همان مقادیر PlayerState.State هستند که توسط متد state() از بازیکن قابل دریافت هستند.

نمودار وضعیت

مثال:🔗

در بسته ir.mci.wink.example، یک پیاده‎‌سازی ساده از Player و Dealer وجود دارد که در متد main از کلاس Main استفاده شده است. با پیاده‌‎سازی صحیح WinkGameImpl و با اجرای برنامه، خروجی زیر به دست می‌‎آید:

Round #1:
[Player[id=100, state=PLAYING], Player[id=300, state=PLAYING], Player[id=500, state=PLAYING], Player[id=600, state=ELIMINATED]]

Round #2:
Winner: Player[id=500, state=WON]
[Player[id=100, state=FINISHED], Player[id=300, state=ELIMINATED], Player[id=500, state=WON], Player[id=600, state=ELIMINATED]]
Plain text

باید توجه داشت که در تست‎‌ها از پیاده‌‎سازی پیشرفته‌‎ترِ Player استفاده می‌‎شود. در این پیاده‌‎سازی در فراخوانی متدها، وضعیت فعلی بازیکن چک می‌‎شود و در صورتی که طبق نمودار وضعیت نبود، خطای IllegalStateException پرتاب می‌‎شود. این نکته در مورد پیاده‎‌سازی Dealer نیز صدق می‎‌کند.

متدهای WinkGame:🔗

  • متد join(Player): بازیکن ورودی را به بازی ملحق می‎‌کند و متد onJoin این بازیکن را فراخوانی می‎‌کند.
  • متد prepare(): پس از فراخوانی این متد، دیگر بازیکنی نمی‌‎تواند به بازی ملحق شود. همچنین متد onPrepare برای تمامی بازیکن‎‌ها فراخوانی می‎‌شود.
  • متد dealing(): در این متد، به کمک شیِ dealer، کارت‎‌ها بین بازیکن‎‌ها توزیع می‌‎شود و بازیکنِ چشمک‎‌زن را بر می‌‎گرداند. برای تحویل کارت به هر بازیکن، باید متد onDeal(Card) وی فراخوانی شود.
  • متد playRound(): یک مرحله از بازی را انجام می‌‎دهد و در صورتی که برنده بازی مشخص شود، وی را برمی‌‎گرداند:
    • ابتدا باید روی تمامیِ بازیکن‎‌های در حال بازی (دارای وضعیت Playing)، متد playRound(List<Player>) فراخوانی شود. ورودیِ این متد باید بازیکن‎‌های در حال بازی (به جز خود بازیکن) باشد.
    • با فراخوانی متد detectedWinker() از بازیکن‎‌ها (به غیر از چشمک‎‌زن)، بازیکن چشمک‌‎زن را (در صورت تشخیص) برمی‎‌گرداند؛ اگر تشخیص بازیکنی درست بود: متد onWin() روی وی، متد onDetected() روی چشمک‌‎زن و متد onFinished() روی سایر بازیکن‎‌ها فراخوانی می‎‌شود. بازیکن تشخیص‌‎دهنده به عنوان برنده برگردانده می‌‎شود. اگر تشخیص بازیکن اشتباه بود: متد onWrongDetection() روی وی فراخوانی می‎‌شود.
    • با فراخوانی متد winkedPlayers() از بازیکنِ چشمک‎‌زن، بازیکن‌‎هایی که چشمک خورده‎‌اند برگردانده می‎‌شود و روی این بازیکن‎‌ها، متد onWink() صدا زده می‌‎شود.
    • اگر حداکثر دو بازیکن باقی‌مانده باشند، چشمک‎‌زن برنده می‌‎شود و متد onWin() روی آن صدا زده می‌‎شود و به عنوان برنده برگردانده می‎‌شود. هم‌چنین روی بازیکن باقی‌‎مانده نیز متد onFinished() صدا زده می‎‌شود.

نکات و راهنمایی🔗

  • در هر دور حداکثر یک نفر چشمک‌زن را درست تشخیص می‎‌دهد و یا به عبارت دیگر، بازی حداکثر یک برنده دارد.
  • متدهایی که خروجی Optional دارند هیچ‎گاه نباید null برگردانند، بلکه باید یک Optional خالی برگردانند.
  • در فراخوانی متدها روی هر بازیکن دقت کنید و وضعیت بازیکن را در نظر بگیرید. برای مثال روی بازیکن حذف‎‌شده (وضعیت Eliminated) نمی‎‌توان متد onWink را صدا زد.

آنچه باید آپلود کنید:🔗

یک فایل زیپ آپلود کنید که در آن بسته ir.mci.wink.impl به صورت زیر وجود داشته باشد:

.
└── ir
    └── mci
        └── wink
            └── impl
                └── WinkGameImpl.java
Plain text

به صورتی که وقتی فایل زیپ را باز می‌کنیم، دقیقا شاخه‌ ir را ببینیم که درون آن شاخه mci و درون آن شاخه wink و درون آن نیز شاخه impl قرار دارد. در داخل شاخه impl، فقط و فقط فایل WinkGameImpl.java وجود دارد.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.