头文件
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;
}
}