qt 编写的贪吃蛇游戏

https://github.com/youngjeff/qt/tree/master/snake这是下载地址,可以下载看看源码,这是在豆子的源码下我做了一些改变.

开始

在qt中,有自己完整的一套机制来完善游戏控制,

其中三个重要的组建:

QGraphicsScene:能够管理元素的非 GUI 容器;

QGraphicsItem:能够被添加到场景的元素;

QGraphicsView:能够观察场景的可视化组件视图。

在场景坐标就是系统窗口(QGraphicsScene)的坐标,它(0,0)作为它的左上角坐标.

视口坐标相当于场景坐标的数学变换,如当一个窗口坐标为(0,0)至(100,100)那么这个窗口就是实实在在的由100*100个像素组成,此时把坐标变换为(-50,50)(即场景坐标(0,0))至(50,-50)(即场景坐标为(100,100))那么这个视口坐标就是以(0,0)为中心了.当放大缩小item时可以改变视口坐标的大小(如放大1倍)视口坐标可以变为(0,0)至(50,50).

项总是在它们自己的局部坐标中。它们的坐标一般是围绕它们的中心点(0,0),并且这个中心也是左右变换的中心。项坐标系统中的简单几何件一般是指项点、项线、项长方形。

我们从食物开始。因为它是最简单的。我们将其作为一个红色的小圆饼,大小要比地图中的一个方格要小,因此我

们可以将其放置在一个方格中。正如上面分析的那样,我们的 Food 类需要继承 QGraphicsItem。按照接口约束,

QGraphicsItem 的子类需要重写至少两个函数:boundingRect() 和 paint()。

5 boundingRect() 返回一个用于包裹住图形元素的矩形,也就是这个图形元素的范围。需要注意的是,这个矩形必> 须能够 完全包含 图形元素。所谓“完全包含”,意思是,在图形元素有动画的时候,这个矩形也必须将整个图形元

素包含进去。如果范围矩形过小。图形会被剪切;如果范围矩形过大,就会影响性能。

##6

##7 paint() 的作用是使用 QPainter 将图形元素绘制出来。

##8 接下来是有关蛇的处理。

##9

##10 蛇要更复杂一些。在我们的游戏中,蛇是由黄色的小方块组成,这是最简单的实现方式了。第一个是蛇的头部,紧

接着是它的身体。对此,我们有两个必须面对的困难:

##11

##12 蛇具有复杂得多的形状。因为蛇的形状随着游戏者的控制而不同,因此,我们必须找出一个能够恰好包含蛇头和所

有身体块的矩形。这也是 boundingRect() 函数所要解决的问题。

##13 蛇会长大(比如吃了食物之后)。因此,我们需要在蛇对象中增加一个用于代表蛇身体长度的 growing 变量:当 growing 为正数时,蛇的身体增加一格;当 growing 为负数时,蛇的身体减少一格。

##14 advance() 函数用于编码移动部分,这个函数会在一秒内调用 30 次(这是我们在 GameController 的定时器中决

定的)。