예제 #1
0
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)
예제 #2
0
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)