+ محدودیت زمان پایتون: ۲ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
یک بازی تیراندازی اولشخص را تصور کنید؛ در این بازی انواع سلاح وجود دارد و هر سلاح نام، برد، قدرت و اندازۀ گلولۀ منحصربهفردی دارد. از طرفی گلولهها نیز اندازه و آسیب منحصربهفردی دارند که در ادامه آمده است.
## سلاحها
| نام | برد | قدرت | اندازۀ گلوله |
|:----------------:|:-------:|:------------:|:-------------:|
| 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/143421) دانلود کنید.
<details class="blue">
<summary>ساختار فایلها</summary>
```
GunProblemSample.zip
├── Shooter.py
└── ShootingContract.py
```
</details>
# خواستههای مسئله
با توجه به انواع سلاحها و گلولهها کلاس زیر را پیادهسازی کند:
```python
class Shooter:
def set_gun_by_name(self, name: str) -> None:
pass
def add_bullet_of_given_size_to_gun(self, size: float, count: int) -> None:
pass
def shoot_to_target(self, target_x: int, target_y: int, target_distance: int, aim_x: int, aim_y: int) -> float:
pass
```
در بالا، به ترتیب سه متد **انتخاب سلاح**، **اضافهکردن گلوله** و **شلیک به هدف** تعریف شدهاند که به توضیح آنها میپردازیم:
+ متد **انتخاب سلاح** با توجه به ورودی، یک سلاح را انتخاب میکند تا در ادامه از آن استفاده شود.
+ در صورتی که سلاحی با نام داده شده وجود نداشته باشد، باید یک `Exception` پرتاب شود.
+ این متد باید به حرف کوچک و بزرگ حساس باشد؛ به عنوان مثال سلاحی با نام `submachine gun` نداریم.
+ متد **انتخاب گلوله**، گلولههایی را با اندازه و تعداد دادهشده به سلاح اضافه میکند.
+ در صورتی که هر کدام از موارد زیر رخ دهد، باید یک `Exception` پرتاب شود:
+ سلاحی انتخاب نشده باشد.
+ گلوله با اسلحه همخوانی نداشته باشد.
+ تعداد منفی باشد.
+ گلولهای با اندازۀ دادهشده وجود نداشته باشد.
+ متد **شلیک به هدف**، پارامترهای مختصات هدف، فاصله تا آن و مختصات نقطهای که سلاح به آن اشاره میکند را از ورودی دریافت میکند و در خروجی، با استفاده از فرمولی که در ادامه میآید، میزان آسیبی که به هدف میرسد را برمیگرداند.
+ هدف، یک مربع به ضلع ۱۰ است.
+ مختصات گوشۀ پایین-چپ مربع در ورودی داده میشود.
+ برای محاسبۀ خروجی، به صورت زیر عمل میکنیم:
+ اگر برد سلاح از فاصله کمتر باشد، عدد ۰ برگردانده شود.
+ در غیر این صورت، حاصلضرب قدرت اسلحه در آسیب گلوله برگردانده شود.
+ در صورتی که سلاحی انتخاب نشده باشد یا گلولهای نداشته باشد، باید یک `Exception` پرتاب شود.
# مثال
```python
shooter = Shooter()
shooter.set_gun_by_name('Submachine Gun')
shooter.add_bullet_of_given_size_to_gun(0.5, 1)
result = shooter.shoot_to_target(1, 1, 20, 5, 4)
# result should be 10
```
# نکات
- شما تنها مجاز به تغییر در فایل `Shooter.py` هستید. تغییرات در باقی فایلها نادیده گرفته میشود.
- توجه کنید که تمیزی کد مهم و در رتبهبندی نهایی تاثیرگذار است.
- برای ثبت پاسخ، پروژه را با ساختار زیر ارسال کنید.
```
[your-zip-file-name].zip
└── Shooter.py
```