一、界面設計
此游戲的界面分為3種,即游戲前界面、游戲時界面和游戲後界面
1、游戲前界面:即在游戲開始之前為用戶呈現的界面,其中包括1張背景圖和3個按鈕,3個按鈕分別為“開始”、“設置”和“退出”。當選擇“開始”時,即進入游戲時界面並開始游戲;“設置”按鈕可以先不實現,以便以後擴展擴程序;當選擇“退出”時,即關閉程序。
2、游戲時界面:即在游戲進行時的界面,其實就一張背景圖就行了。不過我將整個界面分劃成3個邏輯區,游戲的圖案,游戲的分數等這些東西只需在游戲過程中往相對應的邏輯區畫或寫進去就行了。這3個邏輯區分別為:游戲區、信息區和預覽區。游戲區只有一個“容器”,積累俄羅斯方塊用的;信息區包括分數和關數兩個字段的顯示;而預覽區則向用戶提示下一個俄羅斯方塊的樣子。
3、游戲後界面:即在游戲結束時所彈出的界面,它並不占滿整個窗口,而只是窗口中間的一部分。它包括1張背景圖和2個按鈕,這兩個按鈕分別為“Y”和“N”,分別代表“繼續挑戰”和“結束游戲”。這裡也跟游戲時界面一樣分3個邏輯區:分數區,結果區和選擇區。分數區顯示最高分數和當前分數,結果區顯示“挑戰成功,恭喜你!”或“挑戰失敗,再接再厲!”,而選擇區即一個字段——“是否繼續挑戰?”和兩個按鈕。
二、流程圖設計
流程圖設計分為4階段:
1、初始化階段:初始化一些東西,如:SDL的初始化,一些數據結構以及變量的初始化等;
2、游戲前階段:對應於前面的游戲前界面,主要是背景圖的載入,以及對那三個按鍵的響應;
3、游戲時階段:整個游戲的核心部分,以下有三個比較重要的設計:
(1)在整個階段,我設立3個俄羅斯方塊結構體,一個為了在預覽區顯示用,稱之為“過去時方塊”,一個在容器中顯示用,稱之為“進行時方塊”,還有一個用於預先判斷用,即它是“進行時方塊”移動或換方向之後的狀態,程序使用它來判斷移動或換方向是否合法,但它是至始至終都不顯示的,其實就是為“進行時方塊”探路用的,稱之為“將來時方塊”。
(2)只有在“將來時方塊”探路表示合法時,方可將方塊移動或換方向,並刷新顯示之,但怎麼樣才算合法呢?如何去判斷它呢?這是整個程序最關鍵的一步。
方塊的下一步有下移(下鍵)、左移(左鍵)、右移(右鍵)、改變方向(上鍵)和自然下落(無按鍵)5種情況,這5種情況是互斥的,即同一時刻只能執行一種動作。
左移、右移時,只需要根據關鍵點以及數據倉1修改“將來時方塊”,並判斷“將來時方塊”所在位置是否完全空閒,是則探路成功返回0,否則返回1繼續運行程序。
下移、自然下落時,只需要根據關鍵點以及數據倉1修改“將來時方塊”,並判斷“將來時方塊”所在位置是否完全空閒,是則探路成功返回0,否則返回2。(方塊已放置好,下一個方塊繼續)
改變方向時,只需要根據關鍵點、數據倉1和數據倉2修改“將來時方塊”,並判斷“將來時方塊”所在位置是否完全空閒,是則探路成功返回0,否則返回1繼續運行程序。
凡是探路成功返回0的,都會將”進行時方塊“刷掉,然後”將來時方塊“變成”進行時方塊“,最後再將”進行時方塊“重新畫上去。
(3)俄羅斯方塊屬於視頻游戲,即在不需要用戶輸入時,畫面是一幀一幀的動畫,所以整個程序得同時響應方塊的移動和用戶的輸入。方塊移動之後總會停頓一會,然後再移動,如果在方塊停頓的那會,有一個用戶輸入,那得咋辦呢?因為停頓的那會是進程被掛起了,這時候來用戶輸入,程序根本不會響應它,所以只能使用進程掛起pause()和信號喚醒(設置計時器定時發送信號)這種方法來實現之,沒按鍵設置的計時器時間長點(計算機中的長點也是毫秒級的,嘻嘻!!),方塊會根據這”長點“的時間定時移動著,一旦有按鍵,就馬上修改計時器的時間短點(如果是0最好,可要是0就代表著把計時器關了,木有辦法),等計時器發送信號後從中斷處理函數中返回來後,再將計時器的調成原來長點的時間,就這樣循環執行著。
4、游戲後階段:對應於前面的游戲後界面,主要是背景圖的載入,信息的顯示,以及對那兩個按鍵的響應;