话不多说,咱们先来看看效果图
以下是第一关的代码,不过基本没什么注释,将就着看吧
#include "chidialog.h"
#include "ui_chidialog.h"
#include "guodialog.h"
#include "stopdialog.h"
#include "kadialog.h"
#include "goudai1dialog.h"
ChiDialog::ChiDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ChiDialog)
{
ui->setupUi(this);
//定时器
timer=new QTimer();
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
timer->start(time);
setFixedSize(800,600);
setWindowTitle(tr("第1关"));
QRect rect(300,200,nodeWidth,nodeHeight);
snake.append(rect);
addTop();
addTop();
addNewReword();
label1=new QLabel(this);
label1->setStyleSheet("color:green;font:75 12pt '方正舒体'");
label1->setText("分数:");
label1->setGeometry(this->width()-80,10,50,30);
label2=new QLabel(this);
label2->setStyleSheet("color:green;font:75 12pt '方正舒体'");
label2->setText("0");
label2->setGeometry(this->width()-30,10,30,30);
label3=new QLabel(this);
label3->setStyleSheet("color:green;font:75 12pt '方正舒体'");
label3->setText("难度:");
label3->setGeometry(this->width()-80,40,50,30);
label4=new QLabel(this);
label4->setStyleSheet("color:green;font:75 12pt '方正舒体'");
label4->setText("1");
label4->setGeometry(this->width()-30,40,30,30);
startsound=new QSound("../bgm.wav", this);
eat=new QSound("../chi.wav", this);
die=new QSound("../die.wav", this);
startsound->play();
startsound->setLoops(-1);
}
ChiDialog::~ChiDialog()
{
delete ui;
}
void ChiDialog::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
//向上
case Qt::Key_Up:
if(!checkContact())
{
if(moveFlag !=DIR_DOWN)
{
moveFlag=DIR_UP;
}
}
break;
//向下
case Qt::Key_Down:
if(!checkContact())
{
if(moveFlag!=DIR_UP)
{
moveFlag=DIR_DOWN;
}
}
break;
//向右
case Qt::Key_Right:
if(!checkContact())
{
if(moveFlag!=DIR_LEFT)
{
moveFlag=DIR_RIGHT;
}
}
break;
//向左
case Qt::Key_Left:
if(!checkContact())
{
if(moveFlag!=DIR_RIGHT)
{
moveFlag=DIR_LEFT;
}
}
break;
//空格——暂停/开始
case Qt::Key_Space:
if(!checkContact())
{
if(kaishi==false)
{
if(gameStart==false)
{
gameStart=true;
timer->stop();
startsound->stop();
}
else
{
gameStart=false;
timer->start(time);
startsound->play();
startsound->setLoops(-1);
}
}
}
break;
case Qt::Key_Alt:
{ close();
startsound->stop();
KaDialog kd;
kd.exec();
}break;
default:
break;
}
}
void ChiDialog::timeout()
{
int count=1;
if(snake[0].intersects(rewardNode))
{
count++;
eat->play();
addNewReword();
}
while(count--)
{
switch(moveFlag)
{
case DIR_UP:
addTop();
break;
case DIR_DOWN:
addDown();
break;
case DIR_RIGHT:
addRight();
break;
case DIR_LEFT:
addLeft();
break;
default:
break;
}
}
deleteLast();
update();
int fshu=snake.length()-3;
if(fshu==10)
{
timer->stop();
startsound->stop();
close();
GuoDialog gd;
gd.exec();
}
label2->setText(QString::number(fshu));
}
void ChiDialog::addTop()
{
QPointF leftTop;
QPointF rightBotom;
if(snake[0].y()-nodeHeight<0)
{
leftTop=QPointF(snake[0].x(),this->height()-nodeHeight);
rightBotom=QPointF(snake[0].x()+nodeWidth,this->height());
}
else
{
leftTop=QPointF(snake[0].x(),snake[0].y()-nodeHeight);
rightBotom=snake[0].topRight();
}
snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addDown()
{
QPointF leftTop;
QPointF rightBotom;
if(snake[0].y()+nodeHeight*2>this->height())
{
leftTop=QPointF(snake[0].x(),0);
rightBotom=QPointF(snake[0].x()+nodeWidth,nodeHeight);
}
else
{
rightBotom=snake[0].bottomRight()+QPointF(0,nodeHeight);
leftTop=snake[0].bottomLeft();
}
snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addLeft()
{
QPointF leftTop;
QPointF rightBotom;
if(snake[0].x()-nodeWidth<0)
{
leftTop=QPointF(this->width()-nodeWidth,snake[0].y());
}
else
{
leftTop=snake[0].topLeft()-QPointF(nodeWidth,0);
}
rightBotom=leftTop+QPointF(nodeWidth,nodeHeight);
snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::addRight()
{
QPointF leftTop;
QPointF rightBotom;
if(snake[0].x()+nodeWidth*2>this->width())
{
leftTop=QPointF(0,snake[0].y());
}
else
{
leftTop=snake[0].topRight();
}
rightBotom=leftTop+QPointF(nodeWidth,nodeHeight);
snake.insert(0,QRectF(leftTop,rightBotom));
}
void ChiDialog::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPen pen;//画笔
QBrush brush;//画刷
QPixmap pix;
pix.load("../test33.jpg");
painter.drawPixmap(0,0,800,600,pix);
pen.setColor(Qt::blue);
brush.setColor(Qt::darkMagenta);
brush.setStyle(Qt::SolidPattern);
painter.setPen(pen);
painter.setBrush(brush);
for (int i=0;i
painter.drawRect(snake[i]);
}
pen.setColor(Qt::red);
brush.setColor(Qt::red);
brush.setStyle(Qt::SolidPattern);
painter.setPen(pen);
painter.setBrush(brush);
painter.drawEllipse(rewardNode);
if(checkContact())
{
timer->stop();
startsound->stop();
if(!siwang)
{
die->play();
siwang=true;
}
QFont font("方正舒体",30,QFont::ExtraLight,false);
painter.setFont(font);
painter.drawText((this->width())/3,
(this->height())/5,
QString("GAME OVER !"));
painter.drawText(((this->width())/3)+50,
(this->height())*2/5,
QString("分数:"));
painter.drawText(((this->width())/3)+200,
(this->height())*2/5,
QString::number(snake.length()-3));
close();
Goudai1Dialog gd;
gd.exec();
}
QWidget::paintEvent(event);
}
void ChiDialog::deleteLast()
{
snake.removeLast();
}
void ChiDialog::addNewReword()
{
rewardNode=QRectF(
qrand()%(this->width()/20)*20,
qrand()%(this->height()/20)*20,
nodeWidth,
nodeHeight);
}
bool ChiDialog::checkContact()
{
for(int j=0;j
for(int i=j+1;i
if(snake[j]==snake[i])
{
return true;
}
}
}
return false;
}
具体代码可以到下载
https://download.csdn.net/download/liang13654/12602219