当前位置: 华文问答 > 游戏

5.3 作业 Qt贪吃蛇游戏

2024-02-24游戏

前驱知识

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)

祝你顺利!

个性化

建议每个同学使用自己的图片素材,以互相区分!

学生完成情况展示