1. 程式人生 > >【新手入門】SDL+C語言編寫俄羅斯方塊小遊戲小經歷

【新手入門】SDL+C語言編寫俄羅斯方塊小遊戲小經歷

基礎太差,現在重新學習了一遍C語言。因為訓練要求,要學習SDL庫的使用,編寫個SDL+俄羅斯方塊小遊戲。轉眼一週多,小白終於寫出來了。以下是一些體會。感覺還是好好學習,多擼程式碼才是正道。

一、遊戲規則

1.開啟遊戲,遊戲開始,方塊自由下落。

2.當按下左鍵,方塊對環境進行判斷,條件應許即進行左移;

3.按下右鍵,方塊對環境進行判斷,條件應許即進行左移;

4.按下下鍵,方塊對環境判斷,條件應許即加速下落;

4.滿行消行+計分規則:當遊戲區域矩陣中一行全有方塊時,此行之上方塊集體下移一個位置;且得分+20分。

5.遊戲失敗,當遊戲中每行都有方塊存在達到第18行(以上為方塊禁止區)時,遊戲失敗;

6.遊戲通關:但累計分數達到200分時,遊戲通關。

7.遊戲暫停/繼續:當按下UP鍵時,遊戲暫停,再次按下UP鍵時,遊戲繼續。

8.遊戲短時暫停:當滑鼠放在開關區域時,每次暫停3+3秒。

9.方塊變形:當按下SPACE鍵時,方塊對周邊環境進行判斷,條件應許即進行變形。

二、已實現遊戲功能

1. 遊戲規則功能:左移、右移、加速下降、短時暫停、暫停/繼續、計分、滿行消行;

2.背景音樂:全程背景音樂、滿行消行音樂、方塊到底音樂、遊戲成功音樂、遊戲失敗音樂。(利用SDL_mixer.h)

3.計分動態顯示;(利用字型庫SDL_ttf.h)

4.圖片顯示:各背景圖片、遊戲成功顯示圖片、遊戲失敗顯示圖片(利用SDL_image.h)

5.效果如如下:

圖1:遊戲中

圖2.遊戲成功


圖3. 遊戲失敗

三、遇到的主要問題及解決辦法:

1. 得分動態顯示模組:

利用ttf字型檔案(font1.ttf),這個字型檔案在ttf的庫中是沒有的,得另外下載、程式碼應用;顯示得分,需先將整型資料儲存到陣列中(利用sprintf()函式)再輸出即可。

2. 小遊戲中聲音播放多種聲音混亂不清問題(上週報告已說明)

原因:主要是Mix_Music、Mix_LoadMUS()和Mix_Chunk、Mix_LoadWAV()的問題、播放一種聲音用Mix_LoadMUS()即可,但是兩種聲音時可能會導致通道channel混亂問題導致聲音混亂;

解決:將背景音樂用Mix_LoadMUS()載入和用Mix_PlayMusic播放;  其他動態聲音用Mix_LoadWAV()載入和用Mix_PlayChannel播放,分開就好。

 

3.(主要/麻煩問題)變形函式設計的問題:變形衝突、不能變形也變形。可變形當不變形問題。

原因:7中方塊共19種方塊形態類似但位置不一樣,因而變形條件也不一樣。

思路:7大類方塊變形的檢測條件應不一樣,應分開進行、獨立檢測,然後再進行變形。

解決辦法:對7大類分塊獨立繪圖,分析變形前後方塊的位置條件關係,以此作為方塊變形條件進行位置判斷,再進行。如下圖:

注:此處方塊較多,位置分析較雜,可能存在記錄手誤,導致變形出現未知debug。

4.shapeshift()方塊變身函式實現執行時,不能實現連續變身,只變身一次就返回的問題。

原因:可能是方塊標號random的定義問題,random應為全域性變數,不為全域性變數時,內部函式沒有修改函式外的random,因為只變身一次就返回原狀。

解決:去掉random作為shapeshift()函式的接受引數,讓random以全域性變數的形式存在於每一處。

5.去除方塊下移軌跡的問題:

原因,方塊每次下落時圖片的重新整理,應去除方塊圖片的軌跡才能實現看起來下落的清晰效果。

思路:方塊每次下落即是一次重新整理,每次重新整理前應用原來的方塊形圖片去除正在下落的方塊形態後對重新整理後的方塊圖片進行重新整理。此處應與儲存方塊的思路連線起來。

解決辦法:每次重新整理前,用備份地圖對遊戲地圖進行重新整理,下落方塊再對地圖補充,以此實現。

6.(主要問題)每次一大塊方塊下落,在下落過程中、下落完成後、如此迴圈時:如何儲存已下落方塊、正在下落方塊等的問題。

原因:若沒有對地圖進行重新整理,可能出現連續方塊、方塊不能儲存、方塊重複、方塊丟失、計數錯誤等問題。

思路:應對地圖進行備份處理,設定兩份地圖,一份地圖專門用來儲存方塊,重新整理另一份地圖用;另一份用來結合正在下落的方塊表現在螢幕前。

思路來源:看了網上較多的經驗分享和看法,借鑑別人。

解決辦法:設定兩份地圖:儲存用的備份地圖和下落方塊的表現地圖。表現地圖每次出來前用儲存方塊的備份地圖進行重新整理。

7.(主要問題):儲存地圖問題:如何識別正在下落方塊、以下落停止的方塊、圍牆。

原因:方塊的性質不同,沒有對其進行區分可能會導致儲存和顯示問題。(開始設計遊戲區域時沒有將圍牆區域划進遊戲矩陣中,導致方塊儲存和移動監測一直找不到思路。)

思路:將圍牆划進遊戲區域中,方便左右移動方塊等檢測用。對方塊性質進行不同標記。

解決方法:對不同性質的方塊進行標記。遊戲中:賦值情況:圍牆=2;正在下落的方塊=30;已下落停止的方塊=31;每次顯示地圖時按Map[i][j]的值對其賦予相應的圖片。

8.左移、右移問題:主要是方塊周邊位置的判斷位置。

解決:利用方塊的行和列Row[]和List[]來檢測。

9.按鍵操作過快判斷不及時問題:

解決:對方塊下落條件加了延時,讓地圖的重新整理變快,方塊的下落變慢,從而有更多機會進行判斷。

 

ééé存在問題:可能存在較多還未知bug。