from board import Board from square import Square from pawn import Pawn from knight import Knight from bishop import Bishop from rook import Rook from queen import Queen from king import King import random class Move: def move_rival(self, ruch): self.from_column = Move.letters_to__numbers(ruch[0]) self.from_row = int(ruch[1]) self.to_column = Move.letters_to__numbers(ruch[3]) self.to_row = int(ruch[4]) #update board self.x = self.board.boardlist[self.from_row][self.from_column].piece self.board.boardlist[self.from_row][self.from_column].piece = None self.board.boardlist[self.to_row][self.to_column].piece = self.x Move.pawn_promotion(self, self.x, self.to_row) self.board.boardlist[self.to_row][self.to_column].piece.moved = True return self.board.boardlist[self.to_row][self.to_column].piece.color def move_boot(self, color): self.initial_row, self.initial_column, self.final_row, self.final_column = Move.random_valid_move(self, color) self.x=self.board.boardlist[self.initial_row][self.initial_column].piece self.board.boardlist[self.initial_row][self.initial_column].piece = None Move.mat(self, self.x, self.final_row, self.final_column) self.board.boardlist[self.final_row][self.final_column].piece = self.x Move.pawn_promotion(self, self.x, self.final_row) # update piece self.board.boardlist[self.final_row][self.final_column].piece.moved = True self.board.boardlist[self.final_row][self.final_column].piece.delete_moves() self.initial_column = Move.numbers_to_letters(self.initial_column) self.final_column = Move.numbers_to_letters(self.final_column) self.ruch = str(self.initial_column) + str(self.initial_row) + ' ' + str(self.final_column) + str( self.final_row) return self.ruch def random_valid_move(self, color): #usuwanie ruchów z valid_moves, które mogłyby doprowadzić do szachowania króla self.boot_piece = [] self.piece_row_column = [] for r in range(0, 8): for c in range(0, 8): if self.board.boardlist[r][c].has_piece(): if self.board.boardlist[r][c].piece.color != color: self.kopia = [] for move in self.board.boardlist[r][c].piece.valid_moves: if Move.check_szach(self, color, r, c, move[0], move[1]) is False: self.kopia.append(move) self.board.boardlist[r][c].piece.valid_moves=self.kopia #spis pól z figurami, które mają możliwość ruchu for r in range(8): for c in range(8): if self.board.boardlist[r][c].has_piece() and self.board.boardlist[r][c].piece.color != color: if (len(self.board.boardlist[r][c].piece.valid_moves)>0): self.boot_piece.append(self.board.boardlist[r][c]) if (len(self.boot_piece)==0): print("MAT") exit(0) #losowanie figury self.value = random.randrange(0, len(self.boot_piece)) self.initial_square = self.boot_piece[self.value] #losowanie ruchu figury self.move_initial_row = self.initial_square.row self.move_initial_column = self.initial_square.column self.value = random.randrange(0, len(self.initial_square.piece.valid_moves)) self.move_final_square = self.initial_square.piece.valid_moves[self.value] self.move_final_row = self.move_final_square[0] self.move_final_column = self.move_final_square[1] return self.move_initial_row, self.move_initial_column, self. move_final_row, self.move_final_column #, self.x def calc_moves(self, piece, row, column): #piece.delete_moves() piece.valid_moves=[] if piece.name == 'rook': Rook.straightline_moves(self, piece, row, column) pass elif piece.name == 'pawn': Pawn.pawn_moves(self, piece, row, column) pass elif piece.name == 'knight': Knight.knight_moves(self, piece, row, column) elif piece.name == 'bishop': pass Bishop.straightline_moves(self, piece, row, column) elif piece.name == 'queen': pass Queen.straightline_moves(self, piece, row, column,True) Queen.straightline_moves(self, piece, row, column,False) elif piece.name == 'king': King.king_moves(self, piece, row, column) pass def pawn_promotion(self, x, final_row): if x.name == "pawn": if (final_row == 0) or (final_row == 7): x.name = "queen" def mat(self, x, final_row, final_column): if self.board.boardlist[final_row][final_column].has_piece(): if self.board.boardlist[final_row][final_column].piece.name == 'king': exit(0) pass def check_szach(self, color, initial_row, initial_column, final_row, final_column): #zapisanie poprzedniego ustawienia tablicy i wykonanie ruchu self.piece = self.board.boardlist[initial_row][initial_column].piece self.previous_piece = self.board.boardlist[final_row][final_column].piece self.board.boardlist[initial_row][initial_column].piece = None self.board.boardlist[final_row][final_column].piece = self.piece for r in range(8): for c in range(8): if self.board.boardlist[r][c].has_piece(): if self.board.boardlist[r][c].piece.color == color: Move.calc_moves(self, self.board.boardlist[r][c].piece, r, c) elif self.board.boardlist[r][c].piece.name=='king': self.king_position = (r, c) for r2 in range(8): for c2 in range(8): if self.board.boardlist[r2][c2].has_piece(): if self.board.boardlist[r2][c2].piece.color == color: if self.king_position in self.board.boardlist[r2][c2].piece.valid_moves: self.board.boardlist[final_row][final_column].piece=self.previous_piece self.board.boardlist[initial_row][initial_column].piece= self.piece for rowxd2 in range(8): for columnxd2 in range(8): if self.board.boardlist[rowxd2][columnxd2].has_piece(): if self.board.boardlist[rowxd2][columnxd2].piece.color == color: Move.calc_moves(self, self.board.boardlist[rowxd2][columnxd2].piece, rowxd2,columnxd2) return True self.board.boardlist[final_row][final_column].piece = self.previous_piece self.board.boardlist[initial_row][initial_column].piece = self.piece for rowxd in range(8): for columnxd in range(8): if self.board.boardlist[rowxd][columnxd].has_piece(): if self.board.boardlist[rowxd][columnxd].has_piece(): if self.board.boardlist[rowxd][columnxd].piece.color == color: Move.calc_moves(self, self.board.boardlist[rowxd][columnxd].piece, rowxd, columnxd) return False @staticmethod def numbers_to_letters(number): if number == 0: number = "A" elif number == 1: number = "B" elif number == 2: number = "C" elif number == 3: number = "D" elif number == 4: number = "E" elif number == 5: number = "F" elif number == 6: number = "G" elif number == 7: number = "H" return number @staticmethod def letters_to__numbers(letter): if letter == 'A': letter = 0 elif letter == 'B': letter = 1 elif letter == 'C': letter = 2 elif letter == 'D': letter = 3 elif letter == 'E': letter = 4 elif letter == 'F': letter = 5 elif letter == 'G': letter = 6 elif letter == 'H': letter = 7 return letter