Дуйгу обнови решението на 28.11.2022 23:56 (преди почти 2 години)
+
+chess_piece = ('R', 'N', 'B', 'Q', 'K', 'P')
+scores = {'R': 5, 'N': 3, 'B': 3, 'Q': 9, 'K': 4, 'P': 1}
+
+
+class ChessException(Exception):
+ pass
+
+
+def get_chess_board(string_board: str):
Добре е това да е в класа, който го използва.
+ chess_board = [[]] # will use - for spare places
+ n = 0
+ for char in string_board:
+ if char != '/':
+ if char in chess_piece or char.upper() in chess_piece:
+ chess_board[n].append(char)
+ elif ord(char) in range(49, 57):
Това са цифрите ли? Трудно е да разбереш код, който е замаскиран зад кодове на символи. Може би if char in '12345678'
ще свърши работа?
+ for k in range(int(char)):
+ chess_board[n].append('-')
+ else:
+ raise ChessException("Incorrect input")
+ else:
+ if len(chess_board[n]) != 8:
+ raise ChessException("Incorrect input")
+ chess_board.append([])
+ n += 1
+ if len(chess_board) != 8:
+ raise ChessException("Incorrect input")
+ if invalidate_kings(chess_board) and invalid_pawns(chess_board):
Спрямо условието, изключението за пешки трябва да е с различен текст от това за царе.
+ raise ChessException("kings")
+ return chess_board
+
+
+def invalidate_kings(chess_board):
+ king_positions = []
+ for i in range(len(chess_board)):
+ for j in range(len(chess_board[i])):
+ if chess_board[i][j] == 'K' or chess_board[i][j] == 'k':
+ if king_positions and king_positions[0][2] == chess_board[i][j]:
+ raise ChessException("kings")
+ else:
+ king_positions.append([i, j, chess_board[i][j]])
+ if len(king_positions) != 2:
+ raise ChessException("kings")
+ # first king -[king_positions[0][0], king_positions[0][1]] --> i, j
+ # second king -[king_positions[1][0], king_positions[1][1]] --> i1, j1
+ # invalid --> (i = i1, j1 = j +-1) (i1 = i + 1, j1 = j +-1) (i1 = i - 1, j1 = j+-1) (j = j1, i1 = i +-1
+ return ((king_positions[0][0] == king_positions[1][0] or king_positions[1][0] == king_positions[0][0] + 1 or
Това е прекалено много. Много по-чисто ще е, ако дефинираш тези координати отделно и завъртиш един цикъл по тях.
+ king_positions[1][0] == king_positions[0][0] - 1)
+ and (king_positions[1][1] == king_positions[0][1] - 1 or king_positions[1][1] == king_positions[0][1] + 1)
+ and ((king_positions[1][1] == king_positions[0][1]) and (king_positions[0][0] == king_positions[1][0] - 1 or
+ king_positions[0][0] == king_positions[1][0] + 1)))
+
+
+def invalid_pawns(chess_board):
+ for i in chess_board[0] + chess_board[7]:
Можеш и if 'p' in chess_board[0] + chess_board[7]
+ if i == 'p' or i == 'P':
+ return True
+ return False
+
+
+class ChessPosition:
+ def __init__(self, fen: str):
+ my_fen = fen.split()
+ self._chess_board = get_chess_board(my_fen[0])
+ self._white_score = 0
+ self._black_score = 0
+ for row in self._chess_board:
+ for element in row:
+ if element in chess_piece:
+ self._white_score += scores[element]
+ elif ord(element) > 96 and element.upper() in chess_piece:
+ self._black_score += scores[element.upper()]
+
+ def get_white_score(self):
+ return self._white_score
+
+ def get_black_score(self):
+ return self._black_score
+
+ def white_is_winning(self):
+ return self._white_score > self._black_score
+
+ def black_is_winning(self):
+ return self._black_score > self._white_score
+
+ def is_equal(self):
+ return self._white_score == self._black_score
+
+ def __getitem__(self, key):
+ if self._chess_board[8 - int(key[1])][ord(key[0]) - ord('A')] == '-':
Този израз, който взима символа, си написала два пъти, така че по-добре да отиде в отделна променлива.
+ return None
+ return self._chess_board[8 - int(key[1])][ord(key[0]) - ord('A')]
+
+
+class ChessScore:
Моля убеди се, че класът имплементира всички условия за операции с инстанциите му.
+ def __init__(self, figures: list[str]):
+ self._score = 0
+ for figure in figures:
+ if figure.upper() in scores.keys():
+ self._score += scores[figure.upper()]
+ else:
+ raise ChessException("This figure does not exist")
+
+ def get_score(self):
+ return self._score
+
+ def __lt__(self, other):
+ return self._score < other.get_score()
+
+ def __le__(self, other):
+ return self._score <= other.get_score()
+
+ def __eq__(self, other):
+ return self._score == other.get_score()
+
+ def __ne__(self, other):
+ return self._score != other.get_score()
+
+ def __gt__(self, other):
+ return self._score > other.get_score()
+
+ def __ge__(self, other):
+ return self._score >= other.get_score()
+
+ def __add__(self, other):
+ return self._score + other.get_score()
+
+ def __sub__(self, other):
+ return self._score - other.get_score()
+
+
Добре е това да е в класа, който го използва.
Това са цифрите ли? Трудно е да разбереш код, който е замаскиран зад кодове на символи. Може би
if char in '12345678'
ще свърши работа?Моля убеди се, че класът имплементира всички условия за операции с инстанциите му.