贪吃蛇游戏所需实现的功能如下:
- 资源文件的使用
- 父子窗口的协调出现,父窗口的背景覆盖
- 蛇头和食物初次出现的随机数
- 按键函数的使用
- 绘图事件的使用
- 按钮组的使用
- 同一个按钮点击连接不同槽
-
游戏所需要的注意的事项: 开始游戏后
当点击开始游戏后,用户处于游戏状态,程序随机选择一个空白网格生成一个果实。此后,按任意方向键,贪吃蛇将向对应方向移动,并开始计时,移动速度由程序自行确定。要求游戏过程中,实时显示时间,即贪吃蛇头部移动的格子数。贪吃蛇吃到果实后,在接下来的3步中,头部延长3个格子,与此同时尾部保持不变。点击暂停游戏后,游戏处于暂停状态,贪吃蛇的移动停止,游戏时间停止。 游戏暂停时当处于暂停状态时,点击保存游戏,可以保存当前格局。由用户指定保存文件的名称与位置。文件格式自行设计,需包含贪吃蛇的状态,贪吃蛇的移动方向,障碍和果实位置,以及当前时间。
点击继续游戏后,贪吃蛇恢复移动,恢复计时,进入游戏状态 。 游戏失败后满足失败条件时,游戏进入终止状态,提示游戏失败,游戏计时停止,贪吃蛇无法移动。失败条件:贪吃蛇碰到周围边界贪吃蛇碰到障碍贪吃蛇碰到自己的身体 未开始状态时当游戏处于未开始状态时,点击载入游戏,可以选择文件,载入一个已保存的格局,此时游戏进入暂停状态。暂停或终止状态时当处于暂停状态或终止状态时,点击重新开始,用户变为未开始状态,计时清零,格局恢复
-
1.根据构造函数传入的参数,来设定游戏地图横向纵向元素个数、游戏难度、以及地图元素大小;
-
2.加载所有图片资源,后面的绘制地图需要;
-
3.以当前时间为种子来为后面制造随机数作准备;
-
4.确定游戏界面大小;
-
5.地图数字数组申请内存;
-
6.地图元素绘制数组申请内存;
-
7.准备一个定时器,用于后面游戏每步进行的时间间隔;
-
8.布局;
-
9.创建地图并绘制;
-
10.不要忘记了添加食物、游戏操作(蛇头不能往后移动)、以及统计分数;
-
11.开启定时器;
-
widget.h":
-
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
namespace Ui {
class Widget;
}class Widget : public QWidget
{
Q_OBJECTpublic:
explicit Widget(QWidget *parent = nullptr);
QList<QRectF> rec;//创建一个保存矩形块儿的链表
void paintEvent(QPaintEvent *event);//要重写画图事件函数
~Widget();private:
Ui::Widget *ui;
};#endif // WIDGET_H
-
widget.cpp:
-
#include "widget.h"
#include "ui_widget.h"
#include<QList>
#include<QRectF>
#include<QPoint>
#include<QPainter>
#include<QPen>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
rec.append(QRectF(QPoint(50,50),QPoint(250,250)));
rec.append(QRectF(QPoint(100,100),QPoint(200,200)));
rec.append(QRectF(QPoint(120,120),QPoint(150,150)));//尾插
rec.insert(0,QRectF(QPoint(0,0),QPoint(300,300)));//在0号位置插入一个矩形}
void Widget::paintEvent(QPaintEvent *event){
QPainter painter;
painter.begin(this);
QPen pen(Qt::red);
pen.setWidth(10);
painter.setPen(pen);
for(int i=0;i<rec.length();i++){
painter.drawRect(rec.at(i));
}//可以用at直接访问链表的元素
}
Widget::~Widget()
{
delete ui;
}