1. 程式人生 >實用技巧 >其它 >C++圖形介面之貪吃蛇小遊戲實驗報告

C++圖形介面之貪吃蛇小遊戲實驗報告


前言:

工具:VS2017, 需要下載圖形介面庫Easyx並將它安裝在vs的目錄下。附上鍊接:

https://easyx.cn/

一.實驗過程

(1)專案功能

貪吃蛇是一款簡單益智類的大眾小遊戲,自從誕生以來,深受廣大玩家喜愛。此次設計傳統的貪吃蛇小遊戲,利用鍵盤的方向鍵控制蛇的移動,實現簡單的貪吃蛇基本功能。我們將應用所學的理論知識解決一些複雜的工程問題。

(2)專案可行性分析

貪吃蛇的演算法中包括幾個重要的部分,例如:如何實現蛇的移動,蛇如何吃掉食物後實現自增,如何隨機建立食物以及蛇和食物的繪製。

首先,建立座標系如下圖,蛇在接受到方向鍵的輸入並且產生移動時,從蛇頭開始移,將前一節蛇座標賦值給後一節蛇的座標,實現蛇座標的傳遞。注意,蛇自身移動不能向當前方向相反的方向移動。

其次,隨機出現食物應採用rand()函式來實現,當蛇頭座標與食物座標相同時,蛇就會吃掉食物,食物繼續產生,蛇節數加1。

接著,如何保證蛇和食物的軌跡在同一條直線上,才能使得蛇順利吃到食物,並且食物不會產生到蛇的身上。

最後,當蛇頭碰到蛇身或者牆壁時,遊戲結束。整個過程,模組與模組間的關係如何呼叫,如何安排是實現整個程式的關鍵之處。

C++圖形介面之貪吃蛇小遊戲實驗報告

(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或者大於視窗長度,遊戲結束;

C++圖形介面之貪吃蛇小遊戲實驗報告

(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新特性中:列舉 命名衝突

C++圖形介面之貪吃蛇小遊戲實驗報告

將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++基礎知識,熟練使用類與物件,實現資料的封裝。

完整程式碼:關注+收藏+私信哦!