در گاتهام که مدتیست نرخ جنایت بالارفته نیروهای پلیس به دنبال یک راه حل برای مقابله با جنایتکاران هستند. بتمن که مدتیست بازنشسته شده دیگر مانند سابق نمیتواند جنایتکاران را به سزای عملشان برساند. پلیسهای گاتهام که هیچ الگوریتم مشخصی برای پیدا کردن دزدها ندارند و بدون کمک بتمن گیج و سردرگم در تعقیب جنایتکاران گاتهام هستند از بتمن کمک خواستهاند. بتمن سراغ دوست قدیمی خود (مثلا شما) آمده و میخواهد به او کمک کنید تا سیستم الگوریتم تعقیب جنایتکاران و دزدها رو بهبود دهید به امید آنکه بدون نیاز به بتمن آرامش به گاتهام بازگردد.
بازی توسط دو بازیکن انجام میشود که هر بازیکن تعدادی دزد و تعدادی پلیس دارد و هدف هر بازیکن در این بازی این است که با استفاده از پلیسهای خود دزدهای حریف را بگیرد و تا پایان بازی هر بازیکنی که سریعتر دزدهای حریف خود را بگیرد برنده بازی خواهد شد. هر بازیکن باید بتواند طوری پلیسهای خود را داخل نقشهی شهر جابهجا کند که روی دزدهای حریف بیفتند و آنها را بگیرند. در اینجا شما باید کدی بزنید که پلیسها و دزدهایتان را کنترل کند.
بازی روی یک مپ انجام میشود که نقشهی یک شهر است که یک گراف حداکثر 250 راسی است و راسها، محلههای آن شهر هستند و یالهای آن، معابر قابل عبور(که به سه شکل پیاده، مترو و تاکسی وجود دارند). استفاده از یال پیاده هزینهای ندارد اما استفاده از تاکسی و مترو هزینه مشخصی دارد. دقیقا یکی از راسهای گراف هم ایستگاه پلیس است. دو بازیکن روی این مپ بازی میکنند هر کدام از بازیکنان تعدادی دزد و تعدادی پلیس دارد که در ابتدای بازی تمام پلیسها در ایستگاه پلیس هستند و مکان اولیه دزد دست خود بازیکنان است و در ابتدای بازی آن را مشخص میکنند. در حین بازی پلیسها همواره به چشم بازیکنان معلوم هستند اما دزدها تنها در نوبتهای مشخصی از بازی برای حریف مشخص هستند(که در ادامه توضیح داده خواهد شد). هدف هر کدام از بازیکنان گرفتن دزدهای بازیکن حریف است و این اتفاق زمانی میافتد که یک پلیس خودی و دزد حریف روی یک راس قرار بگیرند و بازیکنی که زودتر از حریفش تمام دزدهای او را بگیرد برنده است(شرط برد در صورتی که هیچ بازیکنی تمام دزدهای حریفش را پس از اتمام تعداد نوبت ها نگیرد یا همزمان در یک نوبت بگیرند در ادامه گفته خواهد شد). در هر نوبت از بازی هر پلیس و هر دزد برای خودش تصمیم میگیرد (به طور مستقل) که چه حرکتی را انجام دهد. تنها راه ارتباط دزدها با هم از طریق یک چتباکس میان خودشان است. همچنین پلیسها نیز یک چتباکس دارند که میتوانند با آن در ارتباط با هم باشند. هرکدام از دزد و پلیسها مقداری پول دارند و برای استفاده از مترو یا اتوبوس باید هزینهاش را بپردازند. هر کدام از دزد و پلیسها مقداری پول ثابت در هر نوبت دریافت میکنند و مقداری هم پول اولیه دارند.
دو نوع یونیت وجود دارد که یکی دزد و یکی پلیس است. در هر بازی هر بازیکن تعدادی دزد و تعدادی پلیس دارد که در هر نوبت باید آنها را کنترل کند. کنترل هر یونیت در نوبتش به این صورت است که از راس فعلیاش به یکی از راسهایی که به آن یال دارد میرود و یا در جای خود میماند. هر کدام از یونیتها در ابتدای بازی مقداری پول دارند و در هر نوبت هم مقداری پول دریافت میکنند.
هر بازیکن تعدادی دزد دارد که باید از دست پلیسهای حریف فراریشان دهد و اگر یکی از پلیسهای بازیکن حریف در هر لحظهای بر روی یک دزد خودی قرار بگیرد آن دزد دستگیر خواهد شد. در طول بازی دزدها فقط در تعداد خاصی از نوبت ها برای پلیسهای حریف نمایان هستند. هر دزد در ابتدا مقداری پول دارد که به ازای همه دزدها یکسان است و در هر نوبت مقدار پول دریافت میکند که به طور مشابه برای همهی دزدها یکسان است.
هر بازیکن تعدادی پلیس دارد که باید با استفاده از آنها دزدهای بازیکن حریف را بگیرد و اگر یکی از پلیسهای خودی در هر لحظهای بر روی یکی از دزدهای حریف قرار بگیرد آن دزد دستگیر خواهد شد. هر پلیس در ابتدا مقداری پول دارد که به ازای همه پلیسها یکسان است و در هر نوبت مقداری پول دریافت میکند که به طور مشابه برای همهی پلیسها یکسان است.
مپ بازی به شکل یک گراف است که یونیتها روی راسها آن گراف هستند(روی یک راس میتواند چند یونیت قرار گیرد) و میان هر دو راس میتواند یال وجود داشته باشد. یالهای بازی از سه نوع(پیاده، اتوبوس، مترو) هستند. مشخصات یالها به صورت یک لیست به شما داده میشود که دو سر یال و هزینه استفاده از آن یال آمده است. تضمین میشود حداکثر 3 نوع مختلف هزینه وجود دارد که به ترتیب هزینه یال پیاده، یال اتوبوس و یال مترو است.
کدی که شما برای این بازی میزنید فقط یک یونیت را کنترل میکند و برای ارتباط یونیتها با هم باید از چتباکس استفاده کنید. استفاده از چتباکس به این صورت است که هر یونیت در نوبت خود بسته به طول پیامی که میدهد هزینهای میپردازد و از چتباکس استفاده میکند و یونیتهای همتیمیاش میتوانند این پیام را مشاهده کنند. همچنین کاراکترهای مجاز در هر پیام 0 , 1 هستند و فقط مجاز به استفاده از این کاراکترها هستید.
در هر نوبت بازی، ابتدا هر کدام از بازیکنان پلیسهای خود را حرکت میدهند(از راسی که قرار دارند به یک راس که از راس فعلی به آن یال وجود دارد) و هزینه حرکت خود را میپردازند یا میتوانند هیچ حرکت انجام ندهند و سر جای خود باقی بمانند سپس دزدهای هر دو تیم حرکت خود را به طور مشابه انجام میدهند و یک نوبت بازی انجام میشود.
بازیکنی که زودتر تمام دزدهای حریف را بگیرد برنده است. اگر حداکثر تعداد نوبتهای بازی تمام شود، کسی که تعداد بیشتری دزد گرفته باشد برنده است. اگر هر دو به یک اندازه دزد گرفته باشند یا در یک نوبت تمام دزدهای حریفشان را بگیرند، کسی که سریعتر آخرین دزد را گرفته باشد. در صورت تساوی آن، کسی که یکیمانده به آخرین دزد را سریعتر گرفته باشد. در صورت تساوی آن، دزد قبلی و … . در صورت مساوی بودن همهی آنها برنده بازی به صورت تصادفی مشخص میشود.
در قسمت کلاینت که شما کد آن را میزنید به صورت زیر میتوانید به متغیرهای بازی دسترسی پیدا کنید.
تغییرات فینال :
۱.در راند های مشخصی که دزد ها نمایان می شوند ، هر پلیس تنها دزد هایی را می بیند که فاصله پیاده(نه مترو و نه تاکسی) کمتر از X داشته باشند.
۲. یکی از دزد ها جوکر می شود . ویژگی های آن به شرح زیر است: حداقل دو پلیس برای دستگیری آن نیاز است (همزمان دو پلیس در خانه جوکر قرار بگیرند) در صورت دستگیری تمام دزد ها شکست میخورند و پلیس ها میبرند شرط ۱ که در بالا ذکر شد برای جوکر با Y برقرار است که Y<X است.
نکته : در صورتی همه دزد دستگیر شوند جوکر دستگیر نشود بازی تمام است ، پس برای اتمام بازی دستگیر جوکر ضرورتی ندارد
۳. یکی از پلیس ها بتمن می شود. ویژگی های آن به شرح زیر است: به تنهایی برای دستگیری جوکر کافی است. از دید همه دزد ها مخفی است مگر این که فاصله پیاده(نه مترو و نه تاکسی) کمتر از Z باشد و Z<X برقرار است.
نکته: متغیرهای X,Y,Z در مپ داده میشود
Variable | Description |
---|---|
GameView.id | آیدی یونیت کنونی |
GameView.turn.turnNumber | نوبت کنونی |
GameView.balance | موجودی پول کنونی |
GameView.node_id | راس که یونیت روی آن قرار دارد |
GameView.turnSettings.maxTurn | ماکزیمم نوبت بازی |
GameView.turnSettings.visibleTurns | نوبتهایی که دزدها برای پلیسها نمایان هستند |
GameView.incomeSetting.policeIncomeEachTurn | میزان افزایش پول پلیس در هر نوبت |
GameView.incomeSetting.thievesIncomeEachTurn | میزان افزایش پول دزد در هر نوبت |
GameView.config.graph | مشخصات مپ بازی(گراف) |
GameView.config.graph.paths | مشخصات یالها به صورت لیستی از آبجکت های Path |
1 | شماره راس ایستگاه شروع پلیسها |
GameView.viewer | مشخصات یونیت |
GameView.viewer.nodeId | راس کنونی یونیت |
GameView.viewer.team | تیم یونیت |
GameView.config.graph.nodesCount | تعداد راسهای گراف |
GameView.config.graph.nodes | مشخصات راسها |
GameView.visibleAgents | تمام یونیتهایی که دیده میشوند |
GameView.chatSettings.chatCostPerCharacter | هزینه چت |
GameView.chatSettings.chatBoxMaxSize | حداکثر طول پیام در چت |
محدودیت زمان هر نوبت برای ایجنتها | 1 ثانیه |