+ محدودیت زمان جاوا: ۲ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
یک بازی تیراندازی اولشخص را تصور کنید؛ در این بازی انواع سلاح وجود دارد و هر سلاح نام، برد، قدرت و اندازۀ گلولۀ منحصربهفردی دارد. از طرفی گلولهها نیز اندازه و آسیب منحصربهفردی دارند که در ادامه آمده است. 
## سلاحها
|         نام       | برد | قدرت | اندازۀ گلوله |
|:----------------:|:-------:|:------------:|:-------------:|
| 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      |
# پروژه اولیه
پروژه اولیه را از [این لینک](https://quera.org/contest/assignments/41562/download_problem_initial_project/139999) دانلود کنید.
<details class="blue">
<summary>ساختار فایلها</summary>
```
GunProblemExample.zip
├── Shooter.java
└── ShootingContract.java
```
</details>
# خواستههای مسئله
با توجه به انواع سلاحها و گلولهها یک کلاس ایجاد کنید که `Interface` زیر را پیادهسازی کند:
```java
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` پرتاب شود.
# مثال
```java
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
```