使用QPainterPath来绘制棋盘线条,增加棋子图形项来优化代码
时间: 2023-12-03 12:45:32 浏览: 63
好的,让我们来完善一下绘制棋盘的代码。
首先,我们需要使用 `QPainterPath` 类来绘制棋盘线条。这个类可以方便地创建、操作和渲染复杂的图形路径。我们可以通过 `moveTo()` 和 `lineTo()` 方法来指定路径上的点,然后通过 `strokePath()` 方法来绘制路径。
下面是使用 `QPainterPath` 类绘制棋盘线条的代码:
```python
class Board(QGraphicsObject):
def __init__(self, parent=None):
super().__init__(parent)
def boundingRect(self):
return QRectF(0, 0, 600, 600)
def paint(self, painter, option, widget):
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(QPen(Qt.black, 2))
path = QPainterPath()
# 绘制竖线
for i in range(1, 15):
path.moveTo(i * 40, 40)
path.lineTo(i * 40, 560)
# 绘制横线
for i in range(1, 15):
path.moveTo(40, i * 40)
path.lineTo(560, i * 40)
painter.strokePath(path, QPen(Qt.black, 2))
```
接下来,我们可以通过增加棋子图形项来优化代码。目前我们在 `Board` 类中直接绘制了棋子,这样会使代码变得复杂且难以维护。相反,我们可以创建一个 `Piece` 类,用来表示棋子,并将其作为 `Board` 类的子项进行管理。
下面是增加棋子图形项的代码:
```python
class Piece(QGraphicsItem):
def __init__(self, color, parent=None):
super().__init__(parent)
self.color = color
self.setZValue(1)
def boundingRect(self):
return QRectF(-18, -18, 36, 36)
def paint(self, painter, option, widget):
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(Qt.NoPen)
painter.setBrush(QBrush(self.color))
painter.drawEllipse(-15, -15, 30, 30)
```
在 `Piece` 类中,我们继承了 `QGraphicsItem` 类,并实现了 `boundingRect()` 和 `paint()` 方法。`boundingRect()` 方法返回了棋子的边界矩形,用于进行碰撞检测和重新绘制。`paint()` 方法则绘制了棋子的圆形图案。
现在,我们可以在 `Board` 类中管理棋子图形项了。我们可以通过 `addItem()` 和 `removeItem()` 方法来添加或移除棋子。在 `mousePressEvent()` 方法中,我们可以通过 `QGraphicsScene` 的 `itemAt()` 方法获取鼠标点击位置处的图形项,然后判断是否可以放置棋子。如果可以,就添加一个新的棋子图形项。
下面是增加棋子图形项的完整代码:
```python
class Board(QGraphicsObject):
def __init__(self, parent=None):
super().__init__(parent)
self.piece_size = 30
self.grid_size = 40
self.board_size = self.grid_size * 14
self.pieces = []
def boundingRect(self):
return QRectF(0, 0, self.board_size, self.board_size)
def paint(self, painter, option, widget):
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(QPen(Qt.black, 2))
path = QPainterPath()
# 绘制竖线
for i in range(1, 15):
path.moveTo(i * self.grid_size, self.grid_size)
path.lineTo(i * self.grid_size, self.board_size - self.grid_size)
# 绘制横线
for i in range(1, 15):
path.moveTo(self.grid_size, i * self.grid_size)
path.lineTo(self.board_size - self.grid_size, i * self.grid_size)
painter.strokePath(path, QPen(Qt.black, 2))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
pos = event.pos()
x = round(pos.x() / self.grid_size) * self.grid_size
y = round(pos.y() / self.grid_size) * self.grid_size
for piece in self.pieces:
if piece.pos() == QPointF(x, y):
return
piece = Piece(Qt.black)
piece.setPos(x, y)
self.addItem(piece)
self.pieces.append(piece)
```
现在,我们已经成功地增加了棋子图形项,并优化了代码。我们可以继续完善游戏逻辑和界面交互,使得游戏更加完整和有趣。
阅读全文