貪吃蛇實習報告

來源:文萃谷 2.03W

一.功能説明

貪吃蛇實習報告

1.1總體功能説明

概況: 一條蛇在密閉的圍牆內,在圍牆內出現食物,通過按鍵控制蛇向上下左右四個方向移動,蛇撞到食物,則食物被吃掉,蛇的身體增加一節。如果蛇在移動的過程中,撞到牆壁或身體的交叉(蛇頭撞到自己的身體),則遊戲結束。

特色:①暫停功能:能隨時通過按鍵來暫停遊戲,再按一次則繼續遊戲。

②速度調節功能:當分數達到某個值後,對蛇的移動速度進行一定的提升。 ③毒果:增加另一種的毒果食物,蛇吃到該種食物後gameover。

④音效功能:吃掉食物、撞牆、在遊戲結束時有不同的音效。

1.2用户界面

主要是在圍牆可以控制蛇吃到果實,同時分數就會升一分。側邊欄標出了主要的功能鍵和等級,積分。

1.3使用方法

上下左右鍵控制蛇的運動,還有任意鍵控制遊戲開始,空格鍵控制暫停,當遊戲的得分超過一定數,蛇的速度就會加快,

二.程序設計説明2.1 總體設計框架

2.2 關鍵算法描述

算法一:

自定義函數:

void movesnake(HANDLE hOutput,int snakex[],int snakey[],int len,WORD wColors[]); 移動蛇的函數,參數主要是蛇的座標

void fruit(HANDLE hOutput,int snakex[],int snakey[],int *x ,int *y,WORD wColors[]); 產生水果的函數,參數主要是蛇的座標,和水果的座標。使用了數組和指針

void p_fruit(HANDLE hOutput,int snakex[],int snakey[],int *x ,int *y,WORD wColors[]); void put_fruit(int *x,int *y,int len,int snakex[],int snakey[]);

放置果實的.函數

int level(HANDLE handle,int s,int p,char buf[],WORD wColors[]);

等級判斷函數,傳遞了一個存放分數的數組,速度,分數參數

算法二:

系統函數

textout(HANDLE handle,int x,int y,WORD Wcolors[],” “)

專門用來輸出一些字符,圖案,主要參數就是字符的橫縱座標

_kbhit()

檢測是否有按鍵按下

_getch()

獲取按鍵的值

Sleep(n)

是程序休眠n毫秒

srand( (unsigned)time( NULL ));

隨機數的種子函數,以時間做參數

rand()

產生偽隨機數序列,後面一般會跟%n,代表取0到n的整數。

2.3 程序設計的難點和關鍵點

⑴ 蛇的圖形的輸出及蛇的移動方向。蛇頭要用一個二維數組表示,身體要隨蛇頭一起運動。移動時必須從蛇頭開始,所以蛇不能向相反的方向移動,而且轉彎的時候會出現斷裂。

⑵ 檢測蛇有無撞到食物、圍牆或是自己的身體。當蛇開始移動之後,需要判斷蛇頭情況,然後根據位置是空白、食物、圍牆還是蛇的身體來做出相應的反應。可以用一個二維數組來表示整個場景,對不同的地方賦予不同的值。

⑶ 果實的隨機產生。當食物被吃掉後,要重新隨機產生。利用隨機函數rand產生隨機數並將該隨機數佈置到符合場景大小的範圍中來,而且不能和蛇身重疊了,所以要判斷蛇身後在出現果實,以此作為食物位置的橫縱座標。

2.4 調試的方法

問題一: 蛇頭吃到果實的表示,起初簡單認為只要果實和蛇頭初始座標重合,就代表吃到了果實,可是忽略了任何圖形和文字在c++中橫座標都佔兩格,也就是果實和蛇頭都有兩個橫座標,但蛇頭從果實的邊緣擦過,他也會吃了果實,但是座標沒有重合,下一個果實也就不會出現,然後我就想到把它們的座標都變成偶數就可以實現了重合。

問題二:當撞到牆或者自己之後,蛇不會停下,而是繼續往前走,然後我就用了一個停止函數getch()。

問題三:果實出現的時候,不能和蛇身重合,所以需要從蛇頭一節一節的判斷之後,才可以出現果實。

2.5 程序性能評價

從運行效果來看,優點主要是蛇運動順暢,屏幕初始化美觀,不足是蛇的長度,屏幕的長寬度有限,只能玩幾關就不可以玩了。

從程序設計上來説,優點主要有簡潔,明瞭,音樂的設置,速度升級,毒果的設置難度,各種文字移動和色彩的閃耀,不足是沒有獎勵機制,沒有更多的功能。

三.心得體會

剛開始時,一直失敗,好多錯誤,其實就是些基本的錯誤,比如變量的定義,整型變量的範圍,結構體的運用,指針的定義,函數的調用等等,通過這些問題才發現自己學習的知識是那麼不牢固。再有就是些更深難度的函數,自己以前沒有學過,比如textout,getch(),rand()等等,都需要自己學習老師給的範例,而且我發現要是編寫一個稍大的程序,必須先畫一個流程圖,否則自己是不會知道怎麼下手的,而且一個大程序是需要漸進編寫的,邊寫邊改的,不可能一步就能考慮周全。

當時蛇出現並且能動時,我的心情激動無比,雖然裏面也借鑑了老師給的例子一部分,可是畢竟是自己自學,編出來的,所以沒有什麼是不能做的,起初想想都覺得自己是不可能編出那麼複雜的遊戲,可是當自己真的編出來的時候,才會相信自己是有能力的。

而且我們這次所學的函數,還有一些其它的小技巧,我想對以後的編程都會有幫助的。

熱門標籤