Qt图形简单绘制(4)-贪吃蛇小游戏(2)

【感谢原始作者DevBean,本文针对初学者及可玩性,在原文基础上做了修改。】

初始步骤

在初步了解了Graphic View Framework以及前面的画笔,画刷等基础内容后,我们就可以编写贪吃蛇了。

首先,我们还是先建立一个工程,命名为GreedySnake(或者起一个自己喜欢的名字)。建立一个QWidgetApp,系统将会生成main和mainwindow两个类,自动创建了1个头文件以及2个源文件。

下面我们开始编辑头文件:mainwindow.h。

创建几个类

我们考虑整个设计的思路和方案:

1)绘制场景:因为贪吃蛇是要在地图里跑的,所以首先要绘制地图。

2)绘制蛇:这个是必须的。

3)绘制苹果:蛇要吃苹果,所以要在画布里放苹果,蛇头碰到苹果就算是吃了。当然,我们也可以给苹果设置属性,比如毒苹果,蛇吃了就挂了那种的。

4)控制系统:这个也是整个贪吃蛇中比较重要的部分,因为贪吃蛇在用户按上下左右时要有反应,在每间隔一秒蛇还要前进一格;碰到苹果或障碍也得有相应的处理函数等等。

那么场景,蛇,苹果这三个东西,我们就可以创建3个类。点击下图中的Add New,然后点C++ class就可以创建一个新类,并自动生成它的头文件和源文件。

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(可选方案)。在这里我们还添加了检测蛇撞到障碍,以及改变蛇长度的申明等。

 

到了这里,这个程序的框架就搭建完了,接下来就是要在每一个源文件里实现各部分的函数了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值