در زمان مسابقه میتوانید سوالهای خود را از قسمت "سوال بپرسید" مطرح کنید.
شما قرار است بخشی از بازی چشمک را پیادهسازی کنید. در این نسخه از بازی قوانین زیر وجود دارد.
فایل Source را دانلود کرده، وارد بسته ir.mci.wink
شده و محتوای آن را ببینید:
deal()
دارد که به هر یک از بازیکنها، یک کارت تخصیص میدهد که تنها یکی از آنها علامت چشمک دارد. این واسط توسط ما پیادهسازی میشود.state()
دارد که وضعیت فعلی بازیکن را در قالب یک enum (از نوع PlayerState.State) بر میگرداند.شکل زیر، نمودار وضعیت بازیکن را نشان میدهد. با فراخوانی هر یک از متدها روی شیِ بازیکن، انتقال وضعیت انجام میشود. وضعیتها در واقع همان مقادیر PlayerState.State هستند که توسط متد state()
از بازیکن قابل دریافت هستند.
در بسته ir.mci.wink.example
، یک پیادهسازی ساده از Player و Dealer وجود دارد که در متد main
از کلاس Main استفاده شده است. با پیادهسازی صحیح WinkGameImpl و با اجرای برنامه، خروجی زیر به دست میآید:
باید توجه داشت که در تستها از پیادهسازی پیشرفتهترِ Player استفاده میشود. در این پیادهسازی در فراخوانی متدها، وضعیت فعلی بازیکن چک میشود و در صورتی که طبق نمودار وضعیت نبود، خطای IllegalStateException
پرتاب میشود. این نکته در مورد پیادهسازی Dealer نیز صدق میکند.
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 قرار دارد. در داخل شاخه impl، فقط و فقط فایل WinkGameImpl.java وجود دارد.