qt实现的五子棋小游戏(Qpainter)

这个其实很简单,首先绘制棋盘。然后绘制棋子的位置。

绘制棋盘

绘制棋盘就是一个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();
}

最后效果图:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值