This commit is contained in:
Agata Halik 2023-06-22 23:51:41 +02:00
parent 861fa8c9b4
commit 3310217728
10 changed files with 44 additions and 25 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,9 @@ from square import Square
from piece import Piece
class Board:
def __init__(self):
#utworzenie listy przechowującej obiekty square
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):

13
game.py
View File

@ -62,17 +62,18 @@ class Game:
self.b.append('H')
print(self.b)
print('')
def currently_available_moves(self):
def currently_available_moves(self): #obliczenie dostępnych ruchów dla wszystkich figur
for row in range(8):
for column in range(8):
if self.board.boardlist[row][column].has_piece():
self.piece = self.board.boardlist[row][column].piece
Move.calc_moves(self, self.piece, row, column)
def nextMove(self, ruch):
self.currently_available_moves()
#sprawdzenie ruchu przeciwnika
if ruch == None:
return Move.move_boot(self, 'black')
else:
self.color = Move.move_rival(self, ruch)
self.currently_available_moves()
return Move.move_boot(self, self.color)
return Move.move_boot(self, 'black') #wykonanie naszego ruchu i zwrócenie go
else:
self.color = Move.move_rival(self, ruch) #wykonanie ruchu rywala, funkcja zwaraca kolor rywala
self.currently_available_moves()
return Move.move_boot(self, self.color) #wykonanie naszego ruchu i zwrócenie go

47
move.py
View File

@ -24,49 +24,61 @@ class Move:
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):
#random move
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
#update board
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.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)
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 = []
self.amount_of_pieces = 0
# usuwanie ruchów z valid_moves, które mogłyby doprowadzić do szachowania króla
# usuwanie ruchów z valid_moves, które nie ochronią szachowanego króla przed matem
for r in range(0, 8):
for c in range(0, 8):
if self.board.boardlist[r][c].has_piece():
self.amount_of_pieces = self.amount_of_pieces +1
self.amount_of_pieces = self.amount_of_pieces + 1
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
if self.amount_of_pieces == 2:
if self.amount_of_pieces == 2: #jeśli na planszy zostaną tylko dwa króle to kończy się gra
exit(0)
#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])
#pat
#jeśli nie ma żadnego dostępnego ruchu który nie doprowadziłby do szachowania króla
#lub obronił króla (jeśli król jest szachowany) przed matem, to kończy się gra
if len(self.boot_piece) == 0:
exit(0)
#losowanie figury
#losowanie figury z figur z dostępnymi ruchami
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
@ -74,6 +86,7 @@ class Move:
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
def calc_moves(self, piece, row, column):
piece.delete_moves()
@ -102,15 +115,17 @@ class Move:
def mat(self, 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':
print("mat")
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
#szukanie króla i liczenie dostępnych ruchów dla każdego pionka
for r in range(8):
for c in range(8):
if self.board.boardlist[r][c].has_piece():
@ -118,19 +133,23 @@ class Move:
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)
#szukanie króla w możliwych ruchach przeciwnika
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:
#przywracanie poprzednich ustawień tablicy z pionkami
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)
for r4 in range(8):
for c4 in range(8):
if self.board.boardlist[r4][c4].has_piece():
if self.board.boardlist[r4][c4].piece.color == color:
Move.calc_moves(self, self.board.boardlist[r4][c4].piece, r4, c4)
return True
#przywracanie poprzednich ustawień tablicy z pionkami
self.board.boardlist[final_row][final_column].piece = self.previous_piece
self.board.boardlist[initial_row][initial_column].piece = self.piece
for r3 in range(8):

View File

@ -2,8 +2,8 @@ class Piece:
def __init__(self, name, color):
self.name = name
self.color = color
self.valid_moves = []
self.moved = False
self.valid_moves = [] #dostępne ruchy dla figury
self.moved = False #informacja czy figura wykonała już swój pierwszy ruch, potrzebne do policzenia ruchow pawn
if color == 'white':
self.pawn_direction = -1
else:

View File

@ -3,17 +3,14 @@ class Square:
self.row = row
self.column = column
self.piece = piece
def has_piece(self):
if self.piece is None:
return False
else:
return True
def is_rival(self, color):
if self.has_piece() is True and self.piece.color != color:
return True
def empty_or_rival(self, color):
if self.is_rival(color) is True or self.has_piece() is False:
return True