• محدودیت زمان جاوا: ۲ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

یک بازی تیراندازی اول‌شخص را تصور کنید؛ در این بازی انواع سلاح وجود دارد و هر سلاح نام، برد، قدرت و اندازۀ گلولۀ منحصر‌به‌فردی دارد. از طرفی گلوله‌ها نیز اندازه و آسیب منحصربه‌فردی دارند که در ادامه آمده است.

سلاح‌ها

نام برد قدرت اندازۀ گلوله
Submachine Gun 100 10 0.5
Assault Rifle 200 20 1
Pistol 80 8 0.5
Shotgun 50 40 4
Sniper Rifle 1000 30 3

گلوله‌ها

نام اندازه آسیب
A 0.5 1
B 1 1.5
C 3 3
D 4 2

پروژه اولیه

پروژه اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها

GunProblemExample.zip
├── Shooter.java
└── ShootingContract.java
Plain text

خواسته‌های مسئله

با توجه به انواع سلاح‌ها و گلوله‌ها یک کلاس ایجاد کنید که Interface زیر را پیاده‌سازی کند:

public interface ShootingContract {
    void setGunByName(String name) throws Exception;

    void addBulletOfGivenSizeToGun(float size, int count) throws Exception;

    float shootToTarget(int targetX, int targetY, int targetDistance, int aimX, int aimY) throws Exception;
}
Java

در بالا، به ترتیب سه متد انتخاب سلاح، اضافه‌کردن گلوله و شلیک به هدف تعریف شده‌اند که به توضیح آن‌ها می‌پردازیم:

  • متد انتخاب سلاح با توجه به ورودی، یک سلاح را انتخاب می‌کند تا در ادامه از آن استفاده شود.

    • در صورتی که سلاحی با نام داده شده وجود نداشته باشد، باید یک Exception پرتاب شود.
    • این متد باید به حرف کوچک و بزرگ حساس باشد؛ به عنوان مثال سلاحی با نام submachine gun نداریم.
  • متد انتخاب گلوله، گلوله‌هایی را با اندازه و تعداد داده‌شده به سلاح اضافه می‌کند.

    • در صورتی که هر کدام از موارد زیر رخ دهد، باید یک Exception پرتاب شود:
      • سلاحی انتخاب نشده باشد.
      • گلوله با اسلحه هم‌خوانی نداشته باشد.
      • تعداد منفی باشد.
      • گلوله‌ای با اندازۀ داده‌شده وجود نداشته باشد.
  • متد شلیک به هدف، پارامترهای مختصات هدف، فاصله تا آن و مختصات نقطه‌ای که سلاح به آن اشاره می‌کند را از ورودی دریافت می‌کند و در خروجی، با استفاده از فرمولی که در ادامه می‌آید، میزان آسیبی که به هدف می‌رسد را برمی‌گرداند.

    • هدف، یک مربع به ضلع ۱۰ است.
    • مختصات گوشۀ پایین-چپ مربع در ورودی داده می‌شود.
    • برای محاسبۀ خروجی، به صورت زیر عمل می‌کنیم:
      • اگر مختصات نقطه‌ای که سلاح به آن اشاره می‌کند خارج از ابعاد هدف باشد، عدد ۰ برگردانده شود.
      • اگر برد سلاح از فاصله کمتر باشد، عدد ۰ برگردانده شود.
      • در غیر این صورت، حاصل‌ضرب قدرت اسلحه در آسیب گلوله برگردانده شود.
    • در صورتی که سلاحی انتخاب نشده باشد یا گلوله‌ای نداشته باشد، باید یک Exception پرتاب شود.

مثال

public void caseA() {
    ShootingContract implementation = new Shooter();
    implementation.setGunByName("Submachine Gun");
    implementation.addBulletOfGivenSizeToGun(0.5f, 5);
    var damage = implementation.shootToTarget(0, 0, 20, 5, 5);
}
Java

نکات

  • شما تنها مجاز به تغییر در فایل Shooter.java هستید. تغییرات در باقی فایل‌ها نادیده گرفته می‌شود.
  • توجه کنید که تمیزی کد مهم و در رتبه‌بندی نهایی تاثیرگذار است.
  • برای ثبت پاسخ، پروژه را با ساختار زیر ارسال کنید.
[your-zip-file-name].zip
└── Shooter.java
Plain text

ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.