Szachy/move.py
2023-06-19 20:14:10 +02:00

174 lines
8.4 KiB
Python

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.rook_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.bishop_moves(self, piece, row, column)
elif piece.name == 'queen':
pass
Queen.queen_moves(self, piece, row, column,True)
Queen.queen_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