.لینکهای مفید برای شرکت در مسابقه:
میتوانید سوالهای خود را از بخش "سوال بپرسید" مطرح کنید.
تیمور عاشق بازی کانتر و شبانه روز مشغول بازی است! برای همین میخواهد حالت خاصی از بازی کانتر (Counter-Strike) را پیاده سازی کند. برای آخرین بار به تیمور کمک کنید تا از این چالش هم عبور کند.
بازی کانتر یک بازی تفنگی اول شخص است، در این بازی ۲ تیم با حداکثر ۱۰ نفر وجود دارد. یک تیم «تروریست» (Terrorist) و یک تیم «ضدتروریست»(Counter-Terrorist) است. بازی «دست» دارد و در هر دست این دو تیم به سمت هم تیراندازی میکنند و میخواهند یکدیگر را نابود کنند. مدت هر «دست» از بازی ۰۲:۱۵:۰۰۰ (۲ دقیقه و ۱۵ ثانیه) است. اگر هیچ کدام از اعضای یک تیم در لحظه پایان یک دست زنده نباشد بازنده است. اگر مدت بازی تمام شود و از هر دو تیم بازیکنی زنده مانده باشد تیم «ضدتروریست» برنده این دست میشود. اگر در یک دست هیچ بازیکنی زنده نباشد (یا حتی هیچ بازیکنی وارد بازی نشده باشد!) تیم ضدتروریست برنده است.
هر بازیکن میتواند حداکثر یک اسلحه از دسته «سنگین» و حداکثر یک اسلحه از دسته «کمری» بخرد، همچنین هر بازیکن به صورت پیشفرض یک «چاقو» دارد. خرید اسلحه فقط در ۴۵ ثانیه اول بازی ممکن است. به عبارت دیگر خریدهای بعد از لحظه 00:45:00
(شامل این لحظه) انجام نمیشود.
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
AK | 2700 | 31 | 100 |
AWP | 4300 | 110 | 50 |
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
Revolver | 600 | 51 | 150 |
Glock-18 | 300 | 11 | 200 |
این سلاح را همه دارند و قابل خریدن نیست، هر بار استفاده از آن باعث کاهش ۴۳ واحدی از جان بازیکن حریف میشود و اگر بازیکنی با این اسلحه کشته شود ۵۰۰ دلار به بازیکنی که ضربه را زده بلافاصله پول داده میشود.
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
M4A1 | 2700 | 29 | 100 |
AWP | 4300 | 110 | 50 |
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
Desert-Eagle | 600 | 53 | 175 |
UPS-S | 300 | 13 | 225 |
این سلاح را همه دارند و قابل خریدن نیست، هر بار استفاده از آن باعث کاهش ۴۳ واحدی از جان بازیکن حریف میشود و اگر بازیکنی با این اسلحه کشته شود ۵۰۰ دلار به بازیکنی که ضربه را زده بلافاصله پول داده میشود.
در ابتدای هر دست، هر کدام از بازیکنان ۱۰۰ واحد جان (health) دارند. (حتی اگر در دست قبل کشته شده باشند دوباره زنده میشوند.) در زمان بازی هر کدام از بازیکنان میتوانند به سمت هم شلیک کنند، در اثر هر شلیک بسته به تفنگی که با آن شلیک شده مقداری از جان بازیکنی که به آن شلیک شده، کاهش پیدا میکند. اگر جان کسی به ۰ برسد میمیرد و از بازی خارج میشود و دیگر توانایی انجام هیچ کاری ندارد. اگر یک بازیکن به هم تیمی خودش شلیک کند چیزی از جان آن کم نمیشود. هر بازیکن پس از کشتن هر بازیکن از تیم حریف، بسته به نوع سلاحش مقداری «پول» کسب میکند. کسی امتیاز کشتن را میگیرد که جان آن بازیکن را برای اولین بار به ۰ برساند. توجه کنید جان هیچ کسی منفی نمیشود. یعنی اگر میزان کاهش جان یک شلیک، بیشتر از مقدار فعلی جان بازیکن مورد هدف باشد، مقدار جان آن بازیکن ۰ میشود.
بازیکنها برای خریدن اسلحهها به پول (money) نیاز دارند. بلافاصله بعد از اضافه شدن هر بازیکن به بازی ۱۰۰۰ دلار به آن بازیکن داده میشود. (ممکن است بازیکنی وسط یک دست به بازی اضافه شود.) بعد از پایان هر دست از بازی به هر کدام از بازیکنان تیم برنده ۲۷۰۰ دلار و به هر کدام از بازیکن تیم بازنده ۲۴۰۰ دلار داده میشود. همچنین حداکثر مقدار پول یک بازیکن ۱۰,۰۰۰ دلار است. یعنی اگر مقدار پولی که به یک بازیکن اضافه میشود، باعث شود که پولهای آن بیشتر از ۱۰,۰۰۰ دلار شود، مقدار پول بازیکن را همان ۱۰,۰۰۰ دلار در نظر میگیریم.
برای نشان دادن اتفاقات بازی در انتهای هر اتفاق یک برچسب زمان که به صورت یک رشته است چاپ میکنیم. فرمت این رشته به صورت mm:ss:ttt
است که زمان را در دقیقه mm
، ثانیه ss
و ttt
میلی ثانیه نشان میدهد. مثلاً 01:48:932
یعنی این اتفاق ۱ دقیقه و ۴۸ ثانیه و ۹۳۲ میلیثانیه بعد از شروع این دست از بازی است. تضمین میشود زمانهای هر دست طوری داده میشود که هیچ دو اتفاقی همزمان رخ ندهد. همچنین هیچوقت در لحظه شروع و پایان دست هیچ اتفاقی نمیافتد. در واقع همه زمانهای اتفاقات بین 00:00:001
و 02:14:999
است. تضمین میشود تمام اتفاقات به ترتیب زمان صعودی است.
زمانهایی که در انتهای گزارش یک اتفاق است از زمان شروع آن دست است در نظرگرفته میشود نه زمان شروع اولین دست بازی. وقتی یک بازیکن بعد از ثانیه 00:03:00
(شامل این لحظه) در یک دست وارد بازی میشود به صورت مرده وارد میشود (اما این مردن جزو تعداد دفعات کشته شدن به حساب نمیآید.) یعنی جان این بازیکن ۰ و پول آن ۱۰۰۰ است و از دست بعدی میتواند فعالیت خود را شروع کند. توجه کنید حتی بازیکنی که از اواسط بازی وارد میشود پولی که بابت بردن یا باختن آن دست بدست میآورد را دریافت میکند. بازیکنان پولهای بدست آورده خود را از یک دست به دست بعدی منتقل میکنند. همه بازیکنها در شروع یک دست جان ۱۰۰ خواهند داشت. مستقل از اینکه در دست قبلی زنده ماندهاند یا کشته شده باشند. بازیکنان زنده اسلحههای خریداری شده خود را از یک دست به دست بعدی میبرند اما بازیکنان مرده اسلحههای خود (به جز چاقو) را در دست بعدی از دست میدهند.
از شما میخواهیم برنامهای بنویسید که با دریافت اطلاعات اتفاقات مختلف بازی، وضعیت بازی و امتیاز بازیکنها را مشخص کند.
بعد از تمام شدن هر دست نام تیم برنده را چاپ کنید. یعنی اگر تیم تروریست برنده این دست است کلمه Terrorist won
و اگر تیم ضدتروریست برنده این دست است کلمه Counter-Terrorist won
را چاپ کنید.
مواردی که داخل <>
قرار داردند یعنی مقدار مناسبی به جای آنها قرار خواهد گرفت.
مواردی که داخل []
با \
جدا میشوند یعنی دقیقاً یکی از این موارد در ورودی میآید.
منظور از سایر موارد همان کلمات با همان کاراکترها است.
<username>
و <gun_name>
: همواره یک رشته به طول حداقل ۱ حداکثر ۲۰ از کاراکتر شامل حروف کوچک و بزرگ انگلیسی ارقام و یا _
و -
است.
<time>
: فرمت این رشته به صورت mm:ss:ttt
است که زمان را در دقیقه mm
، ثانیه ss
و ttt
میلی ثانیه نشان میدهد.
توجه کنید سیستم داوری به کوچک و بزرگ بودن حروف حساس است.
پیاده سازی دستورات این بخش ۲۰ درصد نمره سوال را دریافت خواهید کرد.
ADD-USER
در این درخواست شخصی با نام <username>
در لحظه <time>
به یکی از تیمهای تروریست یا ضدتروریست ملحق میشود.
همواره بعد از <username>
دقیقاً یکی از رشتههای Terrorist
(تروریست) یا Counter-Terrorist
(ضدتروریست) میآید که به ترتیب نشاندهنده تیمای است که این بازیکن به آن ملحق میشود.
در صورتی که مشکلات زیر وجود داشته به ترتیب باید دقیقاً یکی از خطاهای زیر را چاپ کنید. اگر چند مورد باهم به وجود آمد موردی که شماره کمتری دارد باید انجام شود.
you are already in this game
را چاپ کنید. this team is full
را چاپ کنید.this user added to [Terrorist/Counter-Terrorist]
را چاپ کنید و در جای رشته آخر نام تیم را قرار دهید. مثال ورودی از این دستور:
GET-MONEY
در این دستور از شما میخواهیم مقدار پول بازیکن <username>
را در لحظه <time>
چاپ کنید.
اگر بازیکنی با نام کاربری <username>
در این لحظه در بازی وجود ندارد پیام invalid username
را چاپ کنید.
مثال ورودی از این دستور:
GET-HEALTH
در این دستور از شما میخواهیم مقدار جان بازیکن <username>
را در لحظه <time>
چاپ کنید.
اگر بازیکنی با نام کاربری <username>
در این لحظه در بازی وجود ندارد پیام invalid username
را چاپ کنید. توجه کنید اگر این بازیکن مرده باشد مقدار جان آن ۰ است.
مثال ورودی از این دستور:
پیاده سازی دستورات این بخش ۶۰ درصد نمره سوال را دریافت خواهید کرد.
TAP
در این دستور اعلام میکنیم بازیکنی با نام کاربری <attacker>
به بازیکنی با نام کاربری <attacked>
با اسلحه heavy
یا pistol
یا knife
خود در لحظه <time>
ضربه میزند.
<attacker>
یا <attacked>
در این لحظه در بازی وجود ندارند پیام invalid username
را چاپ کنید.<attacker>
قبل از این لحظه کشته شده است، پیام attacker is dead
را چاپ کنید.<attacked>
قبل از این لحظه (نه بخاطر این شلیک) کشته شده است، پیام attacked is dead
را چاپ کنید.<attacker>
اسلحهای با این نوع ندارد، پیام no such gun
را چاپ کنید.<attacker>
و <attacked>
هر دو یک تیم هستند پیام friendly fire
را چاپ کنید. در غیر اینصورت شلیک را ثبت کنید و پیام nice shot
را چاپ کنید.
مثال ورودی از این دستور:
BUY
در این دستور بازیکن <username>
درخواست خریدن تفنگ <gun_name>
را در لحظه <time>
دارد.
<username>
در بازی وجود ندارد پیام invalid username
را چاپ کنید.<username>
زنده نیست پیام deads can not buy
را چاپ کنید.<time>
بعدز از لحظه 00:45:00
(شامل این لحظه) این دستور آمده است پیام you are out of time
را چاپ کنید.<gun_name>
در لیست اسلحههای مجاز تیم خرید کننده نیست پیام invalid category gun
را چاپ کنید.heavy
و کمری pistol
) قبلاً توسط این بازیکن خریداری شده است پیام you have a [heavy/pistol]
را چاپ کنید.no enough money
را چاپ کنید.در صورتی که هیچکدام از اتفاقات فوق نیفتید پیام I hope you can use it
را چاپ کنید و اسلحه را برای این بازیکن ثبت کنید.
مثال ورودی از این دستور:
پیاده سازی دستورات این بخش ۲۰ درصد نمره سوال را دریافت خواهید کرد.
SCORE-BOARD
در این دستور از شما میخواهیم لیست بازیکنهای تیم ضدتروریست و تروریست را چاپ کنید.
برای هر بازیکن مشخصات آن بازیکن را در یک سطر چاپ میکنیم:
که <username>
نامکاربری بازیکن، <kills>
تعداد بازیکنهایی است که در تمام دستهای بازی قبل از لحظه <time>
(شامل همین دست) توسط این بازیکن کشتهشده است. <killed>
تعداد دفعاتی است که این بازیکن در تمام دستها تا قبل از لحظه <time>
(شامل همین دست) توسط بازیکن دیگری کشتهشده است. <rank>
نشان دهنده شماره بازیکن است. یعنی برای بازیکنی که مشخصات آن دفعه اول چاپ میشود عدد ۱، بازیکن دوم عدد ۲ و ... . این شمارهگذاریها برای هر تیم جداست.
مشخصات بازیکنی زودتر چاپ میشود که تعداد <kills>
آن بیشتر باشد، اگر دو بازیکن تعداد <kills>
برابری داشته باشند مشخصات بازیکنی زودتر چاپ میشود که تعداد <killed>
کمتری دارد. اگر دو بازیکن در هر دوی این اعداد برابر بودند بازیکنی زودتر چاپ میشود که زودتر وارد بازی شده باشد.
برای چاپ کردن جدول امتیازات ابتدا عبارت :Counter-Terrorist-Players
را در یک خط چاپ کنید که نشاندهنده این است که میخواهیم بایکنان این تیم را بنویسیم. سپس مشخصات هر کدام از بازیکنان تیم ضدتروریست را مطابق توضیحات فوق در یک سطر چاپ میکنیم. سپس عبارت :Terrorist-Players
را در سطر بعدی چاپ میکنیم و در سطرهای بعدی مشخصات بازیکنان تیم ضدتروریست را چاپ میکنیم.
در سطر اول ورودی عدد صحیح و مثبت آمده است. که نشاندهنده تعداد دستهایی است که در این ورودی آمده است.
برای نشان دادن شروع هر دست در یک سطر کلمه ROUND
میآید. سپس با یک فاصله عدد صحیح و نامنفی میآید که نشاندهنده تعداد دستوراتی است که در این دست اتفاق افتاده است. (توجه کنید مقدار میتواند برابر ۰ باشد اما حداقل یک دستور در کل بازی داریم.)
تضمین میشود تعداد دستورهای ورودی از ۲۰۰۰ بیشتر نخواهد شد.
برای بهتر متوجه شدن ورودیها به مثالهای نمونه توجه کنید.
باید به ازای هر دستور آمده در ورودی خروجی متناظر آن را در یک سطر مجزا چاپ کنید. بعد از پایان هر دست برنده آن دست را چاپ کنید.
یعنی اگر تیم تروریست برنده این دست است عبارت Terrorist won
و در صورتی که تیم ضدتروریست برنده این دست است عبارت Counter-Terrorist won
را در یک سطر مجزا چاپ کنید.