No.3
贪吃蛇
设计教材内容 第八章
这里主要是食物的防止和蛇的游走,蛇我用QGraphicsPathItem,
然后用QList<QPointF> snake来确定蛇身体坐标
场景坐标为400X400,左上角定点坐标为(0,0),右下角点坐标为(400,400)
每个格子都占据20X20的QRectF,蛇身的坐标为格子的中心
距离场景最左上角的格子坐标(0,0,20,20),如果蛇头位于这个格子
则有*(snake.begin()) == QPointF(10,10)
即蛇身体所处格子的坐标为 (格子场景坐标.x()+10,格子场景坐标.y()+10)
另外在写代码的时候需要很多变量,一般来说使用枚举会直观性,但由于很多变量需要计算,而且我在写代码是经常遇到需要额外加一些,所以我这里使用了int +注释的形式
比如代表蛇运动方向,一般可能会
emun {left,up,down,right};类似这样
我在代码里是
int turns; //这里turns代表蛇的方向,取值-1=左,1=右,-2=上,2=下
这种形式
食物的坐标同
开始的时候蛇和食物位置固定,在游戏菜单中,
新游戏:建立一个新游戏
开始:游戏开始(蛇开始运动)
暂停:游戏暂停(蛇停止运动);
开始和暂停选项互斥;
在选项一栏里可以调整游戏选项(蛇的运动间隔,有0.9秒,0.6秒,0.3秒)蛇身体有3个颜色可选
这里当点击 新游戏 后可以通过点击 难度 来调整游戏,当点击开始后,该 难度选项为不可用状态(无论暂停还是开始),只有再次 新游戏 后才能再次可用,这里避免了扫雷游戏中途调整游戏难度导致游戏问题
撞墙或吃到自己游戏判负
游戏胜利的条件是吃满10个食物
其实这蛇在装到强或吃到自己是都会发生一些形状上的变化
,但由于此时游戏判断结束,所以我用图片掩盖这些
其实2个图片游戏启动时就已经位于场景中,但位于QgraphicsView之外,这里通过信号与槽把图片移动坐标(到view)内,新建游戏时在把他们移到view之外
这里是蛇围绕这食物
这2个图说明碰撞判断符合要求(其实这里蛇环绕食物的碰撞有些问题,所以我使用了坐标碰撞而不是QGraphicsItem的碰撞函数
)