QT--吃月亮小游戏 原创

QT–吃月亮小游戏

简介:
  • 该设计使用了鼠标事件键盘事件绘图事件,可通过鼠标或者方向键控制人物移动吃到月亮
代码:
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

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

运行效果图:

在这里插入图片描述

posted @ 2024-08-22 13:30  mahuifa  阅读(0)  评论(0编辑  收藏  举报  来源