Лъчезар обнови решението на 29.11.2022 16:30 (преди почти 2 години)
+class ChessException(Exception):
+ pass
+
+class KingsError(ChessException):
+ pass
+
+class PawnsError(ChessException):
+ pass
+
+
+
+class ChessPosition():
+ arr = []
+ def __init__(self,FEN):
+ self.FEN = FEN
+
+ self.arr = FEN.split("/")
+
+ w_kings = 0
+ b_kings = 0
+
+ for string in self.arr:
+ for character in string:
+ if(character == 'K'):
+ w_kings += 1
+ if (character == 'k'):
+ b_kings +=1
+
+ try:
+ for i in range(len(self.arr)):
+ for j in range(len(self.arr[i])):
+ if(self.arr[i][j] == 'k'):
+ if i == 0 or i == len(self.arr) - 1 or j == 0 or j == len(self.arr[i]) - 1:
+ if i != 0 and self.arr[i - 1][j] == 'K':
+ raise KingsError
+
+ elif i != (len(self.arr) - 1) and self.arr[i + 1][j] == 'K':
+ raise KingsError
+
+ elif j != 0 and self.arr[i][j - 1] == 'K':
+ raise KingsError
+
+ elif j != len(self.arr[i]) - 1 and self.arr[i][j + 1] == 'K':
+ raise KingsError
+ else:
+ if(self.arr[i][j] == 'k'):
+ if self.arr[i - 1][j] == 'K' or self.arr[i + 1][j] == 'K' or self.arr[i][j - 1] == 'K' or self.arr[i][j + 1] == 'K' or self.arr[i - 1][j - 1] == 'K' or self.arr[i - 1][j + 1]=='K' or self.arr[i + 1][j - 1]=='K' or self.arr[i + 1][j + 1] == 'K':
+ raise KingsError
+
+ if w_kings == 0 or b_kings == 0 or w_kings > 1 or b_kings > 1:
+ raise KingsError
+
+ for character in self.arr[0]:
+ if character == 'P' or character == 'p':
+ raise PawnsError
+
+ except KingsError:
+ print("kings")
+
+ except PawnsError:
+ print("pawns")
+
+
+ def get_black_score(self):
+ score = 0
+ for string in self.arr:
+ for character in string:
+ if(character == 'p'):
+ score += 1
+ elif(character == 'k'):
+ score += 4
+ elif(character == 'q'):
+ score += 9
+ elif(character == 'b'):
+ score += 3
+ elif(character == 'n'):
+ score += 3
+ elif(character == 'r'):
+ score += 5
+ return score
+
+ def get_white_score(self):
+ score = 0
+ for string in self.arr:
+ for character in string:
+ if(character == 'P'):
+ score += 1
+ elif(character == 'K'):
+ score += 4
+ elif(character == 'Q'):
+ score += 9
+ elif(character == 'B'):
+ score += 3
+ elif(character == 'N'):
+ score += 3
+ elif(character == 'R'):
+ score += 5
+ return score
+
+ def white_is_winning(self):
+ if(self.get_black_score() < self.get_white_score()):
+ return True
+
+ return False
+
+ def black_is_winning(self):
+ if(self.get_black_score() > self.get_white_score()):
+ return True
+
+ return False
+
+ def is_equal(self):
+ if(self.get_black_score() == self.get_white_score()):
+ return True
+
+ return False
+
+
+ def __len__(self):
+ num = 0
+ for string in self.arr:
+ for character in string:
+ if character != '8':
+ num += 1
+
+ return num
+
+ def __str__(self):
+ return self.FEN
+
+ def __getitem__(self, position):
+ idk = ord(position[0])
+ num = ord(position[1]) - 48
+
+ if idk >= 97:
+ if idk - 97 >= len(self.arr[8 - num]) or self.arr[8 - num][idk - 97] == '8':
+ return None
+ return self.arr[8 - num][idk - 97]
+ else:
+ if idk - 65 >= len(self.arr[8 - num]) or self.arr[8 - num][idk - 65] == '8':
+ return None
+ return self.arr[8 - num][idk - 65]
+
Моля слагай интервали около равното.
Прието е аргументът да се казва
other
.Това е атрибут на класа, а не на инстанцията, т.е. всички твояи инстанции ще го споделят, т.е. няма да можеш да инстанцираш повече от веднъж, без да счупиш нещо.
Има излишен интервал след
raise
.Бих дефинирал тези координати в накаква променлива, за да може по-лесно да се чете кода.
Не е добре да използваш такива числа без да ги дефинираш в някаква константа, чието име показва какво представлява, или без да ги вземеш динамично по някакъв начин. В момента не е ясно какво е 48, 65, 97... Трябва ми ASCII таблица, за да го разбера.