forked from Stals/PythonRPG
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMoney.py
More file actions
157 lines (131 loc) · 4.2 KB
/
Money.py
File metadata and controls
157 lines (131 loc) · 4.2 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#NOTE перед операциями - + , нужно проверять хватает ли денег с помощью > < >= <=
class Money: #TODO сделать Exceptions Если при вычетании и сложении
"""
Класс Money позволяет хранить и производить операции над деньгами
100 бронзы = 1 серебро
100 серебра = 1 золото
Серебро и бронза должны быть инициализировано числом от 0 до 99 ,
а золото любым числом от 0.
Сложение и вычитание бронзы может менять серебро, а серебра - золото
"""
def __init__(self, gold=0, silver=0, bronze=0):
if gold>=0:
self.gold = gold
else:
raise Exception("Wrong gold value!\nShould be >= 0.")
if 100 > silver >= 0:
self.silver = silver
else:
raise Exception("Wrong silver value!\nShould be between 0 and 99.")
if 100 > silver >=0:
self.bronze = bronze
else:
raise Exception("Wrong bronze value!\nShould be between 0 and 99.")
## returns a copy of gold so that class variable would not be changed
def getGold(self):
return self.gold[:]
## returns a copy of silver so that class variable would not be changed
def getSilver(self):
return self.silver[:]
## returns a copy of bronze so that class variable would not be changed
def getBronze(self):
return self.bronze[:]
## Возвращает кол-во денег в виде бронзы
def toBronze(self):
return self.gold*100*100 + self.silver*100 + self.bronze
## Конвертирует Бронзу в серебро и золото
def fromBronze(self, bronze):
_gold = 0
_silver = 0
_bronze = 0
while bronze >= 100*100:
_gold += 1
bronze -= 100*100
while bronze >= 100:
_silver += 1
bronze -= 100
_bronze = bronze
return Money(_gold, _silver, _bronze)
## Возвращет кол-во денег в виде строки
def __str__(self):
return "{0} gold {1} silver {2} bronze".format(self.gold, self.silver, self.bronze)
# >=
def __ge__(self, other): #Question mb проверять хватает ли золота перед конвертацией
# Сравним Кол-во денег в Бронзовом эквиваленте
if self.toBronze() >= other.toBronze():
return True
else:
return False
# >
def __gt__(self, other):
return not self.__le__(other)
# <
def __lt__(self, other):
return not self.__ge__(other)
# <=
def __le__(self, other):
# Сравним Кол-во денег в Бронзовом эквиваленте
if self.toBronze() <= other.toBronze():
return True
else:
return False
# +
def __add__(self, other):
self.bronze += other.bronze
if self.bronze > 100:
self.bronze -= 100
self.silver += 1
self.silver += other.silver
if self.silver > 100:
self.silver -= 100
self.gold += 1
self.gold += other.gold
return self
# +=
def __iadd__(self, other):
self.__add__(other)
return self
# -
def __sub__(self, other):
self.bronze -= other.bronze
if self.bronze < 0:
self.bronze += 100
self.silver -= 1
self.silver -= other.silver
if self.silver < 0:
self.silver += 100
self.gold -= 1
self.gold -= other.gold
return self
# -=
def __isub__(self, other):
self.__sub__(other)
return self
# / - Делит на int, а не на другой объект класса Money
# Например "Money(1,0,0) / 2" должен вернуть "Money(0,50,0)"
def __truediv__(self, other):
_bronze = round(self.toBronze() / other)
return self.fromBronze(_bronze)
# /=
def __itruediv__(self, other):
self.__truediv__(other)
return self
# * - Умножает на int ,а не на другой объект класса Money
def __mul__(self, other):
_bronze = self.toBronze() * other
return self.fromBronze(_bronze)
# *=
def __imul__(self, other):
self.__mul__(other)
return self
# ==
def __eq__(self, other):
if self.gold == other.gold and\
self.silver == other.silver and\
self.bronze == other.bronze:
return True
else:
return False
# !=
def __ne__(self, other):
return not self.__eq__(other)