widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QPushButton>//按钮
#include<QMessageBox>//消息对话框
#include"gamewidget.h"
#include"shuoming.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QPushButton bt1;
QPushButton *bt2;
QPushButton *bt3;
void paintEvent(QPaintEvent *event);
Gamewidget game;//副窗口
shuoming w;
public slots:
void nextslot();
void returnslot();
void thirdslot();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
gamewidget.h
#ifndef GAMEWIDGET_H
#define GAMEWIDGET_H
#include <QWidget>
#include <QKeyEvent>
#include <QTimer>
#include<QPushButton>
typedef enum Direct{
left,
right,
down,
up,
}dir;
class Gamewidget : public QWidget
{
Q_OBJECT
public:
explicit Gamewidget(QWidget *parent = nullptr);
QPushButton *sub_b1 ;//返回按钮
QPushButton *score;
QPushButton *s;
void keyPressEvent(QKeyEvent *event);//按键处理
void paintEvent(QPaintEvent *event);
void addtop();
void adddown();
void addright();
void addleft();
void deletelast();
void addfood();
bool check();
protected slots:
void timeout();//超时处理函数
void sendSignal();//槽函数,用来发送返回信号
private:
int direct=up;
bool gamestart=false;
QTimer *timer;
int t=100;// 超时时间间隔 ms
QList <QRectF> snake;
int Width=20;
int Height=20;
int score1=0;
QRectF food;
signals:
void mySignal();
};
#endif // GAMEWIDGET_H
shuoming.h
#ifndef SHUOMING_H
#define SHUOMING_H
#include <QWidget>
#include<QPushButton>
class shuoming : public QWidget
{
Q_OBJECT
public:
explicit shuoming(QWidget *parent = nullptr);
QPushButton *b1 ;//返回按钮
void paintEvent(QPaintEvent *event);
signals:
void mySignal();
protected slots:
void sendSignal();//槽函数,用来发送返回信号
};
#endif // SHUOMING_H
widget.cpp
#include "widget.h"
#include "./ui_widget.h"
#include<QPalette>
#include<QPainter>
#include"gamewidget.h"
#include"shuoming.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("win1");
this->resize(1000,600);
bt1.setParent(this);
bt1.setText("关闭游戏");
bt1.resize(100,50);
bt1.move(450,360);
bt2=new QPushButton(this);
bt2->setText("开始游戏");
bt2->resize(100,50);
bt2->move(450,300);
bt3=new QPushButton(this);
bt3->setText("游戏说明");
bt3->resize(100,50);
bt3->move(450,420);
connect(&bt1,SIGNAL(clicked()),this,SLOT(close()));
connect(bt2,SIGNAL(clicked()),this,SLOT(nextslot()));
connect(bt3,SIGNAL(clicked()),this,SLOT(thirdslot()));
connect(&game,SIGNAL(mySignal()),this,SLOT(returnslot()));
connect(&w,SIGNAL(mySignal()),this,SLOT(returnslot()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::nextslot()//跳转到子窗口
{
this->hide();
game.show();
}
void Widget::returnslot()//返回主窗口
{
this->show();
game.hide();
}
void Widget::thirdslot()//返回主窗口
{
this->hide();
w.show();
}
void Widget::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPixmap p;
p.load("D:/VC++/qt document/NOWD$U{[Q`U)}]%9B35QKJJ.jpg");
painter.drawPixmap(0,0,1000,600,p);
}
gamewidget.cpp
#include "gamewidget.h"
#include<QPainter>
Gamewidget::Gamewidget(QWidget *parent)
: QWidget{parent}
{
this->setWindowTitle("贪吃蛇");
this->resize(1000,600);
//定时器,定时器又一个超时信号timeout
timer= new QTimer();
//信号槽
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
resize(1000,600);
//初始化蛇
QRect rect(500,300,Width,Height);
snake.append(rect);
addtop();
addtop();
//初始化奖品
addfood();
//设置返回按钮sub_b1
sub_b1 = new QPushButton(this);
sub_b1->setText("退出游戏");
sub_b1->move(0,10);
sub_b1->resize(60,30);
score = new QPushButton(this);
score->move(100,10);
score->resize(60,30);
score->setText("成绩:");
s = new QPushButton(this);
s->move(200,10);
s->resize(150,30);
s->setText("按Z键开始或者暂停");
//绑定返回按钮sub_b1和sendSignal()
connect(sub_b1,SIGNAL(clicked()),this,SLOT(sendSignal()));
}
void Gamewidget::sendSignal()
{
emit mySignal();//发送给父窗口信号
}
void Gamewidget::keyPressEvent(QKeyEvent *event){
switch(event->key()){
case Qt::Key_W:
if(!check()){
if(direct!=down){
direct=up;
}
}
break;
case Qt::Key_S:
if(!check()){
if(direct!=up){
direct=down;
}}
break;
case Qt::Key_A:
if(!check()){
if(direct!=right){
direct=left;
}}
break;
case Qt::Key_D:
if(!check()){
if(direct!=left){
direct=right;
}}
break;
case Qt::Key_Z:
if(!check()){
if(gamestart==false){
gamestart=true;
timer->start(t);
}else{
gamestart=false;
timer->stop();
}
}
break;
default:
break;
}
}
void Gamewidget::timeout(){
int cout=1;
while(cout--){
switch(direct){
case up:
addtop();
if(snake[0].intersects(food)){
cout++;
score1++;
score->setText("成绩:"+QString::number(score1));
addfood();
}
break;
case down:
adddown();
if(snake[0].intersects(food)){
cout++;
score1++;
score->setText("成绩:"+QString::number(score1));
addfood();
}
break;
case right:
addright();
if(snake[0].intersects(food)){
cout++;
score1++;
score->setText("成绩:"+QString::number(score1));
addfood();
}
break;
case left:
addleft();
if(snake[0].intersects(food)){
cout++;
score1++;
score->setText("成绩:"+QString::number(score1));
addfood();
}
break;
default:
break;
}
}
deletelast();
update();
}
//判断有没有吃到食物
void Gamewidget::addtop(){
QPointF lefttop; //表示坐标的一个点
QPointF rightbotton;
if(snake[0].y()-Height<0){
lefttop=QPointF(snake[0].x(),this->height()-Height);
rightbotton=QPointF(snake[0].x()+Width,this->height());
}else{
lefttop=QPointF(snake[0].x() , snake[0].y()-Height);
rightbotton=snake[0].topRight();
}
snake.insert(0,QRectF(lefttop,rightbotton));
}
void Gamewidget::adddown(){
QPointF lefttop;
QPointF rightbotton;
if(snake[0].y()-Height*2>this->height()){
lefttop=QPointF(snake[0].x() , 0);
rightbotton=QPointF(snake[0].x()+Width,Height);
}else{
lefttop=snake[0].bottomLeft();
rightbotton=snake[0].bottomRight()+QPointF(0,Height);
}
snake.insert(0,QRectF(lefttop,rightbotton));
}
void Gamewidget::addleft(){
QPointF lefttop;
QPointF rightbotton;
if(snake[0].x()-Width<0){
lefttop=QPointF(this->width()-Width , snake[0].y());
}else{
lefttop=snake[0].topLeft()-QPointF(Width,0);
}
rightbotton = lefttop + QPointF(Width,Height);
snake.insert(0,QRectF(lefttop,rightbotton));
}
void Gamewidget::addright(){
QPointF lefttop;
QPointF rightbotton;
if(snake[0].x()-Width*2>this->width()){
lefttop=QPointF(0 , snake[0].y());
}else{
lefttop=snake[0].topRight();
}
rightbotton = lefttop + QPointF(Width,Height);
snake.insert(0,QRectF(lefttop,rightbotton));
}
void Gamewidget::deletelast(){
snake.removeLast();
}
bool Gamewidget::check(){
for (int i=0;i<snake.length();i++)
for(int j=i+1;j<snake.length();j++){
if(snake[i]==snake[j]){
return true;
}
}
return false;
}
void Gamewidget::addfood(){
food = QRectF(
rand()%(this->width()/20)*20,
rand()%(this->height()/20)*20,
Width,
Height
);
}
void Gamewidget::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPen pen;
QBrush brush;
QPixmap p;
p.load("D:/VC++/qt document/7ad481bd0896d3d58fa1d6b4188f5c8.png");
painter.drawPixmap(0,0,1000,600,p);
pen.setColor(Qt::black);
brush.setColor(Qt::gray);
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::green);
brush.setColor(Qt::green);
brush.setStyle(Qt::SolidPattern);
painter.setPen(pen);
painter.setBrush(brush);
painter.drawEllipse(food);
if(check()){
QFont font("微软雅黑",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width()-300)/2,
(this->height()-30)/2,
QString("游戏结束")
);
timer->stop();
}
QWidget::paintEvent(event);
}
shuoming.cpp
#include "shuoming.h"
#include<QPainter>
shuoming::shuoming(QWidget *parent)
: QWidget{parent}
{
this->setWindowTitle("贪吃蛇");
this->resize(600,500);
b1 = new QPushButton(this);
b1->setText("返回游戏");
connect(b1,SIGNAL(clicked()),this,SLOT(sendSignal()));
}
void shuoming::sendSignal()
{
emit mySignal();//发送给父窗口信号
}
void shuoming::paintEvent(QPaintEvent *event){
QPainter painter(this);
QPixmap p;
p.load("D:/VC++/qt document/7ad481bd0896d3d58fa1d6b4188f5c8(1).png");
painter.drawPixmap(0,0,600,500,p);
}