计算机软件技术实习项目二——贪吃蛇游戏开发(代码实现)

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值