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(可選方案)。在這裏我們還添加了檢測蛇撞到障礙,以及改變蛇長度的申明等。

到了這裏,這個程序的框架就搭建完了,接下來就是要在每一個源文件裏實現各部分的函數了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章