225 lines
10 KiB
Python
225 lines
10 KiB
Python
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 Board:
|
|
def __init__(self):
|
|
self.boardlist = [[0, 0, 0, 0, 0, 0, 0, 0] for x in range(8)]
|
|
#creating board
|
|
for row in range(8):
|
|
for column in range(8):
|
|
self.boardlist[row][column] = Square(row, column)
|
|
self._add_pieces('white')
|
|
self._add_pieces('black')
|
|
|
|
def _add_pieces(self, color):
|
|
if color == 'white':
|
|
self.pawn_row = 6
|
|
self.other_row = 7
|
|
else:
|
|
self.pawn_row = 1
|
|
self.other_row = 0
|
|
#pawns
|
|
#self.boardlist[5][1] = Square(5, 1, King(color)) #DO USUNIĘCIA
|
|
for column in range(8):
|
|
self.boardlist[self.pawn_row][column] = Square(self.pawn_row, column, Pawn(color)) #do kazdego square przypisuje poczatkowy pawn
|
|
#rooks
|
|
self.boardlist[self.other_row][0] = Square(self.other_row, 0, Rook(color))
|
|
self.boardlist[self.other_row][7] = Square(self.other_row, 7, Rook(color))
|
|
#knigths
|
|
self.boardlist[self.other_row][1] = Square(self.other_row, 1, Knight(color))
|
|
self.boardlist[self.other_row][6] = Square(self.other_row, 6, Knight(color))
|
|
#bishops
|
|
self.boardlist[self.other_row][2] = Square(self.other_row, 2, Bishop(color))
|
|
self.boardlist[self.other_row][5] = Square(self.other_row, 5, Bishop(color))
|
|
#queen
|
|
self.boardlist[self.other_row][3] = Square(self.other_row, 3, Queen(color))
|
|
#king
|
|
self.boardlist[self.other_row][4] = Square(self.other_row, 4, King(color))
|
|
|
|
def calc_moves(self, piece, row, column):
|
|
def knight_moves():
|
|
#piece.delete_moves()
|
|
self.possible_moves = [
|
|
(row + 2, column - 1),
|
|
(row + 2, column + 1),
|
|
(row + 1, column + 2),
|
|
(row - 1, column + 2),
|
|
(row - 2, column + 1),
|
|
(row - 2, column - 1),
|
|
(row - 1, column - 2),
|
|
(row + 1, column - 2)
|
|
]
|
|
for self.possible_move in self.possible_moves:
|
|
self.possible_row, self.possible_column = self.possible_move
|
|
if Square.on_board(self.possible_row, self.possible_column):
|
|
if self.boardlist[self.possible_row][self.possible_column].empty_or_rival(piece.color):
|
|
self.final = (self.possible_row, self.possible_column)
|
|
piece.add_moves(self.final)
|
|
def pawn_moves():
|
|
#piece.delete_moves()
|
|
if piece.moved == True:
|
|
self.steps = 1
|
|
else:
|
|
self.steps = 2
|
|
|
|
if self.steps == 2:
|
|
self.final = row + (piece.pawn_direction * (self.steps))
|
|
self.previous = row + (piece.pawn_direction * (self.steps - 1))
|
|
if Square.on_board(self.final, column) is True:
|
|
if self.boardlist[self.final][column].has_piece() is False:
|
|
if self.boardlist[self.previous][column].has_piece() is False:
|
|
piece.add_moves((self.final, column))
|
|
self.steps = 1
|
|
self.final = row + (piece.pawn_direction * (self.steps))
|
|
#problem z wierszem
|
|
#if self.final>7 or self.final<0 or column>7 or column <0:
|
|
#print(piece.name)
|
|
#print(self.final, column)
|
|
if Square.on_board(self.final, column) is True and self.boardlist[self.final][column].has_piece() is False:
|
|
piece.add_moves((self.final, column))
|
|
|
|
#diagonal
|
|
#czy wychodzi poza tablice i czy stoi rywal
|
|
self.possible_row = row + piece.pawn_direction
|
|
self.possible_columns = []
|
|
self.possible_columns = [column-1, column+1]
|
|
for possible_column in self.possible_columns:
|
|
if Square.on_board(self.possible_row, possible_column) is True:
|
|
if self.boardlist[self.possible_row][possible_column].is_rival(piece.color) is True:
|
|
piece.add_moves((self.possible_row, possible_column))
|
|
def straightline_moves(isvertical):
|
|
if isvertical is True:
|
|
self.direction = [
|
|
(0, 1),
|
|
(0, -1),
|
|
(1, 0),
|
|
(-1, 0)]
|
|
else:
|
|
self.direction = [
|
|
(1, 1),
|
|
(-1, -1),
|
|
(1, -1),
|
|
(-1, 1)
|
|
]
|
|
for dir in self.direction:
|
|
self.left, self.right = dir
|
|
self.possible_row = row + self.left
|
|
self.possible_column = column + self.right
|
|
while True:
|
|
if Square.on_board(self.possible_row, self.possible_column) is True:
|
|
if self.boardlist[self.possible_row][self.possible_column].has_piece() is False:
|
|
piece.add_moves((self.possible_row, self.possible_column))
|
|
self.possible_row = self.possible_row + self.left
|
|
self.possible_column = self.possible_column + self.right
|
|
elif self.boardlist[self.possible_row][self.possible_column].is_rival(piece.color) is True:
|
|
piece.add_moves((self.possible_row, self.possible_column))
|
|
break
|
|
else:
|
|
break
|
|
else:
|
|
break
|
|
def king_moves():
|
|
#piece.delete_moves()
|
|
self.direction = [
|
|
(0, 1),
|
|
(0, -1),
|
|
(1, 0),
|
|
(-1, 0),
|
|
(1, 1),
|
|
(-1, -1),
|
|
(1, -1),
|
|
(-1, 1)
|
|
]
|
|
for dir in self.direction:
|
|
self.left, self.right = dir
|
|
self.possible_row = row + self.left
|
|
self.possible_column = column + self.right
|
|
if Square.on_board(self.possible_row, self.possible_column) is True:
|
|
if self.boardlist[self.possible_row][self.possible_column].has_piece() is False:
|
|
piece.add_moves((self.possible_row, self.possible_column))
|
|
elif self.boardlist[self.possible_row][self.possible_column].is_rival(piece.color) is True:
|
|
piece.add_moves((self.possible_row, self.possible_column))
|
|
#calculate possible moves for specific piece
|
|
if piece.name == 'rook':
|
|
#piece.delete_moves()
|
|
straightline_moves(True)
|
|
elif piece.name == 'pawn':
|
|
pawn_moves()
|
|
elif piece.name == 'knight':
|
|
knight_moves()
|
|
elif piece.name == 'bishop':
|
|
#piece.delete_moves()
|
|
straightline_moves(False)
|
|
elif piece.name == 'queen':
|
|
#piece.delete_moves()
|
|
straightline_moves(True)
|
|
straightline_moves(False)
|
|
elif piece.name == 'king':
|
|
king_moves()
|
|
|
|
def move_rival(self, from_row, from_column, to_row, to_column):
|
|
#update
|
|
self.x = self.board.boardlist[from_row][from_column].piece
|
|
self.board.boardlist[from_row][from_column].piece = None
|
|
if (self.board.boardlist[to_row][to_column].has_piece()):
|
|
if (self.board.boardlist[to_row][to_column].piece.name == 'king'):
|
|
self.board.boardlist[to_row][to_column].piece = self.x
|
|
return 1
|
|
self.board.boardlist[to_row][to_column].piece = self.x
|
|
self.board.boardlist[to_row][to_column].piece.moved = True
|
|
self.board.boardlist[to_row][to_column].piece.delete_moves()
|
|
return 0
|
|
|
|
def move_boot(self, color):
|
|
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].piece != None:
|
|
if self.board.boardlist[r][c].piece.color == color:
|
|
self.boot_piece.append(self.board.boardlist[r][c])
|
|
#random piece
|
|
|
|
self.value = random.randrange(0, len(self.boot_piece))
|
|
self.initial = self.boot_piece[self.value]
|
|
while len(self.initial.piece.valid_moves) == 0:
|
|
self.value = random.randrange(0, len(self.boot_piece))
|
|
self.initial = self.boot_piece[self.value]
|
|
self.initial_row=self.initial.row
|
|
self.initial_column = self.initial.column
|
|
#print(self.initial)
|
|
#random move
|
|
self.value = random.randrange(0, len(self.initial.piece.valid_moves))
|
|
self.final = self.initial.piece.valid_moves[self.value]
|
|
self.final_row = self.final[0]
|
|
self.final_column = self.final[1]
|
|
#print(self.final)
|
|
#print(self.final_row)
|
|
#update
|
|
self.x = self.board.boardlist[self.initial_row][self.initial_column].piece
|
|
#print(self.board.boardlist[self.initial_row][self.initial_column].piece.name)
|
|
#print(self.initial_row, self.initial_column)
|
|
self.board.boardlist[self.initial_row][self.initial_column].piece = None
|
|
#print(self.final_row, self.final_column)
|
|
if (self.board.boardlist[self.final_row][self.final_column].has_piece()):
|
|
if (self.board.boardlist[self.final_row][self.final_column].piece.name== 'king'):
|
|
self.board.boardlist[self.final_row][self.final_column].piece = self.x
|
|
return 1
|
|
self.board.boardlist[self.final_row][self.final_column].piece = self.x
|
|
self.board.boardlist[self.final_row][self.final_column].piece.moved = True
|
|
self.board.boardlist[self.final_row][self.final_column].piece.delete_moves()
|
|
#print(self.board.boardlist[self.final_row][self.final_column].piece.name)
|
|
#print(self.initial_row, self.initial_column)
|
|
#print(self.final_row, self.final_column)
|
|
return 0
|
|
|
|
|
|
|
|
|