209 lines
8.1 KiB
Python
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()
|