Мария обнови решението на 29.11.2022 15:52 (преди почти 2 години)
+class ChessException(Exception):
Можеш да минеш и само с един pass
в тялото на класа, защото този инициализатор реално не прави нищо.
+ def __init__(self, message):
+ self._message = message
+ super().__init__(self._message)
+
+def Score(allfigures):
Ако е с главна буква, очаква се да е клас, а това е функция.
Освен това бих препоръчал тази функция да отиде в класа, който я използва.
+ allpoints = 0
+ lst = range(1, 11)
+ nums = [format(x, '') for x in lst]
+ points = {"r" : 5, "n" : 3, "b" : 3, "k" : 4, "q" : 9, "p" : 1}
+ for i in allfigures:
+ if i not in nums and i!='/':
Липсват интервали около !=
+ allpoints += points[i.lower()]
+ return allpoints
+
+class ChessPosition():
+ def __init__(self, fen):
+ self.fen = fen
+ self._wscore=[]
+ self._bscore=[]
+ _row = 1
+ _column = 0
+ firstKing = 0
Имената на променливите трябва да са в snake_case
.
+ kngsRow = 0
+ kngsClmn = 0
+ raised = 0
+ lst = range(1, 11)
+ nums = [format(x, '') for x in lst]
str(x)
вместо format
+ if fen.count('k') != 1 or fen.count('K')!=1:
+ raise ChessException("kings")
+ for i in fen:
+ if i in nums:
+ _column += int(i)
+ else:
+ _column += 1
+ if i == '/' :
+ _row += 1
+ _column = 0
+ if i.upper() == 'K':
+ if kngsRow != 0:
+ if _row in (kngsRow, kngsRow + 1) and _column in range(kngsClmn - 1, kngsClmn + 2):
+ raise ChessException("kings")
+ else:
+ kngsRow = _row
+ kngsClmn = _column
+ if i.upper() == 'P':
+ if _row == 1 or _row == 8:
+ raise ChessException("pawns")
+ continue
+ def get_white_score(self):
Моля слагай празни редове между методите си.
+ for i in self.fen:
+ if i.isupper() == True:
+ self._wscore.append(i)
+ return Score(self._wscore)
+ def get_black_score(self):
+ for i in self.fen:
+ if i.islower() == True:
+ self._bscore.append(i)
+ return Score(self._bscore)
+ 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 __repr__(self):
+ return self.fen
+ def __len__(self):
+ cntfig = 0
+ lst = range(1, 11)
+ nums = [format(x, '') for x in lst]
+ for i in self.fen:
+ if i not in nums and i!='/':
+ cntfig += 1
+ return cntfig
+ def __getitem__(self, pos):
+ column = 0
+ row = 1
+ lst = range(1, 11)
+ nums = [format(x, '') for x in lst]
+ letters = ["A", "B", "C", "D", "E", "F", "G", "H" ]
+ letter = letters.index(pos[0].upper()) + 1
+ for i in self.fen:
+ if i in nums:
+ column += int(i)
+ else:
+ column += 1
+ if i == '/' :
+ row += 1
+ column = 0
+ if column == letter and row == int(pos[1]):
+ return i
+
+
+class ChessScore():
+ def __init__(self, figures):
+ self.__figures = figures
+ self.Allpoints = Score(self.__figures)
Тук също се очаква да използваш само малки букви, защото е атрибут на клас.
+ def __add__(self, otherChessScore):
+ return self.Allpoints + otherChessScore.Allpoints
+ def __sub__(self, otherChessScore):
+ return self.Allpoints - otherChessScore.Allpoints
+ def __eq__(self, otherChessScore):
+ return self.Allpoints == otherChessScore.Allpoints
+ def __ne__(self, otherChessScore):
+ return self.Allpoints != otherChessScore.Allpoints
+ def __le__(self, otherChessScore):
+ return self.Allpoints <= otherChessScore.Allpoints
+ def __lt__(self, otherChessScore):
+ return self.Allpoints < otherChessScore.Allpoints
+ def __gt__(self, otherChessScore):
+ return self.Allpoints > otherChessScore.Allpoints
+ def __int__(self):
+ return self.Allpoints
+
Добре е да прегледаш PEP8 поне отгоре-отгоре, защото имаш доста пропуски по този фактор.
Можеш да минеш и само с един
pass
в тялото на класа, защото този инициализатор реално не прави нищо.Ако е с главна буква, очаква се да е клас, а това е функция.
Освен това бих препоръчал тази функция да отиде в класа, който я използва.
Липсват интервали около
!=
Имената на променливите трябва да са в
snake_case
.str(x)
вместоformat
Моля слагай празни редове между методите си.
Тук също се очаква да използваш само малки букви, защото е атрибут на клас.