Skip to content

Yang-Qirui/QT_GreedySnake

Repository files navigation

QT_GreedySnake

第一周QT贪吃蛇大作业

计96 杨骐瑞

程序架构

​ 利用QLabel作为每一个网格,创建名为Snake的结构体。该结构体中包含一个label块、x,y坐标、以及该label块的type(background、border、snake、food)。通过赋予这些块不同的类型,改变其颜色,就能达到区分不同区块类型的效果。其中,border和food都是静态的成员,关键在于实现蛇的移动。为此,单独设立了一个QList<Snake*>存储蛇。通过将蛇前进方向上的下一块加入蛇列表,移除最后一个并重置为背景块,在Timer每75毫秒刷新一次的情况下,就可以达到比较流畅的游戏效果。

​ 至此,设计的原理简述完毕。对于开始游戏、暂停等等功能的编写不多赘述。这里仅说明保存和读取的实现。因为决定一个label属性的参数仅有x,y,type,我们很容易将所有的snake块、border块、food块、步数、分数的数据通过QString存储到文本文件中。

每行分别代表蛇,障碍,食物,步数,分数。

读取同理,逐行读取,split分割,很容易读取到相应的数据。

设计

采用了在一个QWidget里面编写游戏,再将其置于一个主窗口QMainWindow中。虽然这样将两者分离,或许降低了耦合度。但是问题在于,我将按钮写在了QWidget中,菜单栏和工具栏却在父类MainWindow中,导致控制按钮和菜单栏(工具栏)按钮的可用性时,需要通过信号与槽来传第一次,显得比较麻烦。所以后来我将控制按钮移到了MainWindow中,这样将游戏的控制和逻辑部分分开,或许也是OOP思想的一种体现。