zoukankan      html  css  js  c++  java
  • QT--吃月亮小游戏

    QT--吃月亮小游戏

    简介:

    • 该设计使用了鼠标事件键盘事件绘图事件,可通过鼠标或者方向键控制人物移动吃到月亮

    代码:

    1.widget.h文件:

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QPaintEvent>  //绘图事件
    #include <QMouseEvent>   //鼠标
    #include <QPoint>
    #include <QKeyEvent>   //键盘
    #include <QPainter>
    #include <QList>
    #include <QLineEdit>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    public:
        int random_x;                             //保存月亮随机坐标
        int random_y;
        int direction;                            //保存键盘事件
        int Score = 0;                            //得分
        QString Score_data;                       //保存得分
    
    
        bool meet = false;
        QPainter *painter;
        QLineEdit *line;
    
        void Wall_x(int &);
        void Wall_y(int &);                       //遇见墙壁
        void meet_s();                            //遇到月亮,重画月亮
        int Xrandom();                            //产生随机数
        int Yrandom();                            //产生随机数
        void Direction();                         //控制人物改变方向
    
    
        void paintEvent(QPaintEvent *event);      //绘图
        void mousePressEvent(QMouseEvent *event); //鼠标点击
        void mouseMoveEvent(QMouseEvent *event);  //鼠标拖动
        void keyPressEvent(QKeyEvent *event);     //键盘事件
    private:
        QPoint point;
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H

    2.widget.cpp文件:

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    #include <QPainter>  //绘图画家
    #include <QTime>
    #include <QMutableListIterator>
    
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        this->setMinimumSize(500,500);   //窗口大小
    
    
    
        point.setX(this->width()/2);                    //初始化人物 在窗口中央
        point.setY(this->width()/2);
    
        random_x = Xrandom();                          //初始化月亮
        random_y = Yrandom();
    
    }
    
    void Widget::mousePressEvent(QMouseEvent *event)  //鼠标点击
    {
        qDebug() << event->pos() ;
        point = event->pos();
        update();
    }
    
    void Widget:: mouseMoveEvent(QMouseEvent *event)  //鼠标拖动
    {
        qDebug() <<event->pos();
        point = event->pos();
        update();
    }
    
    void Widget::Wall_x(int &x)       //遇见墙壁
    {
        if(x <= 20)
        {
            x += 50;         //遇见就弹回
            Score -= 3;
        }
        else if (x >= this->width()-40)
        {
            x -= 50;
            Score -= 3;
        }
    }
    void Widget::Wall_y(int &y)      //遇见墙壁
    {
        if(y <= 20)
        {
            y += 50;
            Score -= 3;
        }
        else if (y >= this->height()-40)
        {
            y -= 50;
            Score -= 3;
        }
    }
    void Widget::keyPressEvent(QKeyEvent *event)  //键盘事件,控制人物移动
    {
        int x = point.x();
        int y = point.y();
        qDebug() << event->key() ;
        direction = event->key();
        switch(event->key())
        {
            case Qt::Key_Up:     //
                qDebug() <<"";
                y -= 10;
                Wall_y(y);
                break;
            case Qt::Key_Down:   //
                qDebug() <<"";
                y += 10;
                Wall_y(y);
                break;
            case Qt::Key_Left:   //
                qDebug() <<"";
                 x -= 10;
                 Wall_x(x);
                break;
            case Qt::Key_Right:  //
                qDebug() <<"";
                 x += 10;
                 Wall_x(x);
                break;
    
            default :
                 break;
        }
        point.setX(x) ;
        point.setY(y);
    
        qDebug() <<x <<":" <<y;
    }
    
    int Widget::Xrandom()                    //产生随机数
    {
        int random_q;
        QTime time;
        time= QTime::currentTime();
        qsrand(time.msec()+time.second()*1000);
    
        random_q = qrand() % (this->width()-40);
        if(random_q < 20)
            random_q += 20;
        return random_q;
    }
    int Widget::Yrandom()                    //产生随机数
    {
        int random_q;
        QTime time;
        time= QTime::currentTime();
        qsrand(time.msec()+time.second()*1000);
    
        random_q = qrand() % (this->height()-40);
        if(random_q < 20)
            random_q += 20;
        return random_q;
    }
    
    
    void Widget::meet_s()    //遇到月亮
    {
    
        if((point.x()-random_x < 20 && point.x()-random_x > -20)&& (point.y() - random_y < 20 &&point.y() - random_y > -20) )
            meet = true;
        if(!meet)
        {
            /*  豆豆  */
            QRectF target_Peas(random_x,random_y, 100, 100);
            QRectF source_Peas(0,0, 400,400);
            QPixmap pixmap_Peas(":/new/prefix1/peas3.jpg");         //此处使用自己添加的资源文件夹内的图片
            painter->drawPixmap(target_Peas, pixmap_Peas, source_Peas);
        }
        else
        {
            qDebug() <<"遇见";
            random_x = Xrandom();
            random_y = Yrandom();
            Score++;
            meet = false;
        }
    }
    
    void Widget::Direction()          //控制人物改变方向
    {
        QRectF target(-10,-10, 40.0, 40.0);
        QRectF source(0.0, 0.0, 400.0, 400.0);
        QPixmap pixmap_right(":/new/prefix1/character_right.jpg");        //此处使用自己添加的资源文件夹内的图片
        QPixmap pixmap1_left(":/new/prefix1/character_left.jpg");         //人物向左移动是的图片
    
        if(Qt::Key_Up == direction)                              //
        {
             painter->rotate(-90);
             painter->drawPixmap(target, pixmap_right, source);
        }
    
        else if(Qt::Key_Down == direction)                      //
        {
             painter->rotate(90);
             painter->drawPixmap(target, pixmap_right, source);
        }
        else if(Qt::Key_Left == direction)                      //
        {
             painter->drawPixmap(target, pixmap1_left, source);
        }
        else                                                    //
        {
            painter->drawPixmap(target, pixmap_right, source);
        }
    }
    void Widget::paintEvent(QPaintEvent *event)
    {
        painter = new QPainter(this);
    
        /*  画笔    */
        QPen pen (Qt::red,10);
        QPen pen1 (Qt::green,5);
        painter->setPen(pen1);
    
        /*  边框  */
        QRectF rectangle(0, 0,this->width(),this->width());
        QRectF rectangle1(10, 10, this->width()-20, this->height()-20);
    
        /*  背景  */
        QRectF target(0,0, this->width(), this->width());
        QRectF source(0,0, this->width(), this->width());
        QPixmap pixmap_background(":/new/prefix1/background.jpg");
        painter->drawPixmap(target, pixmap_background, source);
    
    
        painter->setRenderHint(QPainter::Antialiasing,true);  //抗锯齿
    
        /*  画边框  */
        painter->drawRect(rectangle);
        painter->drawRect(rectangle1);
    
        /*  得分  */
        Score_data = "得分:" + QString::number(Score);
        painter->drawText(0,0,100,100,Qt::AlignCenter,Score_data);
        painter->setPen(pen);
    
    
        meet_s();                                         //绘制月亮
        painter->translate(point.x()+10,point.y()+10);    //移动画家
    
        Direction();                                      //画人物
        update();                                         //必须要刷新
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }

    3.运行效果图:

  • 相关阅读:
    yellow joke 3
    JavaScript下拉菜单(1)
    Java程序员面试三十二问
    Oracle里时间的应用
    ·Java读取properties文件
    Web 窗体用户控件
    怎么解决层被flash挡住的问题?
    自定义控件
    关于mysql中的DDL,DML,DQL和DCL
    自定义一个简单连接池以及常见连接池的使用
  • 原文地址:https://www.cnblogs.com/IntelligencePointer/p/11519704.html
Copyright © 2011-2022 走看看