چهارمین مسابقهی چالشی ایسیام
زمان برگزاری | ۲ دی ۱۳۹۵ |
محل برگزاری | دانشگاه صنعتی شریف |
مهلت ارسال کد | ۲۷ آذر ۱۳۹۵، ساعت ۲۳:۵۹ |
ولت
در این بازی دو تیم در یک نقشهی شطرنجی برای کشتن یکدیگر و فتح پرچم تلاش میکنند.
کلیات بازی
این بازی بر روی یک نقشهی شطرنجی اجرا میشود. هر تیم دارای دو بازیکن است. هر بازیکن دارای تعداد محدودی بمب است. در برخی خانههای جدول اشیایی وجود دارد که این اشیا شامل جعبه، دیوار، پرچم و دروازهی توانایی است. هدف این بازی کشتن بازیکنان تیم مقابل است. در صورتی که کسی موفق به این کار نشود، تیمی برنده میشود که مدت زمان بیشتری پرچمهای بازی را در اختیار داشتهباشد.
تعاریف اولیه
نقشهی بازی: به یک فضای ماتریسی دوبعدی شامل اشیا مختلف گفتهمیشود. ابعاد زمین حداکثر ۵۰×۵۰ است.
مرحله: به هر سیکل از بازی یک مرحله گفته میشود. یک بازی میتواند بین ۲۰۰ تا ۱۰۰۰ مرحله باشد.
بمب: ابزاری است که بعد از کاشتهشدن، پس از ۳ مرحله منفجر شده و بعد از انفجار در راستای افقی و عمودی خود تا اندازهی برد خود ولتاژ پخش میکند. به صورت پیشفرض بمبها دارای برد ۲ هستند. در صورتی که ولتاژ یک بمب، بر روی خانهی یک بمب دیگر برود، آن بمب نیز منفجر خواهد شد.
دیوار: در برخی از خانههای جدول وجود دارد. بازیکنها نمیتوانند روی دیوار بروند. ولتاژ هنگامی که به دیوار برسد، از آن عبور نخواهد کرد.
جعبه: در برخی از خانههای جدول وجود دارد. بازیکنها نمیتوانند روی جعبه بروند. ولتاژ هنگامی که به جعبه برسد، از آن عبور نخواهد کرد ولی آن را نابود میکند.
پرچم: در برخی از خانههای جدول وجود دارد. ابتدای بازی پرچمها به رنگ سفید هستند. هنگامی که بازیکنی از یک تیم روی پرچم حضور داشتهباشد، پرچم به رنگ آن تیم میشود و اگر دو بازیکن از دو تیم مختلف روی آن بروند، پرچم سفید میشود. در صورتی که در مرحلهای از بازی بازکنی روی پرچمی نباشد، رنگ پرچم عوض نمیشود. به ازای هر مرحله از بازی به تعداد پرچمهای به رنگ هر تیم، به آن تیم امتیاز داده میشود.
دروازهی توانایی: در برخی از خانههای جدول وجود دارد. بازیکنها با رفتن بر روی این دروازهها، توانایی موجود در آن را به دست میآورند. این توانایی ها ۳ نوع هستند و به صورت تناوبی در مراحل بازی، تغییر میکنند. این تواناییها شامل پرش، جابجایی و انفجار بزرگ هستند. در صورتی که بازیکنی تواناییای را به دست بیاورد، میتواند یکبار از آن استفاده کند و برای دوباره استفاده کردن از آن، باید مجددا آن را به دست بیاورد.
پرش: در صورتی که بازیکنی این توانایی را داشتهباشد، میتواند در یک جهت خاص به مقدار ۳ خانه در جدول در راستای عمودی یا افقی جابجا شود. این جابجایی در صورتی اتفاق میافتد که آن خانهی مورد نظر درون جدول بوده و دیوار، جعبه یا بمب نباشد.
جابجایی: در صورتی که بازیکنی این توانایی را داشتهباشد، میتواند جای خود را با یکی از بمبهای تیم خود عوض کند.
انفجار بزرگ: در صورتی که بازیکنی این توانایی را داشتهباشد، میتواند برد یکی از بمبهای خود را ۴ کند.
بازیکن: هر بازیکن در هر مرحله میتواند یا به یکی از خانههای مجاور ضلعی خود رود، یا در خانهای که حضور دارد بمب بکارد(ابتدای بازی هر بازیکن ۳ بمب دارد) و یا در صورت داشتن توانایی، از آن استفاده کند. بازیکنها میتوانند در مرحلههای بازی، هیچ کاری انجام ندهند. در صورتی که ولتاژ پخش شده توسط یک بمب، به بازیکنی برسد، آن بازیکن میمیرد. در یک خانه از بازی میتواند چند بازیکن همزمان حضور داشتهباشند اما بازیکنها نمیتوانند بر روی خانههای دارای بمب، دیوار یا جعبه بروند.
سناریوی بازی
در هر مرحله از بازی اتفاقات زیر به ترتیب رخ میدهند:
امتیاز پرچمها به تیمها دادهمیشوند.
دستورهای کاشتن بمب اجرا میشوند.
دستورهای راهرفتن بازیکنها اجرا میشوند.
دستورهای استفاده از توانایی اجرا میشوند.
رنگ پرچمها بهروزرسانی میشوند.
تواناییهای بازیکنها بهروزرسانی میشوند.
بمبها منفجر میشوند.
در صورتی که در مرحلهی مضرب ۶ از بازی باشیم، به هر بازیکن از هر تیم، در صورتی که کمتر از ۳ بمب داشتهباشد، یک بمب دادهمیشود.
اطلاعات بازی برای کلاینتها فرستاده میشوند.
اطلاعات ورودی
اطلاعاتی که در ابتدای بازی در اختیار دو تیم قرار میگیرد عبارت است از:
ابعاد زمین بازی
تعداد مراحل بازی
شمارهی تیم
علاوه بر این در هر مرحله اطلاعات زیر در مورد هر یک از بازیکنان در اختیار تیم مربوطه قرار میگیرد:
کل نقشهی بازی
شمارهی مرحلهی بازی
امتیاز هر تیم
به ازای هر شیٔ در نقشه، یک عدد یکتا که نمایانگر هویت آن شیٔ است و مختصات آن شیٔ در جدول داده میشود و به ازای هر کدام از اجزا جزئیات آن نیز ارسال میشود که شامل موارد زیر است:
بازیکن: تیم، تعداد بمب و توانایی آن بازیکن.
بمب: تعداد مراحل باقیمانده تا انفجار و تیم آن.
پرچم: تیم صاحب پرچم. در صورت سفید بودن، صفر برمیگرداند.
دروازهی توانایی: توانایی موجود بر روی این دروازه.
پایان و نتیجهی بازی
بازی در شرایط زیر به پایان میرسد:
بعد از پایان بازی، برنده به شرح زیر مشخص میشود:
در صورتی که تیمی بازیکن داشتهباشد و تیم حریف بازیکنی نداشتهباشد، تیمی که بازیکن دارد برنده است.
در صورتی که تیمی بازیکن نداشتهباشد یا هر دو تیم بازیکن داشتهباشند، تیمی که امتیاز بیشتری دارد برنده است.
اگر طبق شرایط بالا برنده مشخص نشد، بازی بر روی نقشه دیگری تکرار میشود.
دریافت کد
تغییرات
- حل مشکل سرور هنگام استفاده از توانایی پرش
- حل مشکل کلاینت سیپلاسپلاس در نقشههای مستطیلی شکل
- حل مشکل سرور هنگام ارسال دستور برای بازیکنی که دیگر در بازی وجود ندارد.
- حل مشکل کلاینت پایتون در به روزسانی اطلاعات دریافتی از سرور
نحوهی اجرای بازی
ابتدا فایل اجرایی مربوط به سیستم عامل خود را دریافت نمایید. سپس بستهی زیر را دانلود کنید و مراحل زیر را برای اجرا کردن بازی طی کنید.
برای بار اول در فولدر VoltChallenge همهی فایلهای زیپ شده را باز کنید.
برای بار اول در فولدر Volt_Server بروید و دستور pip install -r requirements.txt را اجرا کنید. در صورتی که pip ندارید، آن را برای سیستمعامل خود نصب کنید.
در فولدر Volt_Server دستور python server.py را اجرا کنید.
فایلهای اجرایی مختص سیستمعامل خود که در مراحل قبل دانلود کردید، شامل مانیتور بازی است که هر بار پس از اجرای سرور باید آن را از ابتدا اجرا نمایید. برای اجرای آن در سیستمعاملهای ویندوز و mac کافی است بر روی فایل اجرایی double click کنید و برای سیستمعامل لینوکس دستور chmod +x FILE_NAME را اجرا کنید و پس از آن با اجرا کردن فایل FILE_NAME بازی را اجرا کنید.
حال کافیاست که دو کلاینت، به سرور وصل شوند و بازی با این دو کلاینت آغاز میشود.
نحوهی پیادهسازی کلاینت
در فولدر VoltChallenge به ازای هر زبان یک فایل زیپشده وجود دارد. شما کافیاست دو تابع GET_TEAM_NAME و TURN را در هر زبان پیادهسازی کنید. این دو تابع در فایل TeamAI.java یا team_ai.cpp یا team_ai.py موجود است. نمونههایی از پیادهسازی این دو تابع در فایلهای بالا وجود دارد که میتواند راهنمای مناسبی برای شما باشد. تعدادی تابع برای تعامل با اطلاعات سرور بازی طراحی شدهاست که در فایلهای TeamAIBase در جاوا یا team_ai_helper.cpp و team_ai.h در cpp یا team_ai_helper.py قابل مشاهدهاست و در فایلهای TeamAI.java یا team_ai.cpp یا team_ai.py مستقیما مطابق نمونههای موجود قابل استفادهاند. لیست توابع موجود به شرح زیر هستند:
تابع move: یک player و direction دریافت میکند و در جهت direction دریافتشده برای player درخواست حرکت ارسال میکند. direcion ها میتوانند مقادیر "up", "down", "right", "left" را داشتهباشند.
تابع plant_bomb: یک player دریافت میکند و در مکانی که آن player حضور دارد، درخواست کاشتن بمب میدهد.
تابع use_ability: یک player و param دریافت میکند. در صورتی که ability این player، برابر با blink باشد، param یک direction خواهد بود. در صورتی که swap یا bigbang باشد، مقدار param برابر با uid مربوط به بمبی است که میخواهید روی آن این ability را استفاده کنید.
بهتر است از توابع init_game, pop_tasks و update_game استفاده نکنید. از بقیهی توابع موجود در فایل میتوانید استفاده کنید.
دقت کنید که تابع GET_TEAM_NAME شما فقط یک بار در شروع بازی صدا زده میشود و باید اسم تیم شما را در مسابقات ACM برگرداند. ضمن اینکه تابع TURN نیز در هر مرحله از بازی صدا زده میشود و با توجه به استفادهی شما از توابع move, plant_bomb و use_ability برای سرور دستوراتی ارسال میشود. دقت کنید که تمامی object های مربوط به بازی درون کلاینتهای شما پس از هر مرحله از ابتدا ساختهمیشوند و در صورتی که reference به این object ها دارید، بهتر است در هر مرحله، آنها را با استفاده از توابع کمکی موجود uid آنها، update کنید. در صورتی که برای یک بازیکن چند بار توابع دستوری move, plant_bomb یا use_ability را صدا بزنید، آخرین آنها برای سرور ارسال خواهد شد.
نحوهی اجرای کلاینت cpp
برای کامپایل کد، نسخهی g++ شما باید بیشتر مساوی 4.9 باشد. همچنین شما برای اجرا به asio نیاز دارید که برای نصب آن در لینوکس اوبونتو میتوانید از دستور apt-get install libasio-dev استفادهکنید. پس از طی کردن مراحل بالا، میتوانید با اجرای دستور موجود در فایل compile یک فایل خروحی a.out گرفته و برای run کردن client خود، آنرا اجرا کنید.
نحوهی اجرای کلاینت java
ورژن جاوای شما باید بالای 1.7 باشد. از روی فولدر src پروژهای در IDE دلخواه خود بسازید. سپس فایل java_websocket.jar را به build_path خود اضافه کنید. حال کافیاست فایل client.java را اجرا کنید.
نحوهی اجرای کلاینت python
دستور pip install -r requirements.txt را در فولدر client_python اجرا کنید. سپس با اجرای دستور python client.py میتوانید برنامهی خود را اجرا کنید.
نقشهی بازی
در کنار سرور بازی فایلی با نام main.map وجود دارد که حاوی نقشهی بازی است.
در سطر اول نقشه تعداد مراحل بازی، در سطر دوم طول نقشه و در سطر سوم عرض نقشه است. سپس در ادامه جدولی که نشان میدهد در ابتدا بازی در هر خانه از نقشه چه چیزی قرار دارد آمده است. به ازای هر یک از موجودیتهای بازی از کاراکتری استفاده میشود که در ادامه توضیح داده میشود:
W: دیوار
E: خالی
B: جعبه
F: پرچم
P: دروازهی توانایی
1: بازیکن شماره ۱
2: بازیکن شمارهی ۲
در کنار دروازهی توانایی یک رقم هم آمده است که نشان دهندهی اولین توانایی درون دروازه است. اگر این رقم کوچکتر از ۶ باشد توانایی پرش، اگر برابر ۶ توانایی انفجار بزرگ و در غیر این صورت توانایی جابجایی با بمب در ابتدا در دروازه قرار خواهد داشت.
در صورت بزرگ بودن نقشه، از دکمههای بالا پایین چپ راست کیبورد برای جابجایی در صفحه و a و z برای دور و نزدیک شدن به نقشه میتوانید استفاده کنید.
قوانین کلی
برنامهی ارسالی باید به طور کامل کار تیم شما باشد.
هر گونه تلاش برای استفاده از سایر منابع (نظیر خواندن از فایلهای دیگر، ایجاد ارتباطات شبکهای، ایجاد پروسسهای اضافی) منجر به حذف تیم شما خواهد شد.
شما باید
بلاگ ایسیام را برای آگاهی از هر گونه تغییر به طور منظم چک کنید.
کمیتهی مسابقه حق تغییر قوانین مسابقه در هر زمان را برای خود محفوظ میدارد.
شما با ارسال کد، موافقت خود را با این قوانین اعلام میدارید.
مشخصات محیط اجرا
قدرت پردازشیای که در اختیار شما قرار میگیرد یک گیگاهرتز و میزان حافظهای که در اختیار دارید ۱ گیگابایت است.
ارسال برنامه
برای ارسال برنامه، کل کد خود را به فرمت zip فشرده نمایید. سپس برای ارسال کدهای خود لازم است مراحل زیر را دنبال کنید:
در
سایت کوئرا یک حساب کاربری با نام یکی از اعضای تیم بسازید.
پس از ورود به سایت، با کلیک روی عکس پروفایل (بالا سمت چپ) و انتخاب نام خود به تنظیمات خود وارد شوید، در قسمت تیمها یک تیم با نام تیم ایسیام خود و ایمیل اعضای تیم ایسیام بسازید.
سپس از
لیست مسابقات در سایت کوئرا، روی دکمهی «عضویت» در مسابقهی «چهارمین مسابقهی چالشی ایسیام» کلیک کنید تا به مسابقه اضافه شوید.
در صفحهی مسابقه، فایل zip مذکور را ارسال کنید.
میتوانید هر تعداد دلخواه ارسال انجام دهید و در نهایت برنامهای که در سیستم به عنوان «ارسال نهایی» علامت زده باشید کد نهایی شما محسوب میشود.