C++圖形介面之貪吃蛇小遊戲實驗報告
前言:
工具:VS2017, 需要下載圖形介面庫Easyx並將它安裝在vs的目錄下。附上鍊接:
一.實驗過程
(1)專案功能
貪吃蛇是一款簡單益智類的大眾小遊戲,自從誕生以來,深受廣大玩家喜愛。此次設計傳統的貪吃蛇小遊戲,利用鍵盤的方向鍵控制蛇的移動,實現簡單的貪吃蛇基本功能。我們將應用所學的理論知識解決一些複雜的工程問題。
(2)專案可行性分析
貪吃蛇的演算法中包括幾個重要的部分,例如:如何實現蛇的移動,蛇如何吃掉食物後實現自增,如何隨機建立食物以及蛇和食物的繪製。
首先,建立座標系如下圖,蛇在接受到方向鍵的輸入並且產生移動時,從蛇頭開始移,將前一節蛇座標賦值給後一節蛇的座標,實現蛇座標的傳遞。注意,蛇自身移動不能向當前方向相反的方向移動。
其次,隨機出現食物應採用rand()函式來實現,當蛇頭座標與食物座標相同時,蛇就會吃掉食物,食物繼續產生,蛇節數加1。
接著,如何保證蛇和食物的軌跡在同一條直線上,才能使得蛇順利吃到食物,並且食物不會產生到蛇的身上。
最後,當蛇頭碰到蛇身或者牆壁時,遊戲結束。整個過程,模組與模組間的關係如何呼叫,如何安排是實現整個程式的關鍵之處。

(3)類:
class Shake {
public:
Shake();
void ShakeMove(Shake _shake); //控制蛇的移動
void DrawShake(Shake _shake);//繪製蛇
void Change_shake(Shake _shake);//改變蛇的方向
int getn() { return n; }
int getcoorx(int i) { return coor[i].x;}
int getcoory(int t) { return coor[t].y; }
int Gameover(); //遊戲結束的條件
int setn(Shake _shake) {
_shake.n++;
return _shake.n;
}
private:
int n;
struct Coor coor[N];//100個座標
direction dire;//方向
};
二.程式設計
(1)專案需求
使用面向物件程式設計思想編寫開發過程中需要用到的類,在圖形介面視窗中,繪製蛇和食物,實現蛇的移動,食物的建立,蛇吃食物,以及蛇節數的增加等基本功能。
(2)需求分析
(1)初始化遊戲介面視窗:使用“graphics.h”圖形介面庫中initgraph函式初始化一個650*450大小的圖形介面視窗,初始化蛇身的大小和蛇開始的方向和座標,程式碼如下:
Shake::Shake() {
initgraph(650, 450);
n = 3;
dire = _Right;
coor[0].x = 90;
coor[0].y = 90;
coor[1].x = 80;
coor[1].y = 90;
coor[2].x = 70;
coor[2].y = 90;
}
(2)遊戲結束:當蛇吃到自己或撞到牆,即蛇頭座標與蛇身座標相等或蛇頭座標小於0或者大於視窗長度,遊戲結束;

(3)蛇的繪製:初始化蛇的節數為3,蛇開始的方向為右,將蛇置於平面直角座標系中,原點置於左上角,y軸向下為正方向,x軸向右為正方向,觀察蛇的位置移動;
(4)食物的產生:當蛇吃掉食物後,隨機產生食物,注意食物不能產生在蛇身上;
(5)蛇吃食物:蛇頭座標與食物座標相同時,即可吃掉。
3.概要設計
(1)建立食物類和蛇類,用一個小矩形塊繪製蛇的一節身體,身體每長一節,增加一個矩形塊。將蛇的初始化,蛇的移動,改變蛇方向等作為蛇類的成員函式。繪製食物,創造食物,吃掉食物作為食物類的成員函式功能;
(2)通過無參的建構函式初始化資料,包括介面寬度,蛇的寬度等,控制蛇的最大節數為100;
(3)定義一個標誌位iseat,判斷食物是否被吃,iseat=true,則食物被吃,需重新產生食物;
(4)利用結構體表示蛇和食物的x,y座標,列舉型別表示出上下左右四個方向;
(5)利用rectangle函式繪製蛇和食物。控制蛇和食物在一條直線上,食物座標範圍:
0<x<640;0<y<440,保證蛇頭能夠吃到食物;
(6)遊戲結束:使用outtextxy()函式在螢幕上輸出一個“Game Over”,設定在介面上展示的文字,大小,字型格式,字型顏色;
(7)main函式實現:_kbhit()函式檢測鍵盤方向鍵的輸入,如果有輸入,則返回真,蛇改變方向。首先設定while(1)迴圈來使蛇不停地進行相同的操作,實現蛇移動。在迴圈內部中,安排各模組的先後順序,在蛇吃食物後,判斷是否遊戲結束。
int main(){
int ch;
Shake shake;
Food _food;
while (1){
_food.Creatfood();
shake.ShakeMove();
shake.DrawShake();
_food.drawfood();
_food.Eatfood();
if (shake.Gameover()) {
settextcolor(LIGHTBLUE);
settextstyle(50, 0, L"宋體");
outtextxy(230,120, L"Game Over.");
Sleep(2000);
break;
}
Sleep(100);
if (_kbhit()) {
shake.Change_shake();
}
}
return 0;
}
4.除錯分析
(1)C++11新特性中:列舉 命名衝突

將left和right變成_left和_right.
(2)c++中kbhit()函式必須變成_kbhit()才能進行使用。
5.使用說明
使用者使用方向鍵“↑”、“↓”、“←”和“→”控制蛇的移動,蛇頭觸碰到自己或牆壁,則遊戲結束,使用者重新進入。
6.實驗心得與體會
在程式設計中,發現我們目前的能力有限,還有很多需要學習的內容,程式設計能力還有待提高。此次,下載了圖形介面庫Easyx並將它安裝在vs的目錄下,是放棄devc++的主要原因,我第一次對圖形介面有了初步的瞭解,並學會使用graphics.h標頭檔案,收穫不少。這次程式設計讓我實際運用所學知識去解決問題,讓我學到了許多程式設計知識,我發現僅僅運用課上所學無法實現現實問題,實際執行結果與預想不一致,時常會出現問題,很考驗自身的邏輯與耐心。在程式設計中我學到了許多,也學會了許多的除錯程式的方法,我也遇到許多困難,例如:蛇的頭部與食物的檢測問題,蛇的移動與顯示問題,蛇的轉向問題,食物的隨機生成問題,蛇吃不到食物問題等等。通過在網上搜集資料與自己的分析,終於從0到有,搭建了屬於自己的程式模組,雖然最後程式未能圓滿實現,但是大致的雛形已經構建完畢。通過練習,使我對程式設計產生了強烈的興趣,也是我明白了萬事開頭難,只要開始,就可以完成許多看似不可能的事。
C和C++語言本身區別很大,C重在指標,C++重在封裝,繼承,多型。前者是面向結構化程式語言,後者是面向物件程式語言。但是目前我們所編寫的C++程式還是比較偏C語言化風格,對C++的核心思想的理解,還略顯不足。如果想要在c++語言上有更進一步的發展,還需掌握好c++基礎知識,熟練使用類與物件,實現資料的封裝。
完整程式碼:關注+收藏+私信哦!
