【感谢原始作者DevBean,本文针对初学者及可玩性,在原文基础上做了修改。】
初始步骤
在初步了解了Graphic View Framework以及前面的画笔,画刷等基础内容后,我们就可以编写贪吃蛇了。
首先,我们还是先建立一个工程,命名为GreedySnake(或者起一个自己喜欢的名字)。建立一个QWidgetApp,系统将会生成main和mainwindow两个类,自动创建了1个头文件以及2个源文件。
下面我们开始编辑头文件:mainwindow.h。
创建几个类
我们考虑整个设计的思路和方案:
1)绘制场景:因为贪吃蛇是要在地图里跑的,所以首先要绘制地图。
2)绘制蛇:这个是必须的。
3)绘制苹果:蛇要吃苹果,所以要在画布里放苹果,蛇头碰到苹果就算是吃了。当然,我们也可以给苹果设置属性,比如毒苹果,蛇吃了就挂了那种的。
4)控制系统:这个也是整个贪吃蛇中比较重要的部分,因为贪吃蛇在用户按上下左右时要有反应,在每间隔一秒蛇还要前进一格;碰到苹果或障碍也得有相应的处理函数等等。
那么场景,蛇,苹果这三个东西,我们就可以创建3个类。点击下图中的Add New,然后点C++ class就可以创建一个新类,并自动生成它的头文件和源文件。
首先我们创建一个snake类,并为他添加以下几个变量和函数(在这里为了方便我全做成public的了,实际上部分变量写为private才安全)。
enum DIRS
{
UP,DOWN,LEFT,RIGHT,U_L,UR,D_L,D_R
};
class Snake : public QObject
{
Q_OBJECT
public:
explicit Snake(QObject *parent = nullptr);
int length; //Define the length of snake
QPoint *body; //Create Body in Stack, for the length of snake is not a concrete number
bool Poisioned;
enum DIRS snake_Dir;
//...
// Functions
void SnakeGo();
signals:
public slots:
};
在这里,我们就创建了一条“蛇”,我们定义了它的长度,身体的每一个块(用point来做的),方向等,然后其实还可以加入一些功能,比如之前说的这个蛇是不是中毒了(如果放在其他方面,比如交通控制,我们就可以换成“这辆车是不是坏了...”)
在这个基础上还可以加入一些功能性函数,比如让蛇前进的函数"SnakeGo"。
创建完了蛇,我们就要创建苹果:
相同的方法,建立一个苹果类。(有些同学喜欢直接在苹果的头文件和源文件里边创建,实际上这是个不好的行为,尤其是当转行学Java的时候...)
苹果类比较简单,两个参数:位置和属性
class Apple : public QObject
{
Q_OBJECT
public:
explicit Apple(QObject *parent = nullptr);
QPoint pos; //Apple position
unsigned char chara; //characteristics, poision apple,or red apple ,or sweet apple...
signals:
public slots:
};
接下来是场景:因为Qt在我们开始的时候已经为我们创建了QMainWindow,所以我们直接在这里做Scene和View就可以(不懂得可以参考上一节内容)。
class QGraphicsScene;
class QGraphicsView;
class GameController;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void initScene();
void initSceneBackground();
void detectHit(Snake snake); //check whether snake hits an object,wen can also arrange it in Gamecontroller
void execSnake(Snake snake); //change snake length, or kill it,wen can also arrange it in Gamecontroller
QGraphicsScene *scene;
QGraphicsView *view;
GameController *game;
private slots:
void adjustViewSize();
};
在这里我们创建了scene和view,并且创建了一个gamepanel(可选方案)。在这里我们还添加了检测蛇撞到障碍,以及改变蛇长度的申明等。
到了这里,这个程序的框架就搭建完了,接下来就是要在每一个源文件里实现各部分的函数了。