栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
        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 


//五子棋小游戏
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();
}

最后效果图:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号