貪吃蛇實習報告
一.功能説明
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()等等,都需要自己學習老師給的範例,而且我發現要是編寫一個稍大的程序,必須先畫一個流程圖,否則自己是不會知道怎麼下手的,而且一個大程序是需要漸進編寫的,邊寫邊改的,不可能一步就能考慮周全。
當時蛇出現並且能動時,我的心情激動無比,雖然裏面也借鑑了老師給的例子一部分,可是畢竟是自己自學,編出來的,所以沒有什麼是不能做的,起初想想都覺得自己是不可能編出那麼複雜的遊戲,可是當自己真的編出來的時候,才會相信自己是有能力的。
而且我們這次所學的函數,還有一些其它的小技巧,我想對以後的編程都會有幫助的。