QT5写的贪吃蛇


QT5写的贪吃蛇

大概弄了下,写的不好,咳咳。。。我只是想在linux上玩这玩意。。。好多东西也懒得弄了,很粗糙,咳咳。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 

namespace Ui {
class MainWindow;
}
//蛇运动的方向
const int up   = 1;
const int down = 2;
const int left = 3;
const int right= 4;

typedef struct BodyPos
{
    int x;
    int y;
}BodyPos;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
protected:
    void paintEvent(QPaintEvent *);
    void keyPressEvent(QKeyEvent *);
    void timerEvent(QTimerEvent *);
public:
    int Direct;
    int id1;
    QSound *sound;
    QSound *music;
    int BodyNode;//蛇的节点数
    BodyPos rfpos;
    QVector myBody;
    QRect re;
    int Body[50];
    BodyPos pos[50];
    QTime time2;

    //函数
    void EmptyArray(int a[]);
    void DrawBody();
    void InitFood();
    void RandFood();
    void CheckCrush();
    void CheckEat();
    void CheckBodyCrush();
private slots:
    void on_action_triggered();
    void on_action_4_triggered();
    void on_action_5_triggered();
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define max 50
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    EmptyArray(Body);
    pos[0].x = 40;
    pos[0].y = 40;
    pos[1].x = 30;
    pos[1].y = 40;
    pos[2].x = 20;
    pos[2].y = 40;
    pos[3].x = 10;
    pos[3].y = 40;
    pos[4].x = 0;
    pos[4].y = 40;
    BodyNode = 4;
    Direct = right;
    InitFood();
    sound = new QSound(tr("../Qtstudy_Snake/piece.wav"),this);
    music = new QSound(tr("../Qtstudy_Snake/FG.mp3"),this);
    time2= QTime::currentTime();
    qsrand(time2.msec()+time2.second()*1000);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::keyPressEvent(QKeyEvent *key)
{
    switch(key->key())
    {
       case Qt::Key_Up :    if(Direct != down) Direct = up; break;
       case Qt::Key_Down :  if(Direct != up) Direct = down; break;
       case Qt::Key_Left :  if(Direct != right) Direct = left; break;
       case Qt::Key_Right : if(Direct != left) Direct = right; break;
    }
}
void MainWindow::timerEvent(QTimerEvent *time)
{
    for(int i = max-1;i > 0; i--)
    {
        if(Body[i] == 1)
        {
            pos[i] = pos[i-1];
        }
    }
    CheckEat();

    if(time->timerId() == id1)
    {
        switch(Direct)
        {
            case up : pos[0].y-=10; break;
            case down : pos[0].y+=10; break;
            case left : pos[0].x-=10; break;
            case right : pos[0].x+=10; break;
        }
    }
    CheckBodyCrush();
    CheckCrush();
    update();
}
void MainWindow::InitFood()
{
    Body[0] = 1;
    Body[1] = 1;
    Body[2] = 1;
    Body[3] = 1;
}
//随机化食物
void MainWindow::RandFood()
{
    QPainter rect(this);
    QBrush rbrush(QColor(30,230,45));
    rbrush.setStyle(Qt::SolidPattern);
    rect.setBrush(rbrush);
    QRectF sq(rfpos.x,rfpos.y,10,10);
    rect.drawRect(sq);
}
void MainWindow::CheckEat()
{
    if((rfpos.x == pos[0].x+10&&rfpos.y == pos[0].y&&Direct == right) ||
          (rfpos.x == pos[0].x&&rfpos.y == pos[0].y-10&&Direct == up)||
            (rfpos.x == pos[0].x-10&&rfpos.y == pos[0].y&&Direct == left)||
            (rfpos.x == pos[0].x&&rfpos.y == pos[0].y+10&&Direct == down))
    {
        for(int i = 0 ; i < max;i++)
        {
            if(Body[i] == 0)
            {
                Body[i] = 1;
                break;
            }
        }
        rfpos.x = (qrand() % 50)*10;
        rfpos.y = ((qrand() % 35)+2)*10;
        sound->play();
        //update();
    }
}
void MainWindow::CheckBodyCrush()
{
    BodyPos Lpos[50];
    for(int i = 0;iplay();
    music->play();
}



你可能感兴趣的:(Qt)