C 基於EasyX製作貪吃蛇遊戲(三)第二版文件

2022-07-02 11:24:08 字數 2637 閱讀 9129

本文首發於我的個人部落格www.colourso.top,歡迎來訪。

填補一下原來留下來的坑,上接 c++基於easyx製作貪吃蛇遊戲(一)文件 繼續更新製作貪吃蛇遊戲的一些相關設計。

遊戲介面分為四個區域:

整個程式是基於easyx圖形庫進行製作的,所以介面的全部內容都是呼叫相關函式繪製上去的。

提到繪製,最初的想法就是在整個程式執行的大迴圈之中,每次迴圈開始之時重新繪製整個介面的內容,這就需要儲存蛇的節點以及食物、還有其他三個區域的資訊,每次重新進行繪製。

但是這樣感覺效率可能會是問題,所以在設計之初,就採用了區域性繪製擦除的方式。

例如蛇身體的繪製就是採用的區域性繪製:

正常情況下蛇前進一格,就是蛇頭向某個方向行走一格,然後蛇頭後的其他節點都是依次複製前乙個節點的位置,然後最後乙個節點空餘出來。這時候只需要單獨繪製乙個蛇的頭部節點,然後擦除掉蛇的尾部節點走過的地方即可。

當然當資料展示區以及遊戲狀態區的內容需要更新的時候也是採用擦除然後區域性繪製的方式。

當然這樣會有一些不妥,如果你想把背景設定為一張,這種做法就會失效,當想在上繪製內容或者修改內容時,整個顯示介面都需要重新進行繪製。

第一版程式之中沒有區分蛇頭與蛇身,無論時觀察還是遊玩都有些不太明顯。

因為蛇是乙個鍊錶的資料結構,蛇頭就是鍊錶的頭節點。只需要額外對頭節點繪製特殊的圖形,然後擦除掉原先頭節點即可。

//在蛇頭部節點的資料更新之後

drawsnakehead(*(snake.head));//畫新的頭部

drawsnakenode(*(snake.head->next));//將原來的頭部變成身體的顏色

所謂的控制蛇的速度,也就是控制蛇每次前進一格的速度,簡單點就是控制每個迴圈中最終sleep()的時間。

延遲等待時間越長、蛇的速度也就越慢。

#define max_speed 5		//最大速度

#define min_speed 29 //最小速度

#define org_speed 18 //原始速度

int g_speed = org_speed; //控制速度,全域性變數

這裡定義三個巨集,對應允許的最大速度、最小速度和原始速度。

然後定義乙個全部變數g_speed來儲存速度。

這裡的速度對應的slepp()延遲是1:10的關係,即sleep(g_speed*10)

在設定中c鍵加速,x鍵減速,z鍵恢復原始速度。

就在**中的按鍵監聽部分加上相應的**。

bool speedchange = false;

if (_kbhit())

break;

case 120: //x 減速

if (g_speed < min_speed)

break;

case 122: //z 回歸原速

g_speed = org_speed;

speedchange = true;

break;}}

如果速度改變了,那就將speedchange置為true,便於之後在資料顯示區進行是否重新整理的判斷。

定義蛇的速度等級不能簡單粗暴的從5到29,不直觀。直接採用30 - g_speed這樣的方式,得到的結果就是1到25級,初始預設是12級,等級越低速度越慢,玩家可以自行調節速度等級。

剛開始想這個問題的時候頭疼了一下,如何讓乙個死迴圈停止執行呢,答案是進入另乙個死迴圈就行了。

設定的是空格鍵暫停與繼續,在按鍵監聽那裡加入空格鍵32。當按了空格鍵之後就直接進入了另乙個迴圈,整個介面遊戲迴圈就暫時停滯了。

在另乙個迴圈中一直處於按鍵監聽等待空格鍵的再次按下,break迴圈,從而回到原來的大迴圈中,繼續執行,這樣就達到了暫停的效果。

case 32:         //空格暫停

drawpause(); //狀態區顯示

while (true)}}

break;

當然要在對應的遊戲狀態區給出提示,讓人知道這個遊戲是暫停了,而非卡死了。

當失敗的時候,可以選擇重新開始遊戲或者是退出遊戲。

如何重新開始乙個遊戲呢?我的思路是將整個遊戲的玩耍過程封裝成乙個函式,當我們最後遊戲結束的時候,呼叫這個函式就能夠重新開始了。

那麼以為著要改動一下原來第一版的函式結構了。

當遊戲結束的時候會給出提示r鍵重新開始、q鍵退出遊戲,這一部分也是按鍵檢測和控制的,參照上面的按鍵檢測**也是很容易寫出來的。

關於資料展示以及遊戲狀態展示這一部分的**就不詳細介紹了,比較簡單。

還有問題就是在中文輸入法下按鍵會優先彈出輸入法的框,需要手動將輸入法切換為英文。

大致這樣吧,後續再更新**。

美化貪吃蛇(EasyX)

上次不是寫了個貪吃蛇麼,我覺得不夠好看 學了學easyx,決定給他美化一下並重構了函式 大致思路就是先畫線格,然後決定地圖的大小,這就是蛇的運動路線 然後拐彎什麼的通過列舉方向處理蛇頭就行,增長長度就是給蛇新增數量就行,我這裡就是把蛇處理成結構體 其他思路也就是大致一樣的,具體看 咯,撞牆就是看它蛇...

小遊戲 C 手工製作貪吃蛇

include 鍵盤敲擊 include 螢幕渲染週期,clock函式 include include 重新整理周期,控制遊戲速度 define period 100 地圖寬度 define width 25 地圖高度 define height 18 點 結構 typedef struct poi...

貪吃蛇遊戲

貪吃蛇遊戲 結構化程式設計 c語言程式設計 重要的的是結構化的程式設計思想 include include include include include include define field width 300 就做20個格仔的 define field height 300 define f...