zoukankan      html  css  js  c++  java
  • Qt 贪吃蛇小游戏

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

    贴代码

    #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";
    }
    



  • 相关阅读:
    Less35、Less36【无闭合注入,mysql_real_escape_string()】
    Less34【POST方式宽字符注入】
    Less29,30,31【jsp环境搭建、WAF】
    Less28、28a【select、union、空格过滤】
    Less27、27a【select、union、空格过滤】
    Less26,26a【空格符号过滤】
    Less25,25a【and/or过滤】
    Less24【二次注入】
    Less23【报错注入】
    NFC
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160066.html
Copyright © 2011-2022 走看看