前言
学完Qt想着写一个小游戏练练手,就想到了贪吃蛇这个小游戏,这个游戏总体上来说还是比较简单的,逻辑关系也不是很复杂。
刚开始写,因为刚学完Qt,对Qt不熟悉,就是感觉会无从下手。在写的过程中参考了别人的博客,十分感谢他们。
https://blog.csdn.net/li235456789/article/details/51010253
https://blog.csdn.net/qq_31821675/article/details/74784261
我的程序下载地址,已经打包好,可直接运行,源码也在其中:
链接:https://download.csdn.net/download/qq_36327203/10756900
程序运行截图:
基本原理
主界面设计
左侧部分用的是画矩形的方式画出表格:
//画表格
QPainter painter(this);
for(int y = 15; y < 15 + RECTWIDTH * RECTNUM; y += RECTWIDTH)
{
for(int x = 15; x < 15 + RECTWIDTH * RECTNUM; x += RECTWIDTH)
{
painter.drawRect(QRect(x, y, 50, 50));
}
}
右侧用相关部件显示相关信息:
this->resize(640, 480);
this->setWindowIcon(QIcon(":/img/snake.jpg"));
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(":/img/back.png").scaled(this->size())));
this->setPalette(palette);
pb_start = new QPushButton(this);
pb_start->setText("开始游戏");
pb_start->setStyleSheet("color: rgb(255, 172, 117); font: 75 14pt '隶书';");
pb_start->setGeometry(QRect(500, 50, 100, 50));
pb_start->setFlat(true); //透明
pb_exit = new QPushButton(this);
pb_exit->setStyleSheet("color: rgb(255, 172, 117); font: 75 14pt '隶书';");
pb_exit->setText("重新开始");
pb_exit->setGeometry(QRect(500, 120, 100, 50));
pb_exit->setFlat(true);
lb_socre = new QLabel(this);
lb_socre->setStyleSheet("color:green;font: 75 12pt '微软雅黑';");
lb_socre->setText("分数:");
lb_socre->setGeometry(500, 180, 50, 50);
lb_scoreShow = new QLabel(this);
lb_scoreShow->setStyleSheet("color:red;font: 75 12pt '微软雅黑';");
lb_scoreShow->setText("0");
lb_scoreShow->setGeometry(550, 180, 50, 50);
lb_prompt = new QLabel(this);
lb_prompt->setStyleSheet("color: rgb(226, 192, 255); font: 75 14pt '微软雅黑';");
lb_prompt->setText("w,a,s,d控制上下左右,k开始游戏,j重新开始\n祝您玩得愉快!");
lb_prompt->setGeometry(500, 240, 100, 200);
lb_prompt->setWordWrap(true); //自动换行
蛇身的更新
蛇身的跟新其实是最麻烦的,如果没有遇到食物,更新方式为:蛇头向指定方向更新一格,剩余部分每个节点更新到它前面一格节点;
如果将遇到食物,更新方式为:蛇头更新为食物坐标,增加最后一个节点,节点为原来设为的坐标,剩余部分每个节点更新到它前面一格节点。
详细请参考代码。
向上移动的代码
void Snake::up_pressed()
{
if (direc != Direction_Down)
{
if (snake[0].ry() - 1 < 0 ||
touchSlef(QPoint(snake[0].rx(), snake[0].ry() - 1))) //碰到墙壁
{
overBox();
}
else
{
direc = Direction_Up;
if (QPoint(snake[0].rx(), snake[0].ry() - 1) == food)
{
upDateFood();
snake[m_snakeLenth] = QPoint(snake[m_snakeLenth - 1].rx(), snake[m_snakeLenth - 1].ry());
m_snakeLenth++;
}
//蛇身更新
for(int i = m_snakeLenth - 1; i > 0; i--)
{
snake[i] = snake[i - 1];
}
snake[0].ry() -= 1;
}
repaint();
}
}
遇到的问题
从控制台黑框框到编写图形界面的问题:
刚开始做的时候,感觉会无从下手,我的感觉就是不知道怎么设计,比如说画表格,不知道怎么画,再比如画图片,图片怎么添加到界面上?这些都是刚开始做会遇到的问题。但参考的别人的代码,知道了怎么用,后面的逻辑关系,就简单一些了。
还有,多查资料,多百度,Qt的官方文档看起来暂时有些困难,但是百度上面也有许多知识点,以后再慢慢看官方手册。
总结
贪吃蛇的基本框架算是完成了,可以改进的地方:
- 难度选择,改变定时器时间可以解决
QQ:1570553025
github:https://github.com/myzcl
微信公众号,扫二维码即可关注: