前驱知识
1.3.6自定义窗口类(继承QWidget),自定义信号槽 QMessageBox
5.1.1mousePressEvent 鼠标点击事件:显示鼠标点击位置(完整示例)
5.2.1.1Qt鼠标点击事件处理:按Escape键退出程序
6.1使用QPixmap显示图片
游戏效果
开始界面
玩的过程中
游戏结束
游戏功能
程序运行之后,用户按键盘上的上下左右键,来控制贪吃蛇的头部往指定方向移动一个格子。
如果移动的目的地有墙壁,或者蛇自己的身体,游戏结束。
如果移动的目的地有金币(食物),蛇就会吃掉这个食物,自己的身体就会变长。
实现逻辑
1 渲染时图片大小
每个图片大小在资源里就已经确定了,可以通过接口获得。
按照图片实际大小绘制即可。
2 行数和列数的确定
具体一行几个图片,在底层类Snake类的接口里有。可以获得。
底层接口获得的行数列数最终来自于配置文件。
也就是界面最终是由配置文件决定大小的。
即,游戏的尺寸由data.txt文件里的配置决定。
3 界面绘制逻辑
假设需要绘制6x7的界面。
那就需要用双重循环绘制6x7=42个图片资源。
每个图片资源可以是:1)草地,2)食物,3)蛇头,4)蛇身)。
具体当然位置是什么,需要根据底层接口获得。
一旦确定了当然位置是哪种类型的数据,就会在if else 对应分支里加载一次qrc中的一个对应的图片资源。
加载图片资源可以得到一个QPixmap对对象。
QPixmap对象可以被QPainter绘制到界面上(x, y, width, hight, pixmap)。
这种绘制方式比较低效率,因为每次界面变化都要把所有图片资源重新读取(load)一遍。
好在我们无需考虑太多,这样可以让代码最简单。同时,用户也感知不到这种时间上的延迟。
C++的理念就是:不为不需要的东西付出代价。
绘制逻辑在ShowGame函数里。
4 和控制台贪吃蛇作业的关系
本作业的实现主要是给上面精简教程里的贪吃蛇增加一个QT的界面,底层代码不变。
而且,本作业主要考察QT的知识,所以里面贪吃蛇的底层代码给了完整的代码,无需你再去实现一次之前的贪吃蛇的控制台版本的代码。
但是你还是需要理解底层贪吃蛇代码的逻辑的。这部分需要你自己去理解。如果之前的教程你都刷过,这部分应该是轻车熟路,一看就会了。
开发环境
本文的项目为CMake项目,也可以使用VS作为开发环境,但是我建议你直接使用QtCreator作为开发环境。
因为以往教程都是使用的QtCreator作为开发环境,尤其是往qrc添加资源的时候,QtCreator有直接的界面支持。
启动代码
QSnake · CalmReason/learn-qt-with-code - 码云 - 开源中国 (gitee.com)
祝你顺利!
个性化
建议每个同学使用自己的图片素材,以互相区分!
学生完成情况展示