实验二,贪吃蛇的开发
1、 项目概述
1.1 项目目标和主要内容
本项目实现的主要内容和目标为开发设计一款贪吃蛇游戏
使用的开发平台,采用的主要工具为qt 5.14.2
1.2 项目的主要功能
实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,
上下左右控制“蛇”的移动,
吃到“豆子”以后“蛇”的身体加长一点,得分增加,
“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。
为游戏设计初始欢迎界面,游戏界面,游戏结束界面。
- 项目设计
2.1 项目总体框架
2.2 系统详细设计
绘制界面,food,蛇头以及蛇身,随机生成食物,判断食物是否在界面内,当食物被吃时重新生成。
2.3 关键算法分析
算法1:界面设计
QFont textFont;
textFont.setPointSize(12);
textFont.setFamily("Microsoft YaHei");
QPushButton *Startbtn=new QPushButton(tr("Start"),this);
QPushButton *ResetBtn=new QPushButton(tr("Reset"),this);
m_pSlider=new QSlider(Qt::Horizontal);
m_pSlider->setFixedWidth(200);
m_pSlider->setRange(0,100);
m_pSlider->setValue(50);
QPushButton *okBtn=new QPushButton(tr("OK"),this);
QLabel *label=new QLabel(tr("Speed:"),this);
Startbtn->setFixedSize(80,27);
ResetBtn->setFixedSize(80,27);
okBtn->setFixedSize(80,27);
Startbtn->setStyleSheet("QPushButton{background: rgba(68,215,182);border:none;text-align:center;color:black;border-radius:3px;}"
"QPushButton:hover{background-color:rgb(69,133,254);border-radius:3px;color:white}");
ResetBtn->setStyleSheet("QPushButton{background: rgba(68,215,182);border:none;text-align:center;color:black;border-radius:3px;}"
"QPushButton:hover{background-color:rgb(69,133,254);border-radius:3px;color:white}");
okBtn->setStyleSheet("QPushButton{background: rgba(68,215,182);border:none;text-align:center;color:black;border-radius:3px;}"
"QPushButton:hover{background-color:rgb(69,133,254);border-radius:3px;color:white}");
Startbtn->setFont(textFont);
label->setFont(textFont);
ResetBtn->setFont(textFont);
okBtn->setFont(textFont);
QHBoxLayout *btnLayout=new QHBoxLayout(this);
btnLayout->addWidget(Startbtn);
btnLayout->addWidget(ResetBtn);
btnLayout->addWidget(label);
btnLayout->addWidget(m_pSlider);
btnLayout->addWidget(okBtn);
btnLayout->addStretch();
btnLayout->setSpacing(5);
btnLayout->setMargin(0);
m_pBtnWgt=new QWidget(this);
m_pBtnWgt->setLayout(btnLayout);
m_pBtnWgt->setFixedHeight(100);
m_pBtnWgt->setStyleSheet("background:rgb(36,167,174)");
connect(Startbtn,&QPushButton::clicked,this,&MainWindow::onStartClicked);
connect(ResetBtn,&QPushButton::clicked,this,&MainWindow::onResetClicked);
connect(okBtn,&QPushButton::clicked,this,&MainWindow::onSpeedClicked);
}
算法2:按键设置
void Widget::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Up:
if(strKey=="Down") break;
strKey="Up";
break;
case Qt::Key_Down:
if(strKey=="Up") break;
strKey="Down";
break;
case Qt::Key_Right:
if(strKey=="Left") break;
strKey="Right";
break;
case Qt::Key_Left:
if(strKey=="Right") break;
strKey="Left";
break;
default:
break;
}
}
算法3:绘制蛇头蛇身食物以及速度
this->resize(800,600);
snake_List<<QRect(0,0,SNAKE_WIDTH,SNAKE_HEIGHT)
<<QRect(15,0,SNAKE_WIDTH,SNAKE_HEIGHT);
Fruit=QRect((qrand()%(width()/SNAKE_WIDTH))*SNAKE_WIDTH, //产生随机数字
(qrand()%(height()/SNAKE_HEIGHT))*SNAKE_HEIGHT,
SNAKE_WIDTH,
SNAKE_HEIGHT);
m_pTime=new QTimer(this);
m_pTime->stop();
m_pTime->setInterval (500) ;//设置定时周期,单位:毫秒
connect(m_pTime,SIGNAL(timeout()),this,SLOT(ontimeout()));
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(Qt::red);
foreach(QRect r,snake_List){//画出蛇身
painter.drawRect(r);
}
painter.drawRect(Fruit);
}
算法4:判断蛇是否吃到食物以及增加蛇身
void Widget::ontimeout()
{
head=snake_List.first();
if(head.y()<0||head.y()>this->height()||head.x()>this->width()||head.x()<0)
{
QMessageBox msgBox;
msgBox.setText("You Die!");
msgBox.exec();
ResetSnake();
}
if(strKey=="Up")
{
head.setX(snake_List.last().x());
head.setY(snake_List.last().y()-SNAKE_HEIGHT);
}
else if(strKey=="Down")
{
head.setX(snake_List.last().x());
head.setY(snake_List.last().y()+SNAKE_HEIGHT);
}
else if(strKey=="Left")
{
head.setX(snake_List.last().x()-SNAKE_WIDTH);
head.setY(snake_List.last().y());
}
else if(strKey=="Right")
{
head.setX(snake_List.last().x()+SNAKE_WIDTH);
head.setY(snake_List.last().y());
}
head.setSize(QSize(SNAKE_WIDTH,SNAKE_HEIGHT));
if(head!=Fruit)
{
snake_List.takeFirst(); //删除第一个 删除尾部
}
else
{
Fruit=QRect((qrand()%(width()/SNAKE_WIDTH))*SNAKE_WIDTH,
(qrand()%(height()/SNAKE_HEIGHT))*SNAKE_HEIGHT,
SNAKE_WIDTH,
SNAKE_HEIGHT);
}
snake_List.append(head); //增加第一个 //增加头部
update();
}
- 程序运行结果分析
4、 总结
4.1 项目的难点和关键点
实验难点在于判断蛇吃到食物,然后蛇身增长,以及碰到墙或者身体判断失败
4.2 项目的评价
实验难度提升,更考验设计者的qt掌握情况
4.3 心得体会
对qt应用的不熟悉以及对c++的遗忘,导致一直在跟着视频做,然后有问题查找了许多资料
实验博客