class DrawabaleTetrisBoard(QWidget): """ A base class for tetris board widgets that can draw themselves. """ def __init__(self, parent, nrows, ncols, blocksize): super(DrawabaleTetrisBoard, self).__init__(parent) self.nrows = nrows self.ncols = ncols self.blocksize = blocksize self.nrows = nrows self.ncols = ncols self.blocksize = blocksize self.showgrid = True self.gridwidth = 2 self.gridcolor = QColor(204, 204, 204) # the "sink" is the white border around the actual # tetris grid # self.sinkwidth = 4 self.sinkcolor = 'white' self.block_border_color = 'black' self.bgcolor = QColor(234, 234, 244) self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.width = self.sinkwidth * 2 + ncols * blocksize + ( ncols + 1) * self.gridwidth self.height = self.sinkwidth * 2 + nrows * blocksize + ( nrows + 1) * self.gridwidth self.board = TetrisBoard(nrows, ncols) def minimumSizeHint(self): return QSize(self.width, self.height) def sizeHint(self): return self.minimumSizeHint() def paintEvent(self, event=None): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.fillRect(0, 0, self.width, self.height, QBrush(self.bgcolor, Qt.SolidPattern)) if self.showgrid: self._draw_grid(painter) self._draw_sink(painter) self._draw_all_blocks(painter) def _draw_sink(self, painter): sink_pen = QPen(QColor(self.sinkcolor)) sink_pen.setWidth(self.sinkwidth) painter.setPen(sink_pen) halfsink = self.sinkwidth / 2 painter.drawLine(halfsink, 0, halfsink, self.height) painter.drawLine(self.width - halfsink, 0, self.width - halfsink, self.height) painter.drawLine(0, halfsink, self.width, halfsink) painter.drawLine(0, self.height - halfsink, self.width, self.height - halfsink) def _draw_grid(self, painter): grid_pen = QPen(QColor(self.gridcolor)) grid_pen.setWidth(self.gridwidth) painter.setPen(grid_pen) # combined size of a block with a single grid line blockgrid_size = self.blocksize + self.gridwidth # horizontal for row in range(self.nrows + 1): painter.drawLine(self.sinkwidth, self.sinkwidth + row * blockgrid_size + 1, self.width - 1 - self.sinkwidth, self.sinkwidth + row * blockgrid_size + 1) # vertical for col in range(self.ncols + 1): painter.drawLine(self.sinkwidth + col * blockgrid_size + 1, self.sinkwidth, self.sinkwidth + col * blockgrid_size + 1, self.height - 1 - self.sinkwidth) def _draw_all_blocks(self, painter): board = self.board.board_with_active_figure() for row in range(self.nrows): for col in range(self.ncols): color = board[row][col] if color != 0: self._draw_block(painter, row, col, color) def _draw_block(self, painter, row, col, color): block_pen = QPen(QColor(self.block_border_color)) block_pen.setWidth(self.gridwidth) painter.setPen(block_pen) blockgrid_size = self.blocksize + self.gridwidth block_rect = QRect(self.sinkwidth + col * blockgrid_size + 1, self.sinkwidth + row * blockgrid_size + 1, blockgrid_size, blockgrid_size) painter.fillRect(block_rect, QBrush(color, Qt.SolidPattern)) painter.drawRect(block_rect)
class DrawabaleTetrisBoard(QWidget): """ A base class for tetris board widgets that can draw themselves. """ def __init__(self, parent, nrows, ncols, blocksize): super(DrawabaleTetrisBoard, self).__init__(parent) self.nrows = nrows self.ncols = ncols self.blocksize = blocksize self.nrows = nrows self.ncols = ncols self.blocksize = blocksize self.showgrid = True self.gridwidth = 2 self.gridcolor = QColor(204, 204, 204) # the "sink" is the white border around the actual # tetris grid # self.sinkwidth = 4 self.sinkcolor = "white" self.block_border_color = "black" self.bgcolor = QColor(234, 234, 244) self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) self.width = self.sinkwidth * 2 + ncols * blocksize + (ncols + 1) * self.gridwidth self.height = self.sinkwidth * 2 + nrows * blocksize + (nrows + 1) * self.gridwidth self.board = TetrisBoard(nrows, ncols) def minimumSizeHint(self): return QSize(self.width, self.height) def sizeHint(self): return self.minimumSizeHint() def paintEvent(self, event=None): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.fillRect(0, 0, self.width, self.height, QBrush(self.bgcolor, Qt.SolidPattern)) if self.showgrid: self._draw_grid(painter) self._draw_sink(painter) self._draw_all_blocks(painter) def _draw_sink(self, painter): sink_pen = QPen(QColor(self.sinkcolor)) sink_pen.setWidth(self.sinkwidth) painter.setPen(sink_pen) halfsink = self.sinkwidth / 2 painter.drawLine(halfsink, 0, halfsink, self.height) painter.drawLine(self.width - halfsink, 0, self.width - halfsink, self.height) painter.drawLine(0, halfsink, self.width, halfsink) painter.drawLine(0, self.height - halfsink, self.width, self.height - halfsink) def _draw_grid(self, painter): grid_pen = QPen(QColor(self.gridcolor)) grid_pen.setWidth(self.gridwidth) painter.setPen(grid_pen) # combined size of a block with a single grid line blockgrid_size = self.blocksize + self.gridwidth # horizontal for row in range(self.nrows + 1): painter.drawLine( self.sinkwidth, self.sinkwidth + row * blockgrid_size + 1, self.width - 1 - self.sinkwidth, self.sinkwidth + row * blockgrid_size + 1, ) # vertical for col in range(self.ncols + 1): painter.drawLine( self.sinkwidth + col * blockgrid_size + 1, self.sinkwidth, self.sinkwidth + col * blockgrid_size + 1, self.height - 1 - self.sinkwidth, ) def _draw_all_blocks(self, painter): board = self.board.board_with_active_figure() for row in range(self.nrows): for col in range(self.ncols): color = board[row][col] if color != 0: self._draw_block(painter, row, col, color) def _draw_block(self, painter, row, col, color): block_pen = QPen(QColor(self.block_border_color)) block_pen.setWidth(self.gridwidth) painter.setPen(block_pen) blockgrid_size = self.blocksize + self.gridwidth block_rect = QRect( self.sinkwidth + col * blockgrid_size + 1, self.sinkwidth + row * blockgrid_size + 1, blockgrid_size, blockgrid_size, ) painter.fillRect(block_rect, QBrush(color, Qt.SolidPattern)) painter.drawRect(block_rect)