qt 五子棋

本文介绍了一个基于Qt的五子棋游戏实现,包括棋盘绘制、鼠标事件处理和简单的游戏逻辑。玩家可以点击棋盘上下棋,当一方连成五子时,游戏结束并显示胜利信息。代码使用C++编写,通过QPainter进行图形绘制,QEvent和QMouseEvent处理交互。
摘要由CSDN通过智能技术生成

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QEvent>
#include <QMouseEvent>
#include <QMessageBox>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *event);
private:
    bool  isBlack = true;
    int panWidth = 40;
    int rWidth = 15;
    int startX = 40;
    int startY = 40;
    int qizis[11][11];

    void xiaQiZi(int col, int row);//下棋子
    bool isOk(QList<int> values, int value);//是否赢了
};
#endif // WIDGET_H

cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    for(int i = 0; i < 11;i++)
    {
        for(int j =0 ; j < 11; j++)
        {
            qizis[i][j] = 0;
        }
    }
    this->resize(480,480);
}
Widget::~Widget()
{
}
//
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.save();
    QColor color1 = QColor(255,255,255);
    QColor color2 = QColor(0,0,0);
    QColor color3 = QColor(30,160,230);
    QColor color4 = QColor(200,200,200);
    //背景方框
    painter.setPen(color3);
    painter.setBrush(color4);
    for(int i =0; i < 11; i++)
    {
        painter.drawLine(startX+i * panWidth,startY, startX + i*panWidth, startY + 10*panWidth);
        painter.drawLine(startX,startY+i * panWidth, startX  + 10*panWidth, startY +i * panWidth);
    }

    //绘制棋子
    for(int i = 0; i < 11;i++)
    {
        for(int j =0 ; j < 11; j++)
        {
            QPoint center;
            center.setX( startX + i * panWidth);
            center.setY( startY + j * panWidth);
            if(qizis[i][j] == 1)
            {
                painter.setPen(color1);
                painter.setBrush(color1);
                painter.drawEllipse(center, rWidth, rWidth);
            }
            else if(qizis[i][j] == 2)
            {
                painter.setPen(color2);
                painter.setBrush(color2);
                painter.drawEllipse(center, rWidth, rWidth);
            }
        }
    }
    painter.restore();
}
//
void Widget::mousePressEvent(QMouseEvent *event)
{
    QPoint pos = event->pos();
    for(int i = 0; i < 11;i++)
    {
        for(int j =0 ; j < 11; j++)
        {
            QRect rect = QRect(startX + i * panWidth - rWidth, startY + j * panWidth - rWidth, 2* rWidth, 2* rWidth);
            if(rect.contains(pos))
            {
                if(qizis[i][j] == 0)
                {
                    xiaQiZi(i,j);//下棋子
                }
                break;
            }
        }
    }
}
//下棋子
void Widget::xiaQiZi(int col, int row)
{
    int value = 0;
    if(isBlack)
        value = 2;
    else
        value = 1;
    isBlack = !isBlack;
    qizis[col][row] = value;
    this->update();
    QList<int> values;
    for(int i =0 ; i < 9; i++)
    {
        int x = col - 4 + i;
        int y = row;
        if(x >= 0 && x < 11)
        {
            values << qizis[x][y];
        }
    }
    if(isOk(values, value))
        return;
    values.clear();
    for(int i =0 ; i < 9; i++)
    {
        int x = col ;
        int y = row- 4 + i;
        if(x >= 0 && x < 11)
        {
            values << qizis[x][y];
        }
    }
    if(isOk(values, value))
        return;

    values.clear();
    for(int i =0 ; i < 9; i++)
    {
        int x = col -4 +i ;
        int y = row- 4 + i;
        if(x >= 0 && x < 11)
        {
            values << qizis[x][y];
        }
    }
    if(isOk(values, value))
        return;

    values.clear();
    for(int i =0 ; i < 9; i++)
    {
        int x = col + 4 - i ;
        int y = row- 4 + i;
        if(x >= 0 && x < 11)
        {
            values << qizis[x][y];
        }
    }
    if(isOk(values, value))
        return;
}
//是否赢了
bool Widget::isOk(QList<int> values,int value)
{
    bool start = false;
    int count = 0;
    for(int i =0 ; i < values.count();i++)
    {
        if(!start)
        {
            if(values[i] == value)
            {
                count=1;
                start = true;
            }
        }
        else
        {
            if(values[i] == value)
            {
                count++;
                if(count >=5)
                {
                    QMessageBox::information(this,"结束",QString(isBlack?QString("白棋子"):QString("黑棋子"))+"赢了!");
                    isBlack = true;
                    for(int i = 0; i < 11;i++)
                    {
                        for(int j =0 ; j < 11; j++)
                        {
                            qizis[i][j] = 0;
                        }
                    }
                    this->update();
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
    }
    return false;
}
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值