//snakegame.h
#ifndef SNAKEGAME_H #define SNAKEGAME_H #include<QList> #include<QtWidgets/QLabel> #include<QtWidgets/QDialog> #include<QKeyEvent> #include<QTimer> /*枚举,表示方向*/ enum Direction{D_UP,D_DOWN,D_LEFT,D_RIGHT}; class SnakeGame:public QDialog { Q_OBJECT public: SnakeGame() ; ~SnakeGame(); public slots: void snakemove();/*移动*/ public: QLabel* getfood();/*产生新食物*/ void keyPressEvent(QKeyEvent *key); private: QList<QLabel*> snake;/*蛇*/ QLabel * food;/*食物*/ Direction dire;/*方向*/ int foodlen;/*食物长度*/ int maxlen;/*最大长度*/ QTimer * timer;/*定时器*/ }; #endif // SNAKEGAME_H
//snakegame.cpp
#include "snakegame.h" #include<QTime> #include<QMessageBox> SnakeGame::SnakeGame(){ this->resize(760,600); foodlen=40;/*食物的高/宽*/ qsrand(QTime::currentTime().msec()); timer=new QTimer(this); timer->setInterval(300); timer->start(); snake.push_back(getfood()); food=getfood(); maxlen=5; dire=D_RIGHT; connect(timer,SIGNAL(timeout()),this,SLOT(snakemove())); } SnakeGame::~SnakeGame(){ delete timer; delete food; for(int i=0;i<snake.length();i++){ delete snake[i]; } } void SnakeGame::snakemove(){ int x=snake[0]->x(); int y=snake[0]->y(); bool isover=false;/*自己碰到自己,结束*/ for(int i=1;i<snake.length();i++){ if(snake[0]->x()==snake[i]->x() && snake[0]->y()==snake[i]->y()){ isover=true; break; } } if(snake.size()>=maxlen){ QMessageBox msg(this); msg.setText("Continue ?"); msg.setStandardButtons(QMessageBox::Yes|QMessageBox::No); if(msg.exec()==QMessageBox::No) { this->close(); } else{ maxlen=maxlen*2+1; } } else if(x<0|| y<0 || x>this->width()|| y>this->width()|| isover==true){ QMessageBox msg(this); msg.setText("Game over!"); msg.exec(); this->close(); } if(x==food->x()&& y==food->y()){ snake.push_back(food); food=getfood(); } /*把后面的移动一步,*/ for(int i=snake.length()-1;i>=1;i--){ snake[i]->move(snake[i-1]->x(),snake[i-1]->y()); } switch (dire) { case D_UP: y=y-foodlen; break; case D_DOWN: y=y+foodlen; break; case D_LEFT: x=x-foodlen; break; case D_RIGHT: x=x+foodlen; break; default: break; } /*把头移动一步*/ snake[0]->move(x,y); } QLabel* SnakeGame::getfood(){ food=new QLabel(this); food->resize(foodlen,foodlen); food->setAutoFillBackground(true); /*随机颜色*/ //qDebug(QString::number(i).toStdString()); food->setPalette(QPalette(QColor(qrand()%256,qrand()%256,qrand()%256))); int w=this->width()-foodlen; int h=this->height()-foodlen; food->move((qrand()%w)/foodlen*foodlen, (qrand()%h/foodlen*foodlen)); food->show(); return food; } void SnakeGame::keyPressEvent(QKeyEvent *key){ switch (key->key()) { case Qt::Key_Left: if(dire!=D_RIGHT) dire=D_LEFT; break; case Qt::Key_Right: if(dire!=D_LEFT) dire=D_RIGHT; break; case Qt::Key_Up: if(dire!=D_DOWN) dire=D_UP; break; case Qt::Key_Down: if(dire!=D_UP) dire=D_DOWN; break; default: break; } }
//main.cpp
#include<QApplication> #include "snakegame.h" int main(int argc,char* argv[]) { QApplication app(argc,argv); SnakeGame sg; sg.show(); return app.exec(); }