【感謝原始作者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(可選方案)。在這裏我們還添加了檢測蛇撞到障礙,以及改變蛇長度的申明等。到了這裏,這個程序的框架就搭建完了,接下來就是要在每一個源文件裏實現各部分的函數了。