• QT实现的简单五子棋游戏


    1,五子棋游戏的规则简介:

        双方依次下子,谁先连成五子一条线则胜利。

    2,

    /*****************************************/

    FIR.pro:

      

    #-------------------------------------------------
    #
    # Project created by QtCreator 2012-09-01T15:09:11
    #
    #-------------------------------------------------

    QT       += core gui

    TARGET = FIR
    TEMPLATE = app


    SOURCES += main.cpp\
            widget.cpp

    HEADERS  += widget.h

    /******************************/

    wight.h:

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QtGui>

    class Widget : public QWidget
    {
        Q_OBJECT
    private:
        int a[15][15];
        int player;

        bool isWin(int, int);
        bool f1(int, int);
        bool f2(int, int);
        bool f3(int, int);
        bool f4(int, int);

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

        void paintEvent(QPaintEvent *);
        void mousePressEvent(QMouseEvent * e);
    };

    #endif // WIDGET_H

    /*****************************************/

    main:

    #include <QtGui/QApplication>
    #include "widget.h"

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

    /*****************************************/

    widget.cpp

    #include "widget.h"

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        resize(640, 640);
        player = 0;
        memset(a, 0, 15 * 15 * sizeof(int));
    }

    Widget::~Widget()
    {
       
    }

      画方格:

    void Widget::paintEvent(QPaintEvent *)
    {
        QPainter p(this);
        int i , j ;

        for(i = 0; i < 16; i++)
        {
            p.drawLine(20, 20 + i * 40, 620, 20 + i * 40);
            p.drawLine(20 + i * 40, 20, 20 + i * 40, 620);
        }

        int m = 5;
        int n = 0;
        while(1)
        {
                    QBrush brush(Qt::SolidPattern);
                    brush.setColor(Qt::blue);
                    p.setBrush(brush);
               //     p.drawRect((i+1)*20,(j+1)*20,80,80);//zheng fang xing
                //    p.drawRect((i+1)*20,(j+1)*20,40,160);//chang fang xing
                    p.drawRect((m+1)*20,(n+1)*20,80,40);
                    p.drawRect((m+3)*20,(n+3)*20,80,40);

                    //p.drawRect();
                    //p.drawEllipse(QPoint((i + 1) * 40, (j + 1) * 40), 15, 15);
        }

    }

    鼠标响应:

    void Widget::mousePressEvent(QMouseEvent * e)
    {
        /*
        setWindowTitle(QString::number(e->x()) +
                       " " +
                       QString::number(e->y()));
                       */
        int x, y;
        if(e->x() >= 20 && e->x() < 620 && e->y() >= 20 && e->y() < 620)
        {
            x = (e->x() - 20) / 40;
            y = (e->y() - 20) / 40;
            if (!a[x][y])
            {
                a[x][y] = player++ % 2 + 1;
            }
            if(isWin(x, y))
            {
                update();
                setEnabled(false);
            }
        }
        update();
    }

    判断输赢:
    bool Widget::isWin(int x, int y)
    {
        return f1(x, y) || f2(x, y) || f3(x, y) || f4(x ,y);
    }

    判断四个边界:
    bool 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 true;
        }
        return false;
    }

    bool 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 true;
        }
        return false;
    }

    bool 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 true;
        }
        return false;
    }

    bool 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 true;
        }
        return false;
    }

  • 相关阅读:
    Java操作符,<<、>>等
    abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
    使用JDBC连接各种数据库
    pt-online-schema-change的原理解析与应用说明
    MySQL Online DDL的改进与应用
    细细探究MySQL Group Replicaiton — 配置维护故障处理全集
    关于binary log那些事——认真码了好长一篇
    梳理下MySQL崩溃恢复过程
    说说MySQL中的Redo log Undo log都在干啥
    SQL SERVER大话存储结构(5)_SQL SERVER 事务日志解析
  • 原文地址:https://www.cnblogs.com/shanchen/p/2698731.html
Copyright © 2020-2023  润新知