-
Notifications
You must be signed in to change notification settings - Fork 0
/
first_step.py
60 lines (47 loc) · 1.69 KB
/
first_step.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from __future__ import annotations
from typing import Final
class HitPoint:
"""ヒットポイント(HP)を表現するクラス"""
MIN: Final[int] = 0
MAX: Final[int] = 999
def __init__(self, value: int) -> None:
"""
>>> hp = HitPoint(100)
>>> hp = HitPoint(0)
>>> hp = HitPoint(-1)
Traceback (most recent call last):
...
ValueError: 0以上を指定してください
>>> hp = HitPoint(999)
>>> hp = HitPoint(1000)
Traceback (most recent call last):
...
ValueError: 999以下を指定してください
"""
if value < self.MIN:
raise ValueError(f"{self.MIN}以上を指定してください")
if value > self.MAX:
raise ValueError(f"{self.MAX}以下を指定してください")
self.value = value
def damage(self, damage_amount: int) -> HitPoint:
"""ダメージを受ける
>>> HitPoint(100).damage(70)
HitPoint(value=30)
>>> HitPoint(100).damage(108)
HitPoint(value=0)
"""
damaged = self.value - damage_amount
corrected = self.MIN if damaged < self.MIN else damaged
return self.__class__(corrected)
def recover(self, recovery_amount: int) -> HitPoint:
"""回復する
>>> HitPoint(900).recover(70)
HitPoint(value=970)
>>> HitPoint(900).recover(108)
HitPoint(value=999)
"""
recovered = self.value + recovery_amount
corrected = self.MAX if recovered > self.MAX else recovered
return self.__class__(corrected)
def __repr__(self) -> str:
return f"HitPoint(value={self.value})"