{{:مسابقه‌ی_چالشی:۱۳۹۴:poster.png?200 |}} ====== سومین مسابقه‌ی چالشی ای‌سی‌ام ====== ^ زمان برگزاری | ۳ دی ۱۳۹۴ | ^ محل برگزاری | دانشگاه صنعتی شریف | ^ مهلت ارسال کد | ۲۸ آذر ۱۳۹۴، ساعت ۲۳:۵۹ | ====== شکارچیان طلا - ۲ ====== در این بازی دو تیم در یک نقشه‌ی شطرنجی با یک‌دیگر بر سر پیدا کردن طلا رقابت می‌کنند. ===== کلیات بازی ===== این بازی بر روی یک نقشه‌ی شطرنجی اجرا می‌شود. بعضی از خانه‌های نقشه حاوی طلا هستند. هر تیم سه دسته بازیکن در زمین دارد. دسته‌ی اول شکارچیان، دسته‌ی دوم جاسوسان و دسته‌ی سوم کارگران که یابندگان طلایند، هستند. هر تیم تعداد مشخصی از هر نوع بازیکن در زمین دارد. شکارچیان مسلح به یک اسلحه هستند که می‌توانند با آن شلیک کنند. کارگرها هم می‌توانند زمین را کندوکاو کنند و طلاها را تصاحب کنند. جاسوسان می‌توانند برای زمانی مشخص از دید سایر بازیکنان پنهان شوند و به جست‌وجو کردن زمین بپردازند. در این بازی هدف هر تیم، جمع‌آوری بیش‌ترین تعداد طلا است. ===== تعاریف اولیه ===== * **نقشه‌ی بازی**: به یک فضای ماتریسی دوبعدی شامل موانع اطلاق می‌شود. ابعاد زمین حداکثر ۱۰۰×۱۰۰ است. * **فضای دید**: فضای دید هر بازیکن به خانه‌های روبه‌روی جهت دید وی (در امتداد یک خط مستقیم) تا اولین مانع اطلاق می‌شود. * **وضعیت خانه‌ها**: وضعیت هر خانه به وجود مانع، تیر یا بازیکن دیگر در آن اطلاق می‌شود. وضعیت خانه شامل وجود طلا نمی‌شود. * **مرحله**: به هر سیکل از بازی یک مرحله گفته می‌شود. یک بازی می‌تواند بین ۲۰۰ تا ۱۰۰۰ مرحله باشد. ===== سناریوی بازی ===== هر بازیکن در هر مرحله، از وضعیت هشت خانه‌ی مجاورش و همچنین از وضعیت تمام خانه‌های فضای دیدش آگاه می‌شود. همچنین تمام بازیکنان از وجود طلا در هشت خانه مجاورشان آگاه می‌شوند اما در باقی فضای دیدشان نمی‌توانند مکان طلا را مشاهده کنند. طلا‌ها در زیر خاک قرار دارند بنابراین کارگرها برای تصاحب طلا باید سه مرحله در خانه‌ی مربوط به طلا بمانند و زمین را بکنند تا به طلا برسد. در صورتی که کارگری در میانه‌ی کار، کندن را رها کند و به خانه‌ی دیگری برود، میزان کنده شدن زمین به همان‌صورت باقی می‌ماند و کارگر دیگر برای رسیدن به طلا کافیست تعداد مراحل باقی‌مانده را بر روی طلا بماند. ===== اطلاعات ورودی ===== اطلاعاتی که در ابتدای بازی در اختیار دو تیم قرار می‌گیرد عبارت است از: * ابعاد زمین بازی * تعداد بازیکنان به تفکیک کارگر و شکارچی‌ و جاسوس * تعداد تیر‌های در اختیار شکارچی هر تیم * تعداد مراحل بازی * تعداد مرحله‌هایی که جاسوس میتواند در طول بازی غیب باشد علاوه بر این در هر مرحله اطلاعات زیر در مورد هر یک از بازیکنان در اختیار تیم مربوطه قرار می‌گیرد: * مکان (مختصات) * جهت دید * وضعیت فضای دید * شرایط وجود طلا در خانه‌های مجاور بازیکن * تعداد تیرهای باقی‌مانده‌ی هر شکارچی * تعداد سیکل‌های باقیمانده از غیب شدن هر جاسوس ===== حرکت بازیکنان ===== در هر مرحله از بازی، هریک از دو تیم مدت زمان یک ثانیه‌ای در اختیار دارند تا حرکات بازیکنان تیم خودی را مشخص کنند. هر بازیکن می‌تواند یکی از حرکات زیر را در یک مرحله انجام دهد: * تغییر جهت بدن بازیکن به یکی از چهار جهت اصلی * حرکت یک خانه‌ای در جهت دید * شلیک تیر در جهت دید (فقط برای شکارچی) * غیب شدن یا ظاهر شدن (فقط برای جاسوس) در صورتی که برای یک بازیکن در یک مرحله چند دستور صادر شود، آخرین دستور انجام می‌شود. شرایط حرکت بازیکن و تیر‌ از قرار زیر است: * سرعت حرکت هر بازیکن، یک خانه در مرحله و سرعت حرکت هر تیر، دوخانه در مرحله است. * دو بازیکن نمی‌توانند همزمان در یک خانه قرار بگیرند. اگر بازیکنی دستور حرکت به خانه‌ای را بدهد که بازیکن دیگری در آن قرار دارد، حرکت وی بی‌نتیجه خواهد ماند. اگر چند بازیکن در یک مرحله فرمان رفتن به یک خانه را بدهند، همه آنها در جای خود باقی خواهند ماند و کسی به آن خانه نمی رود. * اگر دو بازیکن در دو خانه‌ی مجاور همزمان به سمت هم حرکت کنند، حرکت هر دو نتیجه خواهد داد و جای دو بازیکن با یکدیگر تعویض خواهد شد. * تیر بعد از یک مرحله از دستور شلیک، از خانه‌ی شلیک شده شروع به حرکت می‌کند. * تیر در صورت برخورد به اولین مانع یا خروج از نقشه نابود می‌شود. درصورت برخورد تیر به بازیکن (حتی بازیکن خودی)، بازیکن کشته خواهد شد و تیر نیز نابود می‌شود. درصورت برخورد دو تیر به یکدیگر، هردو نابود می‌شوند. * کارگرها با قرار گرفتن در خانه‌های حاوی طلا، از مرحله بعدی شروع به کندن آن خانه می‌کنند. ===== پایان و نتیجه‌ی بازی ===== بازی در شرایط زیر به پایان می‌رسد: * بیش از نیمی از ذخایر طلا توسط یک تیم استخراج شده باشد. * زمان بازی به اتمام رسیده باشد. بعد از پایان بازی، برنده به شرح زیر مشخص می‌شود: * تیمی که تعداد طلای بیش‌تری را جمع‌آوری کرده باشد. * درصورت تساوی تعداد طلا‌ها، تیمی که کمترین کشته را داشته است. * اگر تعداد کشته‌ها نیز برابر بود، تیمی که تعداد گلوله‌های کمتری را استفاده کرده باشد. * اگر تعداد گلوله‌ها نیز برابر بود، بازی بر روی نقشه دیگری تکرار می‌شود. ===== نحوه‌ی اجرا ===== برای اجرای بازی، یک فایل ''jar'' به نام ''GoldHunter'' در اختیار شما قرار گرفته است که شامل کدهای اجرایی بخش سرور و شبکه می‌باشد. برای اجرای بخش سرور بازی کافیست این فایل را اجرا نمایید. java -jar GoldHunter.jar با اجرای این فایل، صفحه اصلی بازی نمایان خواهد شد و برای شروع بازی در انتظار اتصال کلاینت‌ها (دو تیم بازی) خواهد بود. دقت کنید که نقشه بازی می‌بایست درکنار این فایل اجرایی قرار داشته باشد. یک فایل ''jar'' دیگر با نام ''Client'' در اختیار شما قرار گرفته است که شامل کدهای اجرایی کلاینت می‌باشد. پس از اجرای ''GoldHunter'' می‌توانید این فایل را اجرا نمایید. با اجرای این فایل یک تیم به سرور اجرایی متصل می‌شود. بنابراین با دوبار اجرای این فایل می‌توانید بازی را شروع کنید. دقت کنید که فولدر ''Client_lib'' باید درکنار فایل اجرایی باشد علاوه‌براین یک فولدر با نام ''lib'' درکنار ''GoldHunter.jar'' قرار دهید. محتویات این فولدر دقیقاً همان محتویات فولدر ''Client_lib'' است، یعنی فایل ''gson-2.3.jar''. برای اجرای سرور باید جاوا نسخه‌ی ۱.۷ همراه با ''JavaFX'' را نصب شده داشته باشید. ===== واسط برنامه‌نویسی ===== برای پیاده‌سازی کدهای بخش ''client'' یک ''package'' با نام ''client'' نیز در اختیار شما قرار می‌گیرد که می‌توانید با تغییر آن به شرح زیر، تیم خود و الگوریتم اجرایی خود را پیاده‌سازی کنید. برای تست الگوریتم خود می‌توانید پس از اجرای کد سرور (''Gold Hunter'')، تیم رقیب را با اجرای ''client'' و تیم خودی را با اجرای کدهای خود آماده بازی کنید. ==== جاوا ==== یک پروژه جاوا با نام ''ChallengeProject'' در اختیار شما قرار گرفته است. پیاده‌سازی بخش کلاینت می‌بایست در کلاس ''TeamClientAi'' موجود در ''package''ی به نام ''client.java.teamClient'' انجام می‌گیرد. این کلاس دو تابع دارد. یکی ''getTeamName'' که نام تیم خود را در آن برمی‌گردانید و دیگری تابع مهمی به نام ''step'' که این تابع می‌بایست شامل همه کدهای اجرایی شما شود. درهرمرحله از بازی این تابع برای تیم شما اجرا خواهد شد. کلاس ''TeamClientAi'' از کلاس ''ClientGame'' ارث‌بری می‌کند. این کلاس توابع ضروری برای اطلاع از بازی را در اختیار شما قرار می‌دهد. برای اجرای دستورات هر بازیکن نیز می‌بایست از این کلاس استفاده کنید. سه تابع ''rotate'',''move'', ''fire'' برای انجام حرکات اصلی هر بازیکن در این کلاس وجود دارد. برای اجرای کدهای خود کافیست پس از اجرای سرور، کلاس ''TeamClientAi'' را اجرا نمایید. برای کسب اطلاعات بیشتر در مورد کلاس‌ها و توابع موجود می‌توانید این [[https://www.dropbox.com/s/xmt50zf72v0z206/Document.pdf?dl=0|مستند]] را مطالعه کنید. ==== سی ==== کد کلاینت سی در فایل ''C_client'' دراختیار شما قرار گرفته است. کد اصلی خود را می‌بایست در تابعی به نام ''think'' متعلق به کلاس ''PlayerDecision'' بنویسید. برای اجرای کد خود ابتدا لازم است کتابخانه ''boost'' را از [[http://www.boost.org|اینجا]] نصب کنید. از کامپایلر ''g++ 4.9'' به بالا استفاده کنید. بعد از ''make'' کردن با استفاده از دستور زیر کد کلاینت خود را اجرا نمایید. (کد سرور را می‌بایست قبل از این اجرا کرده باشید) ./client host port برای کسب اطلاعات بیشتر در مورد کلاس‌ها و توابع موجود می‌توانید این [[https://www.dropbox.com/s/xmt50zf72v0z206/Document.pdf?dl=0|مستند]] را مطالعه کنید. ===== قوانین کلی ===== * برنامه‌ی ارسالی باید به طور کامل کار تیم شما باشد. * هر گونه تلاش برای استفاده از سایر منابع (نظیر خواندن از فایل‌های دیگر، ایجاد ارتباطات شبکه‌ای، ایجاد پروسس‌های اضافی) منجر به حذف تیم شما خواهد شد. * شما باید [[http://acm.blog.ir|بلاگ ای‌سی‌ام]] را برای آگاهی از هر گونه تغییر به طور منظم چک کنید. * کمیته‌ی مسابقه حق تغییر قوانین مسابقه در هر زمان را برای خود محفوظ می‌دارد. * شما با ارسال کد، موافقت خود را با این قوانین اعلام می‌دارید. ======= مشخصات محیط اجرا ======= قدرت پردازشی‌ای که در اختیار شما قرار میگیرد یک گیگاهرتز و میزان حافظه‌ای که در اختیار دارید ۱ گیگابایت است. ===== دریافت کد ===== * [[https://www.dropbox.com/s/3oz4eynwxt9xmxe/Server.zip?dl=1|سرور]] (۹ آذر ۱۳۹۴) * [[https://www.dropbox.com/s/e8gxmu6pge299du/JAVA_Client.zip?dl=1|کلاینت جاوا]] (۹ آذر ۱۳۹۴) * [[https://www.dropbox.com/s/4pd4jqgn8p0x2f8/CPP_CLIENT.zip?dl=1|کلاینت سی++]] (۲۷ آذر ۱۳۹۴) ===== ارسال برنامه ===== برای ارسال برنامه، کل کد خود را به فرمت zip فشرده نمایید. سپس برای ارسال کدهای خود لازم است مراحل زیر را دنبال کنید: - در [[https://quera.ir|سایت Quera]] یک حساب بسازید. - پس از ورود به سایت، با کلیک روی عکس پروفایل (بالا سمت چپ) و انتخاب نام خود به بخش اطلاعات کابری خورد وارد شوید، در قسمت تیم‌ها یک تیم با نام تیم ACM خود و ایمیل اعضای تیم ACM بسازید. -سپس با کلیک بر روی لوگوی [[https://quera.ir|Quera]] وارد صفحه‌ی اصلی سایت شوید و دکمه‌ی صفحه‌ی مسابقات را انتخاب کنید. -از لیست مسابقات موجود، روی دکمه‌ی «عضویت» مسابقه‌ی «مسابقه‌ی چالشی ACM 2015» کلیک کنید و نام گروه را انتخاب کنید و دکمه‌ی «عضویت در مسابقه» را انتخاب کنید تا به مسابقه اضافه شوید. - در صفحه‌ی مسابقه، فایل zip مذکور را ارسال کنید. می‌توانید هر تعداد دل‌خواه ارسال انجام دهید و در نهایت برنامه‌ای که در سیستم به عنوان «ارسال نهایی» علامت زده باشید کد نهایی شما محسوب می‌شود.