QT实现五子棋


有点bug 但是能运行
每次点击右边会出现提示图标,表示是黑方落子还是白方并计时,
不过不知道为什么点的次数多了 就不出现提示了 然后过一会又有了
![Alt]在这里插入图片描述

代码片.

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBrush>
#include <QMouseEvent>
#include <QPen>
#include <QDebug>
#include <QMessageBox>
#include <QTime>
#include <QMainWindow>
#include <QTimer>
#include <QDateTime>
#include <QDesktopWidget>
#include <QApplication>
#include <QCoreApplication>
#include <QEventLoop>
#include <QProcess>
#include <QString>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

       ui->label_2->hide();
   // resize(640, 640);
    memset(a, 0, 15 * 15 * sizeof(int));
    player = 0;
    ui->lcdNumber->setSegmentStyle(QLCDNumber::Flat);
    ui->lcdNumber->display(QDateTime::currentDateTime().toString("000"));
    ui->lcdNumber_2->setSegmentStyle(QLCDNumber::Flat);
    ui->lcdNumber_2->display(QDateTime::currentDateTime().toString("000"));
    timer1=new QTimer(this);
    connect(timer1,&QTimer::timeout,this,&Widget::handle_timeout);
    timer1->start(1000);
    timer2=new QTimer(this);
    connect(timer2,&QTimer::timeout,this,&Widget::handle_timeout);
    timer2->start(1000);



}

Widget::~Widget()
{
    delete ui;
}

 void Widget::handle_timeout()
{

    if(flag%2==0){
        for(sec=numb1;sec>0;sec--)
        {
            ui->lcdNumber->display(QDateTime::currentDateTime().toString(QString::number(sec)));
               Delay_MSec(1000);
               if(flag%2==1){
                   numb1=sec;
                   break;
               }
               if(sec<=0)
                    QMessageBox::information(this, "Win", "White Win", QMessageBox::Ok);
        }
       // timer1->stop();
    }
    else if(flag%2==1)
    {
        for(sec=numb2;sec>0;sec--)
        {
            ui->lcdNumber_2->display(QDateTime::currentDateTime().toString(QString::number(sec)));
               Delay_MSec(1000);
               if(flag%2==0) {
                   numb2=sec;
                   break;}
               if(sec<=0)
                    QMessageBox::information(this, "Win", "Black Win", QMessageBox::Ok);
        }
       // timer2->stop();
    }

}
void Widget::Delay_MSec(unsigned int msec)
{
    QTime _Timer=QTime::currentTime().addMSecs(msec);
    while(QTime::currentTime()<_Timer)
    {
        QCoreApplication::processEvents(QEventLoop::AllEvents,100);
    }
}
void Widget::paintEvent(QPaintEvent *)
{
    gridW = width()/19;  //窗口宽度分18份
    gridH = height()/19; //窗口高度分18份
    //棋盘起点坐标
    startX = gridW;
    startY = gridH;
    QPainter p(this);
    //背景图
    p.drawPixmap(0,0, width(),height(),QPixmap(":/new/prefix1/C:/tupian/image/board1.jpg"));
    p.setRenderHint(QPainter::Antialiasing, true);

    int i, j;
    for (i = 0; i < 16; i++)
    {
        p.drawLine(startX, startY + i * gridH, startX+15*gridW, startY + i * gridH);
        p.drawLine(startX + i * gridW, startY, startX + i * gridW, startY+15*gridH);
    }

    QBrush brush;
    brush.setStyle(Qt::SolidPattern);
    for (i = 0; i < 15; i++)
    {
        for (j = 0; j < 15; j++)
        {
            if (a[i][j] == 1)
            {
                p.drawPixmap(startX+i*gridW, startY+j*gridH,
                             gridW, gridH,
                   QPixmap(":/new/prefix1/C:/tupian/image/white.png")
                   );
                ui->label->hide();
                ui->label_2->show();

                /*brush.setColor(Qt::black);
                p.setBrush(brush);
                p.drawEllipse(QPoint((i + 1) * 40, (j + 1) * 40), 15, 15);*/
            }
            else if (a[i][j] == 2)
            {
                p.drawPixmap(startX+i*gridW, startY+j*gridH,
                       gridW, gridH,
                       QPixmap(":/new/prefix1/C:/tupian/image/black.png")
                       );
                ui->label->show();
                    ui->label_2->hide();

                /*brush.setColor(Qt::white);
                p.setBrush(brush);
                p.drawEllipse(QPoint((i + 1) * 40, (j + 1) * 40), 15, 15);*/
            }
        }
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
    int x, y;

     flag++;
    if(e->x() >= startX && e->x() < startX+15*gridW && e->y() >= startY && e->y() < startY+15*gridH)
    {
        x = (e->x() - startX) / gridW;
        y = (e->y() - startY) / gridH;
        if (!a[x][y])
        {
            a[x][y] = player++ % 2 + 1;
        }
        if(iswin(x, y))
        {
            update();
            setEnabled(false);
            if(flag%2==1)
                 QMessageBox::information(this, "Win", "Black Win", QMessageBox::Ok);
            else
                 QMessageBox::information(this, "Win", "White Win", QMessageBox::Ok);
         
        }
    }
    update();
}

int Widget::iswin(int x, int y)
{
     return f1(x, y) || f2(x, y) || f3(x, y) || f4(x ,y);
}

int Widget::f1(int x, int y)
{
    int i;
    for (i = 0; i < 5; i++)
    {
        if(y - i >= 0 &&
           y + 4 - i <= 0xF &&
           a[x][y - i] == a[x][y + 1 - i] &&
           a[x][y - i] == a[x][y + 2 - i] &&
           a[x][y - i] == a[x][y + 3 - i] &&
           a[x][y - i] == a[x][y + 4 - i])
        return 1;
    }
    return 0;
}

int Widget::f2(int x, int y)
{
    int i;
    for (i = 0; i < 5; i++)
    {
        if(x - i >= 0 &&
           x + 4 - i <= 0xF &&
           a[x - i][y] == a[x + 1 - i][y] &&
           a[x - i][y] == a[x + 2 - i][y] &&
           a[x - i][y] == a[x + 3 - i][y] &&
           a[x - i][y] == a[x + 4 - i][y])
           return 1;
    }
    return 0;
}

int Widget::f3(int x, int y)
{
    int i;
    for (i = 0; i < 5; i++)
    {
        if(x - i >= 0 &&
           y - i >= 0 &&
           x + 4 - i <= 0xF &&
           y + 4 - i <= 0xF &&
           a[x - i][y - i] == a[x + 1 - i][y + 1 - i] &&
           a[x - i][y - i] == a[x + 2 - i][y + 2 - i] &&
           a[x - i][y - i] == a[x + 3 - i][y + 3 - i] &&
           a[x - i][y - i] == a[x + 4 - i][y + 4 - i])
           return 1;
    }
    return 0;
}

int Widget::f4(int x, int y)
{
    int i;
    for (i = 0; i < 5; i++)
    {
        if(x + i <= 0xF &&
           y - i >= 0 &&
           x - 4 + i >= 0 &&
           y + 4 - i <= 0xF &&
           a[x + i][y - i] == a[x - 1 + i][y + 1 - i] &&
           a[x + i][y - i] == a[x - 2 + i][y + 2 - i] &&
           a[x + i][y - i] == a[x - 3 + i][y + 3 - i] &&
           a[x + i][y - i] == a[x - 4 + i][y + 4 - i])
           return 1;
    }
    return 0;
}

void Widget::on_pushButtonOver_clicked()
{
    this->close();
}


/*-------main.cpp----------------------------*/
#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
/*---------widget.h-----------*/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *event);
   void mouseReleaseEvent(QMouseEvent *event);
   QTimer *timer1,*timer2;
   void handle_timeout(void);
   void Delay_MSec(unsigned int msec);
   int flag=3;
   int sec=0;
   int numb1=900;
   int numb2=900;
   int player;

private slots:
   void on_pushButtonOver_clicked();

private:
    Ui::Widget *ui;
    int a [15][15];

    int iswin(int,int);
    int f1(int,int);
    int f2(int,int);
    int f3(int,int);
    int f4(int,int);
    int gridW;  //棋盘水平方向一个格子的宽度
    int gridH;  //棋盘水平方向一个格子的高度
    int startX; //棋盘起点x坐标
    int startY; //棋盘起点y坐标

    int chessX=-1, chessY=-1; //棋盘下标



};
#endif // WIDGET_H




Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐