第09章-項目實戰(zhàn):俄羅斯方塊游戲自考成人??票究普n件_第1頁
第09章-項目實戰(zhàn):俄羅斯方塊游戲自考成人??票究普n件_第2頁
第09章-項目實戰(zhàn):俄羅斯方塊游戲自考成人??票究普n件_第3頁
第09章-項目實戰(zhàn):俄羅斯方塊游戲自考成人??票究普n件_第4頁
第09章-項目實戰(zhàn):俄羅斯方塊游戲自考成人??票究普n件_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第9章項目實戰(zhàn):俄羅斯方塊游戲項目概述案例實現(xiàn)項目概述案例實現(xiàn)?點擊查看本小節(jié)知識架構(gòu)?點擊查看本小節(jié)知識架構(gòu)9.29.1理解掌握掌握掌握學(xué)習(xí)目標(biāo)理解項目整體的框架1掌握Shell編程基本語法的應(yīng)用42掌握項目功能模塊的設(shè)計思想3掌握項目整體的代碼設(shè)計方法在本章之前,本書已經(jīng)詳細(xì)地介紹了Linux操作系統(tǒng)平臺上的各種應(yīng)用。如Shell編程、軟件管理、編程工具等。本章將通過一個完整的項目,幫助讀者回憶本書的重點內(nèi)容以及提升代碼處理能力。俄羅斯方塊作為一款經(jīng)典的益智類游戲,不僅可以用來休閑娛樂,而且可以提升玩家的思維敏捷性。截止到目前,該游戲已經(jīng)衍生出很多版本,在世界范圍內(nèi)廣受歡迎。因此,本章將以該游戲為參考原型,討論通過核心的Shell編程實現(xiàn)游戲中的各種功能需求。9.1

項目概述9.1.1開發(fā)背景返回目錄9.1.4正則表達式的概念9.1.3功能設(shè)計9.1.2需求分析軟件框架9.1.1開發(fā)背景在個人計算機與手機普及的今天,一些有趣的桌面游戲已經(jīng)成為人們在學(xué)習(xí)或工作之余休閑娛樂的首選。俄羅斯方塊作為一款風(fēng)靡世界的掌上游戲與PC機游戲深受人們喜愛,它由俄羅斯人阿列克謝?帕基特諾夫(AlexeyPazhitnov)于1986年6月發(fā)明。俄羅斯方塊原名是俄語Тетрис,這個名字來源于希臘語tetra,意思是“四”。而游戲的作者最喜歡網(wǎng)球(tennis),于是,他把tetra和tennis兩個詞合二為一,將游戲命名為Tetris,這就是俄羅斯方塊英文名字的由來。9.1項目概述9.1.1開發(fā)背景俄羅斯方塊的基本規(guī)則是移動、旋轉(zhuǎn)和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。而沒有被消除掉的方塊會不斷堆積,一旦堆積到屏幕頂端,則游戲結(jié)束。俄羅斯方塊上手極其簡單,但是要熟練掌握其中的操作與擺放技巧,需要玩家不斷地練習(xí)。由于俄羅斯方塊具有數(shù)學(xué)性、動態(tài)性等特點,且知名度高,所以其經(jīng)常被用來作為游戲程序開發(fā)的經(jīng)典案例。9.1項目概述9.1.2項目需求分析本次項目實戰(zhàn)選取Linux操作系統(tǒng)作為開發(fā)平臺,其開發(fā)使用的語言為Shell腳本語言。游戲界面通過系統(tǒng)的終端進行顯示,并保留早期俄羅斯方塊設(shè)計的基礎(chǔ)規(guī)則。圖所示為本項目實現(xiàn)的基礎(chǔ)游戲界面。9.1項目概述9.1.2項目需求分析通過基礎(chǔ)游戲界面玩家可隨時了解自己當(dāng)前的分?jǐn)?shù)與等級。每當(dāng)堆積的方塊被消除一行時,分?jǐn)?shù)加1;當(dāng)分?jǐn)?shù)累加到指定數(shù)值后,等級加1;等級越高則方塊下落的速度越快。當(dāng)某一個方塊從方框頂端下落時,方框外將顯示下一個降落方塊的形狀。在方塊下落過程中,玩家可以通過按鍵移動與旋轉(zhuǎn)方塊。按鍵說明如表所示。9.1項目概述9.1.2項目需求分析游戲中的方塊種類、方塊形狀、方塊顏色均隨機產(chǎn)生,其中方塊的基礎(chǔ)種類共有7種,如圖所示。9.1項目概述9.1.2項目需求分析圖中第1種類型的方塊只有1種形狀。使用平面直角坐標(biāo)系表示該形狀,如圖所示。9.1項目概述圖中第2種類型的方塊有2種形狀。使用平面直角坐標(biāo)系表示這2種形狀,如圖所示。9.1.2項目需求分析圖中第3種類型的方塊有2種形狀。使用平面直角坐標(biāo)系表示這2種形狀,如圖所示。9.1項目概述9.1.2項目需求分析圖中第4種類型的方塊有2種形狀。使用平面直角坐標(biāo)系表示這2種形狀,如圖所示。9.1項目概述9.1.2項目需求分析圖中第5種類型的方塊有4種形狀。使用平面直角坐標(biāo)系表示這4種形狀,如圖所示。9.1項目概述9.1.2項目需求分析圖中第6種類型的方塊有4種形狀。使用平面直角坐標(biāo)系表示這4種形狀,如圖所示。9.1項目概述9.1.2項目需求分析圖中第7種類型的方塊有4種形狀。使用平面直角坐標(biāo)系表示這4種形狀,如圖所示。9.1項目概述9.1.3功能設(shè)計根據(jù)9.1.2節(jié)中的項目需求分析可知,案例代碼需要實現(xiàn)以下6個主要的功能。(1)程序運行后,立刻顯示出游戲的界面(方框、分?jǐn)?shù)記錄等)。(2)隨機產(chǎn)生的方塊可以自動降落,每次降落1格(長度為1個字符)。(3)在隨機產(chǎn)生的方塊在降落過程中,玩家可以使用按鍵移動它或轉(zhuǎn)換它的形狀。(4)當(dāng)方框中的方塊在某一時刻形成完整的一行或多行時,這些方塊將會被消除,并計分。9.1項目概述9.1.3功能設(shè)計(5)當(dāng)隨機產(chǎn)生的方塊開始降落時,界面中會同時顯示下一輪降落的方塊形狀。(6)降落或移動中的方塊在被方框或其他方塊阻擋時,則不能降落或移動。上述功能描述中,需要注意的是,在一個程序中不可能同時實現(xiàn)方塊自動降落、按鍵控制方塊移動(或旋轉(zhuǎn))以及整行消除等功能。因此,可以考慮將該案例代碼設(shè)計為兩部分。9.1項目概述9.1.3功能設(shè)計如圖所示。9.1項目概述9.1.4軟件框架圖所示的兩部分內(nèi)容需要運行2個獨立的程序來實現(xiàn),程序1的主要工作為響應(yīng)玩家按鍵輸入,并根據(jù)玩家的按鍵輸入發(fā)送相應(yīng)的信號;而程序2的主要的工作為實現(xiàn)與玩家的界面互動,如顯示界面、方塊的動態(tài)操作等。9.1項目概述9.1.4軟件框架由圖所示的框架可知,程序1通過循環(huán)可持續(xù)判斷玩家的按鍵輸入,并根據(jù)具體的輸入按鍵發(fā)送相應(yīng)的信號給程序2,直到收到退出指示,則執(zhí)行退出。9.1項目概述1.程序1程序1的代碼設(shè)計框架如圖所示。9.1.4軟件框架9.1項目概述2.程序2程序2的代碼設(shè)計框架如圖所示。由圖所示的框架可知,程序2不僅可以響應(yīng)程序1的信號請求,還可以支持界面交互。9.1.4軟件框架9.1項目概述對上述程序中的各個功能模塊進行封裝,具體的封裝函數(shù)與功能說明如表所示。9.2

案例實現(xiàn)9.2.1核心技術(shù)介紹返回目錄9.2.4正則表達式的概念9.2.3代碼設(shè)計邏輯9.2.2案例代碼分析項目效果展示9.2.1核心技術(shù)介紹9.1節(jié)主要對項目的需求與軟件框架進行了分析。由此可知,案例代碼設(shè)計的核心為如何實現(xiàn)方塊的處理,包括形狀設(shè)定、界面顯示、信號處理等。因此,下面對這些處理進行詳細(xì)介紹。1.數(shù)組記錄坐標(biāo)9.1.2節(jié)主要討論了俄羅斯方塊的7種基礎(chǔ)形狀,并且采用直角坐標(biāo)系的方式轉(zhuǎn)換后的形狀進行記錄。因此,案例代碼需要使用數(shù)組來保存這些坐標(biāo)記錄,從而實現(xiàn)方塊形狀的區(qū)分。在Shell編程中,數(shù)組變量的賦值有兩種方法。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹方法1:9.2案例實現(xiàn)方法2:如例所示,使用方法1對數(shù)組進行賦值。9.2.1核心技術(shù)介紹例中,符號“@”與“*”表示所有元素,符號“#”則表示數(shù)組的元素個數(shù)。例的運行結(jié)果如下所示。9.2案例實現(xiàn)根據(jù)輸出結(jié)果可知,數(shù)組的元素為3個,分別為a、b、c。如例所示,使用方法2對數(shù)組進行賦值。9.2.1核心技術(shù)介紹例中,第4行代碼使用雙括號表示擴展,即括號中的表達式可以使用C語言程序的編寫方式。第6行代碼中,“${chars:$i:1}”表示從字符串中讀取子串,其語法格式如下所示。9.2案例實現(xiàn)上述語法格式表示在字符串string中,從位置position開始提取長度為length的子串。例中的length為1,表示提取一個字符。9.2.1核心技術(shù)介紹例的運行結(jié)果如下所示。9.2案例實現(xiàn)根據(jù)輸出結(jié)果可知,例的功能為執(zhí)行循環(huán),每次從字符串中讀取一個字符,并保存到數(shù)組中,然后輸出數(shù)組中的元素。9.2.1核心技術(shù)介紹例使用數(shù)組對不同種類的方塊在直角坐標(biāo)系中的坐標(biāo)進行記錄。按照從左到右、從下到上的方式依次記錄坐標(biāo),其數(shù)組的賦值如下所示。(坐標(biāo)參考圖9.3~圖9.9)。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹2.界面顯示方塊的坐標(biāo)點確定之后,需要考慮如何在終端上實現(xiàn)整個界面的顯示。Shell編程中,可以使用命令echo實終端顯示。echo可以輸出帶有顏色的字體,其語法格式如下所示。9.2案例實現(xiàn)上述語法格式中,“033”表示轉(zhuǎn)義序列的控制字符Esc。這里需要說明的是,終端的字符顏色由轉(zhuǎn)義序列進行控制(文本模式下的系統(tǒng)顯示功能,與具體的語言無關(guān))。轉(zhuǎn)義序列以控制字符Esc開頭,該字符的ASCII碼使用十進制數(shù)表示為27,使用十六進制數(shù)表示為0x1B,使用八進制數(shù)表示為033。9.2.1核心技術(shù)介紹由于多數(shù)轉(zhuǎn)義序列的控制字符都超過兩個字符,因此上述語法格式中,將“033”與“[”進行組合,表示引導(dǎo)轉(zhuǎn)義序列?!癿”則表示結(jié)束轉(zhuǎn)義序列。上述語法格式中,字體顏色與背景顏色可選擇的范圍如下所示。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹上述語法格式中,“\033[0m”用來實現(xiàn)輸出特效格式控制,表示關(guān)閉所有屬性。其他的ASCII控制碼如表所示。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹綜合上述介紹編寫測試程序,實現(xiàn)在終端上顯示圖中的方塊1,如例所示。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹例的第13行代碼中,方塊的Y軸坐標(biāo)以頂端為起始位置,加1則表示向下移動1個字符的距離。終端顯示的方塊由符號“[”與“]”組成,共2個字符,因此第11行代碼中的X坐標(biāo)值需要乘以2。例的運行結(jié)果如圖所示。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹3.信號處理由第2部分的介紹可知,通過改變X、Y坐標(biāo)可以實現(xiàn)在屏幕的不同地方繪制方塊。如果想通過按鍵實現(xiàn)對方塊的操作,則需要使用信號處理機制。由9.1.4節(jié)的框架介紹可知,程序1用來接收按鍵輸入并發(fā)送信號給程序2,程序2則用來響應(yīng)信號并進行處理。在Shell中,trap命令用來實現(xiàn)對信號的響應(yīng),其響應(yīng)信號的方式有以下3種。(1)執(zhí)行自定義的處理響應(yīng)信號。(2)執(zhí)行信號的默認(rèn)處理。(3)忽略該信號。9.2案例實現(xiàn)9.2.1核心技術(shù)介紹上述3種信號響應(yīng)方式分別對應(yīng)trap命令的3種語法格式。(1)trap命令接收到signal-list清單中數(shù)值相同的信號時,執(zhí)行commands命令串。9.2案例實現(xiàn)上述語法格式中需要注意的是,單引號與雙引號表示的意義不同。Shell程序執(zhí)行trap命令時,會對commands中的命令串進行掃描。如果使用單引號標(biāo)識commands,則Shell不會對commands中的變量或命令進行替換,否則commands中的變量或命令將會被當(dāng)時具體的值替換。9.2.1核心技術(shù)介紹(2)trap命令接收到signal-list清單中數(shù)值相同的信號時,執(zhí)行默認(rèn)操作,即忽略comands命令串。9.2案例實現(xiàn)(3)trap命令接收到signal-list清單中數(shù)值相同的信號時,執(zhí)行忽略操作,即不指定commands命令串。9.2.2案例代碼分析下面對案例代碼中封裝的函數(shù)接口依次進行介紹,示例代碼參考教材9.2.2節(jié)。以上代碼主要定義了程序所需的全局變量。其中的核心內(nèi)容為數(shù)組的使用,通過數(shù)組分別記錄不同方塊的坐標(biāo)位置,從而保證在游戲界面中顯示不同形狀的方塊。示例代碼參考教材9.2.2節(jié)。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分為程序1的入口函數(shù)(主函數(shù))。函數(shù)的主要功能為通過read命令讀取按鍵輸入并執(zhí)行判斷,根據(jù)按鍵信息,發(fā)送不同的信號給程序2。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分為程序1退出時的處理。程序1在退出時,首先發(fā)送信號給程序2,通知程序2退出;然后恢復(fù)終端的原有屬性,即恢復(fù)終端原有的命令行輸入格式,退出游戲界面。示例低嗎參考教材9.2.2節(jié)。以上代碼部分為程序2的入口函數(shù)(主函數(shù))。函數(shù)的主要功能分為兩部分:一部分為調(diào)用初始化函數(shù)InitDraw,實現(xiàn)游戲界面的顯示(后續(xù)詳細(xì)介紹);另一部分為信號的掛載(注冊信號),并根據(jù)信號的類型,調(diào)用不同的函數(shù)進行處理。9.2案例實現(xiàn)9.2.2案例代碼分析9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分為程序2的檢測函數(shù),執(zhí)行移動方塊任務(wù)的函數(shù)會主動調(diào)用該函數(shù)。函數(shù)的主要功能為判斷方塊移動后是否會碰撞到其他已經(jīng)下落的方塊或游戲界面邊框,即判斷該方塊是否具備移動的條件。示例代碼參考教材9.2.2節(jié)。以上代碼部分為程序2的功能函數(shù),函數(shù)的主要功能為方塊下落停止后,檢測當(dāng)前方框中的固定方塊組合是否形成完整行。如果形成完整行,則消除該行,并重新記錄得分以及等級。9.2案例實現(xiàn)9.2.2案例代碼分析9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼實現(xiàn)的功能為方塊下落一行。其移動的原理為清除當(dāng)前游戲界面中顯示的方塊,然后改變方塊顯示時的Y坐標(biāo),最后重新向終端輸出該方塊。因此,移動方塊并非直接使方塊發(fā)生移動,而是將原有的方塊擦除,然后顯示新的方塊。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分實現(xiàn)的功能為方塊左移一列,其原理與方塊下落時相同。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分實現(xiàn)的功能為方塊右移一列,其原理與方塊左移時相同。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分的功能為方塊快速下落,即立刻下落到不能下落為止。其原理與下落一行時類似,二者的區(qū)別是:下落一行時,方塊Y軸坐標(biāo)的偏移量為1;快速下落時,方塊Y軸坐標(biāo)的偏移量不固定,需要提前計算。示例代碼參考教材9.2.2節(jié)。以上代碼實現(xiàn)的功能為方塊旋轉(zhuǎn),即改版方塊在下落過程中的形狀,實現(xiàn)方塊旋轉(zhuǎn)需要得到旋轉(zhuǎn)后的方塊在數(shù)組中的坐標(biāo)值,除此之外,其原理與方塊移動時相同。9.2案例實現(xiàn)9.2.2案例代碼分析9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼實現(xiàn)的功能為方塊顯示或消除。函數(shù)根據(jù)不同種類方塊的坐標(biāo)以及方塊在界面中的偏移量,將方塊顯示在界面中的某一位置。同時函數(shù)可以清除界面中的方塊,其原理為向方塊所在的界面位置上打印空字符,從而使空字符覆蓋掉原有的字符。調(diào)用該函數(shù),使用先消除后顯示的方式即可實現(xiàn)方塊的旋轉(zhuǎn)或移動。代碼參考教材9.2.2節(jié)。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼實現(xiàn)的功能較多,第456~463行代碼實現(xiàn)了將上一輪預(yù)顯示的方塊作為本輪即將下落的方塊;第465~485行代碼用來確定方塊開始下落的位置并使其開始下落;第494~502行代碼實現(xiàn)對上一輪預(yù)顯示方塊的清除;第504~515行代碼實現(xiàn)隨機產(chǎn)生新的方塊;第517~527行代碼實現(xiàn)將新產(chǎn)生的方塊作為本輪的預(yù)顯示方塊。上述函數(shù)通常在方塊下落結(jié)束時被調(diào)用,從而保證每一輪預(yù)顯示的方塊作為下一輪下落的方塊。代碼參考教材9.2.2節(jié)。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼實現(xiàn)的功能為游戲界面顯示,包括游戲邊框繪制與分?jǐn)?shù)、等級提示。同時調(diào)用RandomBox函數(shù),產(chǎn)生下落方塊以及預(yù)顯示方塊。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼為退出函數(shù)與提示函數(shù)。程序退出時調(diào)用退出函數(shù),玩家執(zhí)行“幫助”操作時調(diào)用提示函數(shù)(顯示腳本執(zhí)行的方法)。9.2案例實現(xiàn)9.2.2案例代碼分析以上代碼部分為整個案例代碼的入口,其中第601行代碼用來啟動程序2,第602行代碼為程序1的入口。案例代碼的運行方式如下所示。(Tetris.sh為腳本名稱)9.2案例實現(xiàn)根據(jù)上述運行方式可知,腳本程序運行時,并沒有命令行傳參。因此,涉及到命令行參數(shù)$1的代碼(第593~599行)在開始時不會被執(zhí)行。再根據(jù)if-else分支語句可以確定,第601行為整個案例運行的第一行代碼,其中符號“&”表示在后臺運行,$0則表示程序本身的名稱,替換該名稱后的代碼如下所示。9.2.2案例代碼分析由此可知,該行代碼采用了遞歸調(diào)用的思想,將腳本程序再次運行。通俗地說,在一個腳本程序中運行另一個腳本,而另一個腳本仍然是該腳本本身,其原理如圖所示。9.2案例實現(xiàn)9.2.2案例代碼分析需要注意的是,再次執(zhí)行腳本并不會重復(fù)執(zhí)行腳本中的內(nèi)容。如第601行代碼所示,對運行的腳本程序執(zhí)行命令行傳參,參數(shù)為“--show”。因此,再次運行的腳本程序首先會執(zhí)行第第593~599行的判斷語句,其中執(zhí)行到第

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論