diff --git a/board.py b/board.py index 747e855..034b705 100644 --- a/board.py +++ b/board.py @@ -12,18 +12,37 @@ class Board: rect = (113, 113, 525, 525) startX = rect[0] startY = rect[1] + def __init__(self, rows, cols): self.rows = rows self.cols = cols self.ready = False - self.last = None - self.copy = True self.board = [[0 for x in range(8)] for _ in range(rows)] + # Initialize the board with pieces + self.initialize_board() + + self.p1Name = "Player 1" + self.p2Name = "Player 2" + + self.turn = "w" + + self.time1 = 900 + self.time2 = 900 + + self.storedTime1 = 0 + self.storedTime2 = 0 + + self.winner = None + + self.startTime = time.time() + + def initialize_board(self): + # Set up the initial configuration of the board self.board[0][0] = Rook(0, 0, "b") self.board[0][1] = Knight(0, 1, "b") self.board[0][2] = Bishop(0, 2, "b") @@ -60,21 +79,6 @@ def __init__(self, rows, cols): self.board[6][6] = Pawn(6, 6, "w") self.board[6][7] = Pawn(6, 7, "w") - self.p1Name = "Player 1" - self.p2Name = "Player 2" - - self.turn = "w" - - self.time1 = 900 - self.time2 = 900 - - self.storedTime1 = 0 - self.storedTime2 = 0 - - self.winner = None - - self.startTime = time.time() - def update_moves(self): for i in range(self.rows): for j in range(self.cols): @@ -86,21 +90,17 @@ def draw(self, win, color): y, x = self.last[0] y1, x1 = self.last[1] - xx = (4 - x) +round(self.startX + (x * self.rect[2] / 8)) + xx = (4 - x) + round(self.startX + (x * self.rect[2] / 8)) yy = 3 + round(self.startY + (y * self.rect[3] / 8)) - pygame.draw.circle(win, (0,0,255), (xx+32, yy+30), 34, 4) + pygame.draw.circle(win, (0, 0, 255), (xx + 32, yy + 30), 34, 4) xx1 = (4 - x) + round(self.startX + (x1 * self.rect[2] / 8)) - yy1 = 3+ round(self.startY + (y1 * self.rect[3] / 8)) + yy1 = 3 + round(self.startY + (y1 * self.rect[3] / 8)) pygame.draw.circle(win, (0, 0, 255), (xx1 + 32, yy1 + 30), 34, 4) - s = None for i in range(self.rows): for j in range(self.cols): if self.board[i][j] != 0: self.board[i][j].draw(win, color) - if self.board[i][j].isSelected: - s = (i, j) - def get_danger_moves(self, color): danger_moves = [] @@ -138,13 +138,13 @@ def select(self, col, row, color): prev = (i, j) # if piece - if self.board[row][col] == 0 and prev!=(-1,-1): + if self.board[row][col] == 0 and prev != (-1, -1): moves = self.board[prev[0]][prev[1]].move_list if (col, row) in moves: changed = self.move(prev, (row, col), color) else: - if prev == (-1,-1): + if prev == (-1, -1): self.reset_selected() if self.board[row][col] != 0: self.board[row][col].selected = True @@ -159,32 +159,38 @@ def select(self, col, row, color): else: if self.board[row][col].color == color: - #castling + # castling self.reset_selected() - if self.board[prev[0]][prev[1]].moved == False and self.board[prev[0]][prev[1]].rook and self.board[row][col].king and col != prev[1] and prev!=(-1,-1): + if ( + self.board[prev[0]][prev[1]].moved == False + and self.board[prev[0]][prev[1]].rook + and self.board[row][col].king + and col != prev[1] + and prev != (-1, -1) + ): castle = True if prev[1] < col: - for j in range(prev[1]+1, col): + for j in range(prev[1] + 1, col): if self.board[row][j] != 0: castle = False if castle: changed = self.move(prev, (row, 3), color) - changed = self.move((row,col), (row, 2), color) + changed = self.move((row, col), (row, 2), color) if not changed: self.board[row][col].selected = True else: - for j in range(col+1,prev[1]): + for j in range(col + 1, prev[1]): if self.board[row][j] != 0: castle = False if castle: changed = self.move(prev, (row, 6), color) - changed = self.move((row,col), (row, 5), color) + changed = self.move((row, col), (row, 5), color) if not changed: self.board[row][col].selected = True - + else: self.board[row][col].selected = True @@ -203,25 +209,6 @@ def reset_selected(self): self.board[i][j].selected = False def check_mate(self, color): - '''if self.is_checked(color): - king = None - for i in range(self.rows): - for j in range(self.cols): - if self.board[i][j] != 0: - if self.board[i][j].king and self.board[i][j].color == color: - king = self.board[i][j] - if king is not None: - valid_moves = king.valid_moves(self.board) - - danger_moves = self.get_danger_moves(color) - - danger_count = 0 - - for move in valid_moves: - if move in danger_moves: - danger_count += 1 - return danger_count == len(valid_moves)''' - return False def move(self, start, end, color): @@ -234,31 +221,48 @@ def move(self, start, end, color): nBoard[start[0]][start[1]].change_pos((end[0], end[1])) nBoard[end[0]][end[1]] = nBoard[start[0]][start[1]] nBoard[start[0]][start[1]] = 0 - self.board = nBoard - - if self.is_checked(color) or (checkedBefore and self.is_checked(color)): + self.board = nBoard[:] + checkedAfter = self.is_checked(color) + if checkedAfter: changed = False - nBoard = self.board[:] - if nBoard[end[0]][end[1]].pawn: - nBoard[end[0]][end[1]].first = True - nBoard[end[0]][end[1]].change_pos((start[0], start[1])) - nBoard[start[0]][start[1]] = nBoard[end[0]][end[1]] - nBoard[end[0]][end[1]] = 0 - self.board = nBoard - else: - self.reset_selected() + if self.is_checked(color): + changed = False - self.update_moves() - if changed: - self.last = [start, end] - if self.turn == "w": - self.storedTime1 += (time.time() - self.startTime) - else: - self.storedTime2 += (time.time() - self.startTime) - self.startTime = time.time() + if not changed: + nBoard = self.board[:] + nBoard[end[0]][end[1]] = nBoard[start[0]][start[1]] + nBoard[start[0]][start[1]] = 0 + self.board = nBoard[:] return changed - + def stalemate(self, color): + self.update_moves() + for i in range(self.rows): + for j in range(self.cols): + if self.board[i][j] != 0: + if self.board[i][j].color == color: + moves = self.board[i][j].move_list + if moves: + return False + + return True + + def promote_pawn(self, row, col): + piece = self.board[row][col] + if piece.pawn and ((piece.color == "w" and row == 0) or (piece.color == "b" and row == 7)): + self.board[row][col] = Queen(row, col, piece.color) + + def get_elapsed_time(self): + elapsed_time = time.time() - self.startTime + return elapsed_time + + def get_remaining_time(self, color): + elapsed_time = self.get_elapsed_time() + if color == "w": + remaining_time = max(0, self.time1 - elapsed_time + self.storedTime1) + else: + remaining_time = max(0, self.time2 - elapsed_time + self.storedTime2) + return remaining_time