1. 程式人生 > >C++貪吃蛇

C++貪吃蛇

前言

做完俄羅斯方塊後,突然不知道幹嘛。索性一鼓作氣,把貪吃蛇也擼出來。

簡介

貪吃蛇,c++,qt。
基本的貪吃蛇功能,沒什麼特殊的。蛇的速度與蛇的長度成正比。同時實現了記分以及暫停的功能。

效果圖

遊戲過程效果圖

這裡寫圖片描述

實現思路

相比俄羅斯方塊,實貪吃蛇的實現容易了許多,主要就是一個蛇的移動問題。
想到蛇的曲折的行進路徑,正常第一反應就是去想把那麼轉向的位置紀錄下來。
但仔細想想完全不用這樣。
用一個數據記錄蛇身每個節點的座標。那麼每次蛇移動,都是當前節點移動到上一個節點的位置。
這樣以來,我們只需要控制蛇頭去轉向即可。蛇身自然會跟隨蛇頭的路徑去前進。

程式碼構成

全部程式碼仍然是三個類

1. Snake 蛇資訊及操作

class Snake
{
public:
    int len;//蛇的長度
    int s[10000][2];//儲存蛇身
    int dx, dy;//蛇當前方向
    Board *board;

    Snake(Board *);
    void eat();//吃食
    int detect();//碰撞檢測
    void toNext();//前往當前方向下一步
    void turnUp();//蛇轉向
    void turnDown();
    void turnLeft();
    void
turnRight(); };

2. Board 遊戲地圖資訊

class Board
{
public:
    int score;//當前分數
    int maxScore;//最高分
    int atime;//每次下落的間隔時間
    int length;//地圖邊長
    int foodX;//食物所在座標
    int foodY;
    Snake *snake;//蛇
    int map[100][100];//儲存地圖資訊

    Board(int);
    void makeFood();//隨機生成食物
    bool isEnd();//進行蛇的前進,並判斷前進後是否遊戲結束
};

3. mainWindow 遊戲介面部分

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    bool flag;//判斷是否暫停狀態
    bool isPress;//控制按鍵頻率
    QTimer *timer;//定時器
    Board *board;//遊戲所用地圖類

    MainWindow(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);//繪製介面
    void keyPressEvent(QKeyEvent *);//鍵盤事件處理

signals:

public slots:
    void timerEvent();//定時事件

private:
};

遇到的問題及解決方法

和俄羅斯方塊的一個小區別是,俄羅斯方塊每次完成一個小塊的操作後,會產生一個新的小塊,進行新的操作。
而貪吃蛇不同,蛇一直都在動,並且從遊戲開始到結束都只有這一條蛇。
所以這裡必須要保證每次移動一個單位長度,都必須只能前進一次。
因為玩家按鍵的速度遠超過計算機的timeout。所以會出現介面上蛇身還沒轉向,但邏輯上方向已經發生了變化。
因此,使用一個isPress變數來實現對按鍵頻率的控制,即:
蛇體的每次移動,只能轉向一次。
這樣就可以避免出現上述的問題。

感觸

寫完俄羅斯後,幾個小時就完成了貪吃蛇,在理解的基礎上,唯手熟耳。要堅持!

完整程式碼