Димитър обнови решението на 27.11.2022 16:12 (преди почти 2 години)
+import re
+
+
+class ChessException(Exception):
+ def __init__(self, ex_message):
Като цяло можеш да минеш и без __init__
. Един pass
в талото на класа е достатъчен.
+ super().__init__(ex_message)
+ self.message = ex_message
+
+
+class ChessScore:
+ def __init__(self, figures_definitions):
+ self.figures = [x.lower() for x in figures_definitions]
+
+ def __int__(self):
+ figures_points = {'p': 1, 'k': 4, 'q': 9, 'b': 3, 'n': 3, 'r': 5}
По-скоро бих изчислил това и бих го записал като атрибут на иснтанцията, за да не се налага да го преичислявам при всяко извикване на функцията.
+ points = 0
+
+ for figure in self.figures:
+ points += figures_points[figure]
+
+ return points
+
+ def __lt__(self, other):
+ return int(self) < int(other)
+
+ def __gt__(self, other):
+ return int(self) > int(other)
+
+ def __le__(self, other):
+ return int(self) <= int(other)
+
+ def __eq__(self, other):
+ return int(self) == int(other)
+
+ def __ne__(self, other):
+ return int(self) != int(other)
+
+ def __add__(self, other):
+ return int(self) + int(other)
+
+ def __sub__(self, other):
+ return int(self) - int(other)
+
+
+class ChessPosition:
+ def __init__(self, definition):
+ self.__set_definition(definition)
+ self.white_figures_points = self.__calculate_points(('P', 'R', 'N', 'B', 'Q', 'K'))
+ self.black_figures_points = self.__calculate_points(('p', 'r', 'n', 'b', 'q', 'k'))
+
+ def __set_definition(self, definition):
+
+ if definition.count('k') != 1 or definition.count('K') != 1:
+ raise ChessException('kings')
+
+ if len(re.findall(r'[kK][a-zA-Z\/]{7,9}[kK]', definition)) != 0 or len(re.findall(r'kK|Kk', definition)) != 0:
+ raise ChessException('kings')
+
+ if (definition.split('/')[0].lower().count('p') != 0) or (definition.split('/')[7].lower().count('p') != 0):
+ raise ChessException('pawns')
+
+ self.fen_definition = definition
+
+ def __calculate_points(self, figures):
+ figures_points = {'p': 1, 'k': 4, 'q': 9, 'b': 3, 'n': 3, 'r': 5}
+ result = 0
+
+ for figure in self.fen_definition:
+ if figure in figures:
+ result += figures_points[figure.lower()]
+
+ return result
+
+ def white_is_winning(self):
Идеята зад ChessScore
беше да се използва и за тези методи, но реално твоята имплементация не е проблем за тестовете. Просто споменавам.
+ return self.white_figures_points > self.black_figures_points
+
+ def black_is_winning(self):
+ return self.black_figures_points > self.white_figures_points
+
+ def is_equal(self):
+ return self.white_figures_points == self.black_figures_points
+
+ def get_white_score(self):
+ return ChessScore(self.__get_score(('P', 'R', 'N', 'B', 'Q', 'K')))
+
+ def get_black_score(self):
+ return ChessScore(self.__get_score(('p', 'r', 'n', 'b', 'q', 'k')))
+
+ def __get_score(self, figures):
+ result = []
+
+ for figure in self.fen_definition:
+ if figure in figures:
+ result.append(figure)
+
+ return result
+
+ def __str__(self):
+ return self.fen_definition
+
+ def __len__(self):
+ return len(re.findall(r'[RNBQKPrnbqkp]', self.fen_definition))
+
+ def __getitem__(self, key):
+ columns_indexes = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7}
+
+ rows = self.fen_definition.split('/')
+ row_idx = len(rows) - int(key[1])
+ col_idx = columns_indexes[key[0]]
+ figure = rows[row_idx][col_idx]
+
+ if figure in ('P', 'R', 'N', 'B', 'Q', 'K') or figure in ('p', 'r', 'n', 'b', 'q', 'k'):
+ return figure
+
+ return None
Като цяло можеш да минеш и без
__init__
. Единpass
в талото на класа е достатъчен.По-скоро бих изчислил това и бих го записал като атрибут на иснтанцията, за да не се налага да го преичислявам при всяко извикване на функцията.
Идеята зад
ChessScore
беше да се използва и за тези методи, но реално твоята имплементация не е проблем за тестовете. Просто споменавам.