Files
2022-02-10 18:43:51 -05:00

209 lines
8.1 KiB
Python

"""
Ahira Justice, ADEFOKUN
justiceahira@gmail.com
"""
import os
import pygame
from . import pieces
from . import fenparser
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
IMAGE_DIR = os.path.join(BASE_DIR, 'images')
class Board:
btile = pygame.image.load(os.path.join(IMAGE_DIR, 'btile.png'))
wtile = pygame.image.load(os.path.join(IMAGE_DIR, 'wtile.png'))
def __init__(self, colors, BGCOLOR, DISPLAYSURF, size=8):
self.colors = colors
self.BGCOLOR = BGCOLOR
self.DISPLAYSURF = DISPLAYSURF
self.font = pygame.font.Font(pygame.font.get_default_font(), 24)
self.pieceRect = []
self.boardRect, self.tile_size = self._generate_board_rect(size)
def _generate_board_rect(self, size):
start = 100
end = 500
stride = (end - start) // size
board_rect = []
for column in range(0, size):
board_rect.append(tuple([(start + row * stride, start + column * stride) for row in range(0, size)]))
return board_rect, stride
def displayBoard(self):
self.DISPLAYSURF.fill(self.BGCOLOR)
pygame.draw.rect(self.DISPLAYSURF, self.colors['Black'], (95, 95, 410, 410), 10)
self.drawTiles()
def drawTiles(self):
wtile = pygame.transform.scale(Board.wtile, (self.tile_size, self.tile_size))
btile = pygame.transform.scale(Board.btile, (self.tile_size, self.tile_size))
for i in range(1, len(self.boardRect)+1):
for j in range(1, len(self.boardRect[i-1])+1):
if self.isOdd(i):
if self.isOdd(j):
self.DISPLAYSURF.blit(wtile, self.boardRect[i-1][j-1])
elif self.isEven(j):
self.DISPLAYSURF.blit(btile, self.boardRect[i-1][j-1])
elif self.isEven(i):
if self.isOdd(j):
self.DISPLAYSURF.blit(btile, self.boardRect[i-1][j-1])
elif self.isEven(j):
self.DISPLAYSURF.blit(wtile, self.boardRect[i-1][j-1])
# draw letters
files = 'abcdefgh'
ranks = '12345678'
size = len(self.boardRect)
for i in range(0, len(self.boardRect)):
text_surface = self.font.render(ranks[size - i - 1], True, (200, 200, 200))
rect = self.boardRect[i][-1]
rect = (rect[0] + self.tile_size + 20, rect[1] + 40)
self.DISPLAYSURF.blit(text_surface, dest=rect)
for i in range(0, len(self.boardRect)):
text_surface = self.font.render(files[i], True, (200, 200, 200))
rect = self.boardRect[-1][i]
rect = (rect[0] + 40, rect[1] + self.tile_size + 15)
self.DISPLAYSURF.blit(text_surface, dest=rect)
def isOdd(self, number):
if number % 2 == 1:
return True
def isEven(self, number):
if number % 2 == 0:
return True
def drawPieces(self):
self.mapPieces()
for piece in self.pieceRect:
piece.displayPiece()
def mapPieces(self):
for i in range(len(Board.posb)):
if i in [0, 1, 2, 3, 4, 5, 6, 7]:
piece = self.createPiece(pieces.BLACK, pieces.PAWN, Board.posb[i])
self.pieceRect.append(piece)
elif i in [8, 15]:
piece = self.createPiece(pieces.BLACK, pieces.ROOK, Board.posb[i])
self.pieceRect.append(piece)
elif i in [9, 14]:
piece = self.createPiece(pieces.BLACK, pieces.KNGHT, Board.posb[i])
self.pieceRect.append(piece)
elif i in [10, 13]:
piece = self.createPiece(pieces.BLACK, pieces.BISHOP, Board.posb[i])
self.pieceRect.append(piece)
elif i in [11]:
piece = self.createPiece(pieces.BLACK, pieces.QUEEN, Board.posb[i])
self.pieceRect.append(piece)
elif i in [12]:
piece = self.createPiece(pieces.BLACK, pieces.KING, Board.posb[i])
self.pieceRect.append(piece)
for i in range(len(Board.posw)):
if i in [0, 1, 2, 3, 4, 5, 6, 7]:
piece = self.createPiece(pieces.WHITE, pieces.PAWN, Board.posw[i])
self.pieceRect.append(piece)
elif i in [8, 15]:
piece = self.createPiece(pieces.WHITE, pieces.ROOK, Board.posw[i])
self.pieceRect.append(piece)
elif i in [9, 14]:
piece = self.createPiece(pieces.WHITE, pieces.KNGHT, Board.posw[i])
self.pieceRect.append(piece)
elif i in [10, 13]:
piece = self.createPiece(pieces.WHITE, pieces.BISHOP, Board.posw[i])
self.pieceRect.append(piece)
elif i in [11]:
piece = self.createPiece(pieces.WHITE, pieces.QUEEN, Board.posw[i])
self.pieceRect.append(piece)
elif i in [12]:
piece = self.createPiece(pieces.WHITE, pieces.KING, Board.posw[i])
self.pieceRect.append(piece)
def createPiece(self, color, type, position):
piece = pieces.Piece(color, type, self.DISPLAYSURF, self.tile_size)
piece.setPosition(position)
return piece
def updatePieces(self, fen):
self.pieceRect = []
fp = fenparser.FenParser(fen)
fenboard = fp.parse()
for i in range(len(fenboard)):
for j in range(len(fenboard[i])):
if fenboard[i][j] in ['b', 'B']:
if fenboard[i][j] == 'b':
piece = self.createPiece(pieces.BLACK, pieces.BISHOP, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'B':
piece = self.createPiece(pieces.WHITE, pieces.BISHOP, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] in ['k', 'K']:
if fenboard[i][j] == 'k':
piece = self.createPiece(pieces.BLACK, pieces.KING, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'K':
piece = self.createPiece(pieces.WHITE, pieces.KING, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] in ['n', 'N']:
if fenboard[i][j] == 'n':
piece = self.createPiece(pieces.BLACK, pieces.KNGHT, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'N':
piece = self.createPiece(pieces.WHITE, pieces.KNGHT, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] in ['p', 'P']:
if fenboard[i][j] == 'p':
piece = self.createPiece(pieces.BLACK, pieces.PAWN, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'P':
piece = self.createPiece(pieces.WHITE, pieces.PAWN, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] in ['q', 'Q']:
if fenboard[i][j] == 'q':
piece = self.createPiece(pieces.BLACK, pieces.QUEEN, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'Q':
piece = self.createPiece(pieces.WHITE, pieces.QUEEN, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] in ['r', 'R']:
if fenboard[i][j] == 'r':
piece = self.createPiece(pieces.BLACK, pieces.ROOK, self.boardRect[i][j])
self.pieceRect.append(piece)
elif fenboard[i][j] == 'R':
piece = self.createPiece(pieces.WHITE, pieces.ROOK, self.boardRect[i][j])
self.pieceRect.append(piece)
for piece in self.pieceRect:
piece.displayPiece()