C++貪吃蛇
阿新 • • 發佈:2019-02-09
前言
做完俄羅斯方塊後,突然不知道幹嘛。索性一鼓作氣,把貪吃蛇也擼出來。
簡介
貪吃蛇,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變數來實現對按鍵頻率的控制,即:
蛇體的每次移動,只能轉向一次。
這樣就可以避免出現上述的問題。
感觸
寫完俄羅斯後,幾個小時就完成了貪吃蛇,在理解的基礎上,唯手熟耳。要堅持!