Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 77 additions & 73 deletions board.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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):
Expand All @@ -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 = []
Expand Down Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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):
Expand All @@ -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