持续修正更新该项目
环境:Qt 4.8 (Qt5环境也可使用)
全部文件传送门
部分重要模块代码
#include "snakegame.h"
#include "ui_snakegame.h"
SnakeGame::SnakeGame(QWidget *parent) :
QWidget(parent),
ui(new Ui::SnakeGame)
{
ui->setupUi(this);
head = new Body(rand()%18+1,rand()%10+1,40,this);
snake.push_back(head);
food = new Apple(rand()%20,rand()%12,40,this);
setDirection(rand()%4);
timer = new QTimer;
speed = 500; //半秒
timer->setInterval(speed);//间隔
connect(timer,SIGNAL(timeout()),this,SLOT(snake_move_slot()));
timer->start();
qDebug("%d %d %d %d",Qt::Key_Up,Qt::Key_Down,Qt::Key_Left,Qt::Key_Right);
}
void SnakeGame::snake_move_slot(void)
{
for(int i=snake.size()-1;i>0;i--)
{
snake[i]->move(snake[i-1]->x(),snake[i-1]->y());
}
switch(direction)
{
case Up:head->move(head->x(),head->y()-40);
break;
case Down:head->move(head->x(),head->y()+40);
break;
case Left:head->move(head->x()-40,head->y());
break;
case Right:head->move(head->x()+40,head->y());
break;
}
if(food->x()==head->x() && food->y() == head->y())
{
snake.push_back(food);
food = new Apple(rand()%20,rand()%12,40,this);
}
}
void SnakeGame::keyReleaseEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Up: setDirection(Up);
break;
case Qt::Key_Down: setDirection(Down);
break;
case Qt::Key_Left: setDirection(Left);
break;
case Qt::Key_Right: setDirection(Right);
break;
}
}
void SnakeGame::setDirection(int direction)
{
QString headImage = "border-image: url(:/snake_image/";
switch(direction)
{
case Up:
headImage += "head_up.png);";
break;
case Down:headImage += "head_down.png);";
break;
case Left:headImage += "head_left.png);";
break;
case Right:headImage += "head_right.png);";
break;
}
head->setStyleSheet(headImage);
this->direction=direction;
}