这个其实很简单,首先绘制棋盘。然后绘制棋子的位置。
绘制棋盘
绘制棋盘就是一个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;i<m_AllPostion.size();++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);
m_BlackPosition.append(point);
核心基本就这些
全部代码:
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
//五子棋小游戏
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
QList<QPoint> m_AllPostion; //记录全部可以下棋的位置
QList<QPoint> m_BlackPosition; //记录黑方所下的棋子
QList<QPoint> m_WhitePosition; //记录白方的棋子
int m_ClickX=0;
int m_ClickY=0;
bool m_bBlack=false;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QDebug>
#include <iostream>
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<m_BlackPosition.size();++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<m_WhitePosition.size();++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<m_AllPostion.size();++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();
}
最后效果图: