这个其实很简单,首先绘制棋盘。然后绘制棋子的位置。
绘制棋盘绘制棋盘就是一个15条横线和15条竖线组成的棋盘。
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(QColor(Qt::black));
for(int i=1;i<=15;++i)
{
painter.drawLine(50,i*50,750,i*50);
}
for(int i=1;i<=15;++i)
{
painter.drawLine(i*50,50,i*50,750);
}
棋盘绘制好了之后。我们还需要将能落棋的地方全部加载到数组中。不是任意地方都可以进行落棋
for(int i=1;i<15;++i)
{
int x=i*50;
for(int j=1;j<15;++j)
{
int y=j*50;
QPoint position;
position.setX(x);
position.setY(y);
m_AllPostion.append(position);
}
}
这样棋盘的绘制才算结束。
当点击鼠标左键进行落棋。但是由于不是任何地方都能落,所以需要判断鼠标的位置,还要进行求极值。求最接近的哪个点。然后落棋。
for(int i=0;iQPoint position=m_AllPostion[i]; int x=abs(position.x()-(event->pos().x())); int y=abs(position.y()-(event->pos().y())); if(x<=posx) { posx=x; m_ClickX=position.x(); } if(y<=posy) { posy=y; m_ClickY=position.y(); } }
需要用数组进行保存已经落棋的位置。
QPoint point;
point.setX(m_ClickX);
point.setY(m_ClickY);
m_BlackPosition.append(point);
核心基本就这些
全部代码:.h文件
#ifndef WIDGET_H #define WIDGET_H #include//五子棋小游戏 class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); protected: void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); private: QList m_AllPostion; //记录全部可以下棋的位置 QList m_BlackPosition; //记录黑方所下的棋子 QList m_WhitePosition; //记录白方的棋子 int m_ClickX=0; int m_ClickY=0; bool m_bBlack=false; }; #endif // WIDGET_H
.cpp文件
#include "widget.h" #include#include #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent) { this->resize(800,800); for(int i=1;i<15;++i) { int x=i*50; for(int j=1;j<15;++j) { int y=j*50; QPoint position; position.setX(x); position.setY(y); m_AllPostion.append(position); } } } Widget::~Widget() { } void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setBrush(QColor(Qt::black)); for(int i=1;i<=15;++i) { painter.drawLine(50,i*50,750,i*50); } for(int i=1;i<=15;++i) { painter.drawLine(i*50,50,i*50,750); } painter.setBrush(QColor(Qt::black)); for(int i=0;i painter.drawEllipse(m_BlackPosition[i].x()-10,m_BlackPosition[i].y()-10,20,20); } painter.setBrush(QColor(Qt::white)); for(int i=0;i painter.drawEllipse(m_WhitePosition[i].x()-10,m_WhitePosition[i].y()-10,20,20); } } void Widget::mousePressEvent(QMouseEvent *event) { m_bBlack=!m_bBlack; int posx=abs(m_AllPostion[0].x()-(event->pos().x())); int posy=abs(m_AllPostion[0].x()-(event->pos().y())); for(int i=0;i QPoint position=m_AllPostion[i]; int x=abs(position.x()-(event->pos().x())); int y=abs(position.y()-(event->pos().y())); if(x<=posx) { posx=x; m_ClickX=position.x(); } if(y<=posy) { posy=y; m_ClickY=position.y(); } } QPoint point; point.setX(m_ClickX); point.setY(m_ClickY); if(m_bBlack) { m_BlackPosition.append(point); } else { m_WhitePosition.append(point); } update(); }
最后效果图:



