Ива обнови решението на 29.11.2022 17:34 (преди почти 2 години)
+import re
+
+class ChessException(Exception):
Можеш да минеш и само с един pass
в тялото на класа, защото този инициализатор реално не прави нищо.
+ def __init__(self, message='chess error occured'):
+ super().__init__(message)
+
+class ChessPosition:
+ def __init__(self, fen):
+ self.__validateKings(fen, 'K')
Според мен една долна черта е достатъчно. https://fmi.py-bg.net/tips/2
+ self.__validateKings(fen, 'k')
+ self.__validateKingsPosition(fen)
+ self.__validatePawnsPosition(fen)
+ self.fen = fen
+
+
+ def get_white_score(self):
+ figures = []
+ for idx in range(0, len(self.fen)):
+ element = self.fen[idx]
+ if 'rnbkqp'.find(element) != -1:
+ figures.append(element)
+ return ChessScore(figures)
+
+ def get_black_score(self):
+ figures = []
+ for idx in range(0, len(self.fen)):
+ element = self.fen[idx]
+ if 'RNBKQP'.find(element) != -1:
+ figures.append(element)
+ return ChessScore(figures)
+
+ def white_is_winning(self):
+ return self.get_white_score() > self.get_black_score()
+
+ def black_is_winning(self):
+ return self.get_white_score() < self.get_black_score()
+
+ def is_equal(self):
+ return self.get_white_score() == self.get_black_score()
+
+ def __print__(o):
Доколкото знам такъв дъндър метод няма.
+ print(o.fen)
+
+ def __len__(o):
Прието е аргументът, показващ текущата иснтанция да е self
+ return len(re.sub("[/1-8]", '', o.fen))
+
+ def __getitem__(self, position):
+ row = self.fen.split('/')[ord(position[0]) - ord('A')]
+ for idx in range(0, len(row)):
+ element = row[idx]
+ if idx == position and ('rnbkqp'.find(element) != -1 or 'RNBKQP'.find(element) != -1):
+ return element
+ else:
+ try:
+ int(element)
+ except ValueError:
+ continue
+ idx += int(element)
+ return -1
+
+
+
+ def __validateKings(self, fen, char):
+ idx1 = fen.find(char)
+ idx2 = fen.rfind(char)
+ if idx1 == -1 or idx1 != idx2:
+ raise ChessException('kings')
+
+ def __validateKingsPosition(self, fen):
Моля дефинирай методите със snake_case
+ rows = fen.split('/')
+ for i in range(7):
+ idx1 = rows[i].find('K')
+ idx2 = rows[i].find('k')
+ if idx1 != -1 and idx2 == -1:
+ idx2 = rows[i+1].find('k')
+ if idx1 == -1 and idx2 != -1:
+ idx1 = rows[i+1].find('K')
+ if idx1 != -1 and idx2 != -1 and (abs(idx1 - idx2) == 1 or idx1 - idx2 == 0):
+ raise ChessException('kings')
+
+ idx1 = rows[7].find('K')
+ idx2 = rows[7].find('k')
+ if idx1 != -1 and idx2 != -1 and abs(idx1 - idx2) == 1:
+ raise ChessException('kings')
+
+ def __validatePawnsPosition(self, fen):
+ rows = fen.split('/')
+ idx1 = rows[0].find('p')
+ idx2 = rows[0].find('P')
+ idx3 = rows[7].find('p')
+ idx4 = rows[7].find('P')
+ if idx1 != -1 or idx2 != -1 or idx3 != -1 or idx4 != -1:
+ raise ChessException('pawns')
+
+class ChessScore:
+ def __init__(self, list):
+ self.figures = list
+ self.points = self.__calculatePointsFromFigures(list)
+
+ def __calculatePointsFromFigures(self, list):
+ points = 0
+ for x in list:
+ if x == 'r':
+ points += 5
+ elif x == 'n':
+ points += 3
+ elif x == 'b':
+ points += 3
+ elif x == 'k':
+ points += 4
+ elif x == 'q':
+ points += 9
+ elif x == 'p':
+ points += 1
+ return points
+
+ def __int__(o):
+ return o.points
+
+ def __add__(self, o):
+ return self.points + o.points
+
+ def __sub__(self, o):
+ return self.points - o.points
+
+ def __lt__(self, o):
+ return self.points < o.points
+
+ def __le__(self, o):
+ return self.points <= o.points
+
+ def __eq__(self, o):
+ return self.points == o.points
+
+ def __ne__(self, o):
+ return self.points != o.points
+
+ def __gt__(self, o):
+ return self.points > o.points
+
Можеш да минеш и само с един
pass
в тялото на класа, защото този инициализатор реално не прави нищо.Според мен една долна черта е достатъчно. https://fmi.py-bg.net/tips/2
Доколкото знам такъв дъндър метод няма.
Прието е аргументът, показващ текущата иснтанция да е
self
Моля дефинирай методите със
snake_case