Qt 贪吃蛇小游戏

简介: 简单的实现了走和变大的样子,剩下的还在完善

image.png

贴代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QRect>
#include <QMessageBox>
#include <QString>
#include <QDebug>
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
static int rect_width = 10;
static int COL = 0;
static int ROW = 0;
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),m_foodCount(0),m_currentGrade(0),m_currentSpeed(500)
{
    ui->setupUi(this);
    this->setWindowTitle("Snake");              //set window title "Snake"
    ui->widget->installEventFilter(this);       //install eventfilter
    COL =ui->widget->width()/rect_width;
    ROW =ui->widget->height()/rect_width;
    init();
}
MainWindow::~MainWindow()
{
    timer->stop();
    delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)                   //eventfilter
{
    if(watched == ui->widget && event->type() == QEvent::Paint )
    {
        painter_rects();
//        return true;
    }
    else
    {
        return 0;
    }
    return QWidget::eventFilter(watched,event);
}
void MainWindow::creatFood()
{
    foodPosition[0] = qrand()%COL;
    foodPosition[1] = qrand()%ROW;
    for(int bodyId=0;bodyId<m_foodCount;bodyId++)
    {
        if(foodPosition[0] == snake[bodyId][0]&&foodPosition[1] == snake[bodyId][1])
        {
            foodPosition[0] = qrand()%COL-1;
            foodPosition[1] = qrand()%ROW-1;
        }
    }
}
void MainWindow::drawSnakeHead()
{
    snake[0][0] = qrand()%COL;
    snake[0][1] = qrand()%ROW;
    m_direction = qrand()%4;
}
void MainWindow::init()
{
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(slot_Timerout()));
    timer->start(m_currentSpeed);
    creatFood();
    drawSnakeHead();
}
bool MainWindow::dealGuoJie()
{
    if(snake[0][0]>(COL-1)|| snake[0][0]<0 || snake[0][1]>(ROW-1)|| snake[0][1]<0)
    {
        gameOver();
        return true;
    }
    for(int i =1;i<m_foodCount;++i)
    {
        if(snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1])
        {
            gameOver();
            return true;
        }
    }
    return false;
}
void MainWindow::gameOver()
{
    QMessageBox::information(this,QString("敬告"),QString("游戏结束"));
}
void MainWindow::flashgrade()
{
    ui->label_grade->setText(QString::number(m_currentGrade,10));
}
void MainWindow::snakeRun()
{
    if(dealGuoJie())
    {
        return;
    }
    checkEatFood();
    update();
}
void MainWindow::snakeHeadRun()
{
    switch (m_direction) {
    case UP:
        --snake[0][1];
        break;
    case DOWN:
        ++snake[0][1];
        break;
    case LEFT:
        --snake[0][0];
        break;
    case RIGHT:
        ++snake[0][0];
        break;
    default:
        break;
    }
}
void MainWindow::checkEatFood()
{
    if(snake[0][0] == foodPosition[0] && snake[0][1] == foodPosition[1])
    {
        ++m_foodCount;
        ungrade();
        flashgrade();
        creatFood();
    }
    for(int snId = m_foodCount;snId>0;--snId)
    {
        snake[snId][0] = snake[snId-1][0];
        snake[snId][1] = snake[snId-1][1];
    }
    snakeHeadRun();
}
void MainWindow::ungrade()
{
}
void MainWindow::painter_rects()
{
    QPainter painer(ui->widget);
    /*
     * draw the rects
     */
    for(int x=0;x<COL;x++)
    {
        for(int y=0;y<ROW;y++)
        {
            painer.drawRect(QRect(x*rect_width,y*rect_width,rect_width,rect_width));
        }
    }
    /*
     * draw food
     */
    painer.fillRect(QRect(foodPosition[0]*rect_width,foodPosition[1]*rect_width,rect_width,rect_width),Qt::green);
    /*
     * draw snake head
     */
    painer.fillRect(QRect(snake[0][0]*rect_width,snake[0][1]*rect_width,rect_width,rect_width),Qt::red);
    /*
     * draw snake body
     */
    for(int snakebody=1;snakebody<m_foodCount;snakebody++)
    {
        painer.fillRect(QRect(snake[snakebody][0]*rect_width,snake[snakebody][1]*rect_width,rect_width,rect_width),Qt::black);
    }
}
void MainWindow::on_pushButton_up_clicked()
{
    m_direction = UP;
    qDebug()<<"up active";
}
void MainWindow::on_pushButton_left_clicked()
{
    m_direction = LEFT;
    qDebug()<<"left active";
}
void MainWindow::on_pushButton_right_clicked()
{
    m_direction = RIGHT;
    qDebug()<<"right active";
}
void MainWindow::on_pushButton_down_clicked()
{
    m_direction = DOWN;
    qDebug()<<"down active";
}
void MainWindow::slot_Timerout()
{
    snakeRun();
    qDebug()<<"timrt is Run";
}


目录
相关文章
|
1月前
【Qt项目专栏】贪吃蛇小游戏1.0
【Qt项目专栏】贪吃蛇小游戏1.0
60 5
|
11月前
|
定位技术 图形学
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
[学习][笔记] qt5 从入门到入坟:<13>基于GraphicsViewFrame的贪吃蛇实现
【QT】实现贪吃蛇小游戏(附源码)
【QT】实现贪吃蛇小游戏(附源码)
162 0
|
自然语言处理 并行计算 数据可视化
利用QT来实现经典小游戏之经典
利用QT来实现经典小游戏之经典
228 0
利用QT来实现经典小游戏之经典
qtday03 简单版的贪吃蛇游戏
//snakegame.h #ifndef SNAKEGAME_H #define SNAKEGAME_H #include #include #include #include #include /*枚举,表示方向*/ enu...
996 0
|
2月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
129 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
27天前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
38 0
|
9天前
|
14天前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
49 2
|
24天前
Qt开发网络嗅探器02
Qt开发网络嗅探器02