Qt-0 代码

头文件

firstwindow.h

#ifndef FIRSTWINDOW_H
#define FIRSTWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QPainter>
#include "playwindow.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class FirstWindow;
}
QT_END_NAMESPACE

class FirstWindow : public QMainWindow
{
    Q_OBJECT

public:
    FirstWindow(QWidget *parent = nullptr);
    ~FirstWindow();
    void paintEvent(QPaintEvent *event);

private:
    Ui::FirstWindow *ui;
private slots:
    void jump();

    void on_pushButton_clicked();
};
#endif // FIRSTWINDOW_H

playwindow.h

#ifndef PLAYWINDOW_H
#define PLAYWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include<QKeyEvent>
#include<QTimer>

namespace Ui {
class PlayWindow;
}

typedef enum Direct{
    LEFT,RIGHT,UP,DOWN
}dir_t;

class PlayWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit PlayWindow(QWidget *parent = nullptr);
    ~PlayWindow();

protected:

    void keyPressEvent(QKeyEvent *event);
    void addtop();
    void adddown();
    void addright();
    void addleft();

    void paintEvent(QPaintEvent *event);
    void deleteLast();
    void addreward();

    bool crash();

private:
    Ui::PlayWindow *ui;

    dir_t moveflag=UP;
    bool gameStart =false;

    QTimer *timer;
    int time= 200;


    QList <QRectF> snake;


    QRectF reward;


    int nodewidth = 20;
    int nodeheight = 20;


protected slots:
    void timeout();


private slots:
    void on_pushButton_clicked();
};

#endif // PLAYWINDOW_H

源文件

firstwindow.cpp

#include "firstwindow.h"
#include "./ui_firstwindow.h"
#include "playwindow.h"
#include <QPainter>

FirstWindow::FirstWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::FirstWindow)
{
    ui->setupUi(this);
    this->setWindowFlag(Qt::FramelessWindowHint);
    QPushButton *button =new QPushButton(this);
    //button->setStyleSheet("QPushButton{border:none;}");
    button->setText("开始游戏");
    button->move(350,400);
    connect(button,SIGNAL(clicked(bool)),this,SLOT(jump()));
}

void FirstWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,width(),height(),QPixmap(":/background.JPG"));
}

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

void FirstWindow::jump()
{
    PlayWindow *sec =new PlayWindow;
    sec->show();
    close();
}

void FirstWindow::on_pushButton_clicked()
{
    this->close();
}

main.cpp

#include "firstwindow.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "untitled_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    FirstWindow w;
    w.show();
    return a.exec();
}

playwindow.cpp

#include "playwindow.h"
#include "ui_playwindow.h"
#include<QPainter>
#include<QFont>

PlayWindow::PlayWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::PlayWindow)
{
    ui->setupUi(this);
    this->setWindowFlag(Qt::FramelessWindowHint);
    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));


    resize(600,368);


    QRectF rect(300,100,nodewidth,nodeheight);
    snake.append(rect);
    addtop();
    addtop();


    addreward();

}

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


void PlayWindow::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
    case Qt::Key_Up:
        if(moveflag != DOWN)
            moveflag=UP;
        break;

    case Qt::Key_Down:
        if(moveflag != UP)
            moveflag=DOWN;
        break;

    case Qt::Key_Left:
        if(moveflag != RIGHT)
            moveflag=LEFT;
        break;

    case Qt::Key_Right:
        if(moveflag != LEFT)
            moveflag=RIGHT;
        break;

    case Qt::Key_Space:
        if(gameStart==false)
        {
            gameStart = true;
       
            timer->start(time);
        }
        else
        {
            gameStart = false;
            timer->stop();
        }
        break;

    default:    break;
    }
}

void PlayWindow::timeout()
{
    int count =1;

    if(snake[0].intersects(reward))
    {
        count++;
        addreward();

    }
    while(count--)
    {
        switch(moveflag)
        {
        case UP:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         P:

            addtop();
            break;
        case DOWN:
            adddown();
            break;
        case RIGHT:
            addright();
            break;
        case LEFT:
            addleft();
            break;
        default: break;
        }
    }

    deleteLast();
    update();
}

void PlayWindow::addtop()
{
    QPointF lefttop;
    QPointF rightbottom;

    if(snake[0].y()-nodeheight<0)
    {
        lefttop = QPoint(snake[0].x(),this->height()-nodeheight);
        rightbottom  = QPointF(snake[0].x() + nodewidth,this->height());
    }
    else
    {
        lefttop = QPointF(snake[0].x(),snake[0].y()-nodeheight);
        rightbottom = snake[0].topRight();
    }
    snake.insert(0,QRectF(lefttop,rightbottom));
}

void PlayWindow::adddown()
{
    QPointF lefttop;
    QPointF rightbottom;

    if(snake[0].y()+nodeheight*2>this->height())
    {
        lefttop = QPointF(snake[0].x(),0);
        rightbottom  = QPointF(snake[0].x() +nodewidth,nodeheight);
    }
    else
    {
        lefttop = snake[0].bottomLeft();
        rightbottom = snake[0].bottomRight()+QPointF(0,nodeheight);
    }
    snake.insert(0,QRectF(lefttop,rightbottom));
}

void PlayWindow::addleft()
{
    QPointF lefttop;
    QPointF rightbottom;

    if(snake[0].x()-nodewidth<0)
    {
        lefttop = QPointF(this->width()-nodewidth,snake[0].y());
    }
    else
    {
        lefttop = snake[0].topLeft()-QPointF(nodewidth,0);
    }
    rightbottom  = lefttop+QPointF(nodewidth,nodeheight);
    snake.insert(0,QRectF(lefttop,rightbottom));
}

void PlayWindow::addright()
{
    QPointF lefttop;
    QPointF rightbottom;
    if(snake[0].x()+nodewidth*2>this->width())
    {
        lefttop=QPointF(0,snake[0].y());
    }
    else
    {
        lefttop=snake[0].topRight();
    }
    rightbottom  = lefttop+QPointF(nodewidth,nodeheight);
    snake.insert(0,QRectF(lefttop,rightbottom));
}

void PlayWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPixmap pix;
    pix.load(":/background.JPG");
    painter.drawPixmap(0,0,600,368,pix);



    QPen pen;
    QBrush brush;

    pen.setColor(Qt::black);
    brush.setColor(Qt::darkMagenta);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);

    for(int i=0;i<snake.length();i++)
    {
        painter.drawRect(snake[i]);

    }

    pen.setColor(Qt::red);
    brush.setColor(Qt::red);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.drawEllipse(reward);
    QWidget::paintEvent(event);

    if(crash())
    {
        QFont font("方正舒体",30,QFont::ExtraLight,false);
        painter.setFont(font);
        painter.drawText((this->width()-300)/2,(this->height()-30)/2,QString("Game Over!"));
        timer->stop();
    }
}

void PlayWindow::deleteLast()
{
    snake.removeLast();
}

void  PlayWindow::addreward()
{
    reward=QRectF(
        rand()%(this->width()/20)*20,
        rand()%(this->height()/20)*20,
        nodewidth,nodeheight);
}

bool PlayWindow::crash()
{
    for(int j=0;j<snake.length();j++)
    {
        for(int i=j+1;i<snake.length();i++)
        {
            if(snake[i]==snake[j])  return true;
        }
        return false;
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值