- محدودیت زمان جاوا: ۲ ثانیه
 - محدودیت حافظه: ۲۵۶ مگابایت
 
یک بازی تیراندازی اولشخص را تصور کنید؛ در این بازی انواع سلاح وجود دارد و هر سلاح نام، برد، قدرت و اندازۀ گلولۀ منحصربهفردی دارد. از طرفی گلولهها نیز اندازه و آسیب منحصربهفردی دارند که در ادامه آمده است.
سلاحها
| نام | برد | قدرت | اندازۀ گلوله | 
|---|---|---|---|
| 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
خواستههای مسئله
با توجه به انواع سلاحها و گلولهها یک کلاس ایجاد کنید که 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;
}
در بالا، به ترتیب سه متد انتخاب سلاح، اضافهکردن گلوله و شلیک به هدف تعریف شدهاند که به توضیح آنها میپردازیم:
- 
متد انتخاب سلاح با توجه به ورودی، یک سلاح را انتخاب میکند تا در ادامه از آن استفاده شود.
- در صورتی که سلاحی با نام داده شده وجود نداشته باشد، باید یک 
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);
}
نکات
- شما تنها مجاز به تغییر در فایل 
Shooter.javaهستید. تغییرات در باقی فایلها نادیده گرفته میشود. - توجه کنید که تمیزی کد مهم و در رتبهبندی نهایی تاثیرگذار است.
 - برای ثبت پاسخ، پروژه را با ساختار زیر ارسال کنید.
 
[your-zip-file-name].zip
└── Shooter.java
ارسال پاسخ برای این سؤال