学习Qt之后便找了贪吃蛇这个小项目来练习,因为没有使用UI,因此在绘制方面工程量较大
首先了解贪吃蛇的游戏逻辑:
1.食物随机出现,蛇头与蛇尾随机(完成游戏初始化)
2.蛇碰到食物蛇身变长
3.不按键时蛇按照当前方向前进
4.按键转向
5.蛇触碰到自己和边缘游戏结束
第一阶段初步完成时,完成情况如下:
所需要实现的功能:
1.注册以及各种判定,注册信息存入数据库 √
2.更改密码以及各种判定,更新密码信息存入数据库 √
3.登录后进入相应游戏界面 √
4.游戏主体相关功能:
蛇头和食物初次随机出现 √
通过点击界面中相关按键控制蛇的转向 √
游戏开始和暂停(同一个按钮连接不同的槽) √
游戏结束以后能够按开始键重新开始 √ BUG:有时候不够灵敏,存在小bug)
游戏的退出 √ BUG: 按下退出键以后直接退出程序,应用程序输出显示:程序异常结束。未能实现返回登录界面即切换用户功能。
5.游戏得分数存入数据库 √
7.同一用户名数据能够及时更新 √
8.排行榜功能要有排序输出 ×
目前实现界面搭建和按键跳转功能 通过qDebug()能够将数据库中内容按得分从高到低调试输出
编写该模块的时候存在的问题:
在添加了QPubutton 返回按钮后,再添加QLabel或者其他任意框体控件的时候,编译时会出现"程序异常结束"的调试报告。
通过百度以后初步怀疑应该是存在与内存有关的问题。目前该问题尚未解决。
第二次修改阶段
1.解决了排行榜界面不能添加按钮的问题,通过QTextEdit绘制文本框,设置关闭输入功能,利用append函数将数据库中内容按得分从高到低的顺序显示到文本框中。代码如下:
QSqlQuery query;
query.exec("select username, score from userinfor order by score desc");
while(query.next())
{
QString name = query.value(0).toString();
QString score = query.value(1).toString();
// qDebug() << "name" << name;
textEdit->setTextColor(Qt::white);
textEdit->setFontPointSize(12);
textEdit->setFontWeight(25);
textEdit->append(name+" \t"+score);
}
存在问题: 在显示排行榜的时候存在部分数据不能对齐输出,同时在一行输出过长时,TextEdit文本框会自动换行
2.添加 EXIT 退出返回登录界面功能,实现便捷用户切换,不需要重新打开程序。同时添加退出提示,防止误触
3.发现游戏bug,游戏gameover时,蛇身仍然保持最后出现的长度,同时分数不清零,第一次写该段代码时不够严谨,着重点放在了如何将数据存入数据库,未添加蛇身以及分数初始化接口。修改后代码如下:
void gamemainwindow::M_CheckGameOver()
{
if(0>snake[0][0]||snake[0][0]>600||0>snake[0][1]||snake[0][1]>480||(!Nobite))
{
Nobite=true;//将其设置为真,进入绘图函数画出蛇的身体
this->update();//调用绘图事件函数
Timer->stop();
if(QMessageBox::Yes==QMessageBox::information(this,"Tips:","Game Over!",QMessageBox::Yes))
{
QString s = QString(" update userinfor set score = '%1' where username = '%2';").arg(Score).arg(UName);
QSqlQuery query;
query.exec(s);
snake_Init();
Score = 0; //重置分数
Difficulty = 1; //重置等级
ScoreLabelNumber->setText(QString::number(Score)+"分");//写入
LevelLabelNumber->setText(QString::number(Difficulty)+"级");
}
}
}
到此为止第一阶段列出所有功能全部实现。
另外,还可以添加的功能为:
1.持续按键时,增加蛇的移动速度
2.增加调节难度按钮
3.改善排行榜界面