俄羅斯方塊游戲畢業(yè)論文_第1頁
俄羅斯方塊游戲畢業(yè)論文_第2頁
俄羅斯方塊游戲畢業(yè)論文_第3頁
俄羅斯方塊游戲畢業(yè)論文_第4頁
俄羅斯方塊游戲畢業(yè)論文_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、畢業(yè)論文聲明本人鄭重聲明:1此畢業(yè)論文是本人在指導(dǎo)教師指導(dǎo)下獨立進(jìn)行研究取得的成果。除了特別加以標(biāo)注地方外,本文不包含他人或其它機(jī)構(gòu)已經(jīng)發(fā)表或撰寫過的研究成果。 對本文研究做出重要貢獻(xiàn)的個人與集體均已在文中作了明確標(biāo)明。本人完全意識到本聲明的法律結(jié)果由本人承擔(dān)。2本人完全了解學(xué)校、學(xué)院有關(guān)保留、使用學(xué)位論文的規(guī)定,同意學(xué)校與學(xué)院保留并向國家有關(guān)部門或機(jī)構(gòu)送交此論文的復(fù)印件和電子版,允許此文被查閱和借閱。本人授權(quán)大學(xué)學(xué)院可以將此文的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)庫進(jìn)行檢索,可以采用影印、縮印或掃描等復(fù)制手段保存和匯編本文。3若在大學(xué)學(xué)院畢業(yè)論文審查小組復(fù)審中,發(fā)現(xiàn)本文有抄襲,一切后果均由本人承擔(dān),與

2、畢業(yè)論文指導(dǎo)老師無關(guān)。4. 本人所呈交的畢業(yè)論文,是在指導(dǎo)老師的指導(dǎo)下獨立進(jìn)行研究所取得的成果。論文中凡引用他人已經(jīng)發(fā)布或未發(fā)表的成果、數(shù)據(jù)、觀點等,均已明確注明出處。論文中已經(jīng)注明引用的內(nèi)容外,不包含任何其他個人或集體已經(jīng)發(fā)表或撰寫過的研究成果。對本文的研究成果做出重要貢獻(xiàn)的個人和集體,均已在論文中已明確的方式標(biāo)明。學(xué)位論文作者(簽名):年月關(guān)于畢業(yè)論文使用授權(quán)的聲明本人在指導(dǎo)老師的指導(dǎo)下所完成的論文及相關(guān)的資料(包括圖紙、實驗記 錄、原始數(shù)據(jù)、實物照片、圖片、錄音帶、設(shè)計手稿等),知識產(chǎn)權(quán)歸屬華北 電力大學(xué)。本人完全了解大學(xué)有關(guān)保存,使用畢業(yè)論文的規(guī)定。同意學(xué)校保存 或向國家有關(guān)部門或機(jī)構(gòu)

3、送交論文的紙質(zhì)版或電子版,允許論文被查閱或借 閱。本人授權(quán)大學(xué)可以將本畢業(yè)論文的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)庫進(jìn)行檢 索,可以采用任何復(fù)制手段保存或編匯本畢業(yè)論文。 如果發(fā)表相關(guān)成果,一定 征得指導(dǎo)教師同意,且第一署名單位為大學(xué)。本人畢業(yè)后使用畢業(yè)論文或與該 論文直接相關(guān)的學(xué)術(shù)論文或成果時,第一署名單位仍然為大學(xué)。本人完全了解 大學(xué)關(guān)于收集、保存、使用學(xué)位論文的規(guī)定,同意如下各項內(nèi)容:按照學(xué)校要求提交學(xué)位論文的印刷本和電子版本; 學(xué)校有權(quán)保存學(xué)位論文 的印刷本和電子版,并采用影印、縮印、掃描、數(shù)字化或其它手段保存或匯編 本學(xué)位論文;學(xué)校有權(quán)提供目錄檢索以及提供本學(xué)位論文全文或者部分的閱覽 服務(wù);

4、學(xué)校有權(quán)按有關(guān)規(guī)定向國家有關(guān)部門或者機(jī)構(gòu)送交論文的復(fù)印件和電子 版,允許論文被查閱和借閱。本人授權(quán)大學(xué)可以將本學(xué)位論文的全部或部分內(nèi) 容編入學(xué)校有關(guān)數(shù)據(jù)庫和收錄到中國學(xué)位論文全文數(shù)據(jù)庫進(jìn)行信息服務(wù)。 在不以贏利為目的的前提下,學(xué)校可以適當(dāng)復(fù)制論文的部分或全部內(nèi)容用于學(xué) 術(shù)活動。論文作者簽名:日期:指導(dǎo)教師簽名:日期:中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)設(shè)計(論文)3俄羅斯方塊游戲畢業(yè)設(shè)計(論文)原創(chuàng)性聲明和使用授權(quán)說明原創(chuàng)性聲明本人鄭重承諾:所呈交的畢業(yè)設(shè)計(論文),是我個人在指導(dǎo)教師的指導(dǎo) 下進(jìn)行的研究工作及取得的成果。 盡我所知,除文中特別加以標(biāo)注和致謝的地 方外,不包含其他人或組織已經(jīng)發(fā)

5、表或公布過的研究成果, 也不包含我為獲得 及其它教育機(jī)構(gòu)的學(xué)位或?qū)W歷而使用過的材料。對本研究提供過幫助和做出過 貢獻(xiàn)的個人或集體,均已在文中作了明確的說明并表示了謝意。作者簽名: 日期:指導(dǎo)教師簽名: 日期:使用授權(quán)說明本人完全了解 大學(xué)關(guān)于收集、保存、使用畢業(yè)設(shè)計(論文)的規(guī)定,即:按照學(xué)校要求提交畢業(yè)設(shè)計(論文)的印刷本和電子版本;學(xué)校有權(quán) 保存畢業(yè)設(shè)計(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務(wù);學(xué)校 可以采用影印、縮印、數(shù)字化或其它復(fù)制手段保存論文; 在不以贏利為目的前 提下,學(xué)校可以公布論文的部分或全部內(nèi)容。作者簽名: 日 期:1中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)

6、俄羅斯方塊游戲摘要俄羅斯方塊是一款風(fēng)靡全球的掌上游戲機(jī)和 PC機(jī)游戲,它造成的轟動與 創(chuàng)造的經(jīng)濟(jì)價值可以說是游戲史上的一件大事。它由俄羅斯人阿列克謝帕基特諾夫發(fā)明,故得此名。俄羅斯方塊的基本規(guī)則是移動、 旋轉(zhuǎn)和擺放游戲自動 輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。它看似簡單卻 變化無窮,俄羅斯方塊上手極其簡單,但是要熟練地掌握其中的操作與擺放技 巧,難度卻不低。作為家喻戶曉老少皆宜的大眾游戲, 其普及程度可以說是史 上任何一款游戲都無法相比的。相信大多數(shù)人都還記得為它癡迷得茶不思飯不 想的那個俄羅斯方塊時代。由于俄羅斯方塊具有的數(shù)學(xué)性、動態(tài)性與知名度, 也經(jīng)常拿來作為游戲程序設(shè)

7、計的練習(xí)題材。關(guān)鍵詞:俄羅斯方塊開發(fā);游戲編程;程序開發(fā)-3 -目錄1 . 前言 52 .功能描述 63 .總體設(shè)計 83.1 功能模塊設(shè)計 83.1.1 游戲執(zhí)行主流程 83.1.2 游戲方塊預(yù)覽 83.1.3 游戲方塊控制 93.1.4 游戲顯示更新 113.1.5 游戲速度分?jǐn)?shù)更新 123.1.6 游戲幫助 123.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計 123.2.1 游戲底板BOAR匿構(gòu)體 123.2.2 游戲方塊SHAPE吉構(gòu)體 133.2.3 SHAPE 結(jié)構(gòu)數(shù)組 143.3 函數(shù)功能描述 164 .程序?qū)崿F(xiàn) 194.1 源碼分析 194.1.1 程序預(yù)處理1 94.1.2 主函數(shù) main()244

8、.1.3 初始化界面304.1.4 時鐘中斷處理 3 14.1.5 成績、速度及幫助的顯示 334.1.6 滿行處理 344.1.7 游戲方塊的顯示和清除 394.1.8 游戲方塊操作判斷處理 454.2 運行結(jié)果 524.2.1 游戲初始狀態(tài) 524.2.2 游戲進(jìn)行狀態(tài) 535 .結(jié)論 54致謝 55參考文獻(xiàn) 56中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)1 .前言俄羅斯方塊(Tetris )原本是前蘇聯(lián)科學(xué)家阿列克謝帕吉特洛夫在1984年6月利用空閑時間所編寫的游戲程序,據(jù)說游戲的作者最喜歡網(wǎng)球(Tennis ) 運動,于是,它把來源于希臘語的tetra (意為“四”)與其結(jié)合,造

9、了 “tetris ” 一詞,之后開始提供授權(quán)給各個游戲公司, 造成各平臺上俄羅斯游戲軟件大量 發(fā)行的現(xiàn)象。俄羅斯方塊由于上手簡單、老少皆宜,從而成為了家喻戶曉款風(fēng)靡全球的 一款電視游戲機(jī)和掌上游戲機(jī)游戲。C語言則是目前國際上比較流行的計算機(jī)高級編程語言之一,因其簡潔、 使用方便且具備強(qiáng)大的功能而受到編程人員的普遍青睞。它既適合作為系統(tǒng)描 述語言,也可以用來編寫系統(tǒng)軟件,還可以來編寫應(yīng)用軟件。用C語言來編寫俄羅斯方塊這個游戲有較大優(yōu)勢: C語言具有各種各樣的 數(shù)據(jù)類型,并引入了指針概念,使得程序效率更高; C語言還包含很廣泛的運 算符;另外C語言具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動器,而且

10、計算 功能、邏輯判斷能力也比較強(qiáng)大。選擇此論文題是旨在訓(xùn)練基本編程能力和游戲開發(fā)技巧,熟悉C語言圖形模式下的編程。本程序中涉及結(jié)構(gòu)體、數(shù)組、時鐘中斷及繪圖等方面的知識。 通過本程序的訓(xùn)練,能對C語言有一個更深刻的了解,掌握俄羅斯方塊游戲開 發(fā)的基本原理,為將來開發(fā)出高質(zhì)量的游戲軟件打下堅實的基礎(chǔ)。-7 -2 .功能描述如圖2.1所示,本游戲主要實現(xiàn)一下幾種功能:俄羅斯方塊游戲游戲方塊預(yù)覽功能圖2.1俄羅斯方塊游戲功能描述圖(1)游戲方塊預(yù)覽功能。在游戲過程中,當(dāng)在游戲底板中出現(xiàn)一個游戲方 塊時,必須在游戲方塊預(yù)覽區(qū)域中出現(xiàn)下一個游戲方塊,這樣有利于游戲玩家控制游戲的策略。由于在此游戲中存在 1

11、9種不同的游戲方塊,所以在游戲方 塊預(yù)覽區(qū)域中需要顯示隨機(jī)生成的游戲方塊。(2)游戲方塊控制功能。通過各種條件的判斷,實現(xiàn)對游戲方塊的左移、 右移、快速下移、自由下落、旋轉(zhuǎn)功能,以及行滿消除行的功能。(3)游戲顯示更新功能。當(dāng)游戲方塊左右移動、下落、旋轉(zhuǎn)時,要清除先 前的游戲方塊,用新坐標(biāo)重繪游戲方塊。當(dāng)消除滿行時,要重繪游戲底板的當(dāng) 前狀態(tài)。(4)游戲速度分?jǐn)?shù)更新功能。在游戲玩家進(jìn)行游戲過程中,需要按照一定的游戲規(guī)則給玩家計算游戲分?jǐn)?shù)。比如,消除一行加 10分。當(dāng)游戲分?jǐn)?shù)達(dá)到 一定數(shù)量之后,需要給游戲者進(jìn)行等級的上升,每上升一個等級,游戲方塊的 下落速度將加快,游戲的難度將增加。(5)游戲幫

12、助功能。玩家進(jìn)入游戲后,將有對本游戲如何操作的友情提示。中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)3 .總體設(shè)計3.1 功能模塊設(shè)計3.1.1 游戲執(zhí)行主流程本俄羅斯方塊游戲執(zhí)行主流程圖3.1所示。在判斷鍵值時,有左移VK_LEFT 右移VK_RIGHT下移VK_DOW酸形旋轉(zhuǎn)VK_UP退出VK_ESCt值的判斷。3.1.2 游戲方塊預(yù)覽新游戲方塊將在如圖3.2所示的4X4的正方形小方塊中預(yù)覽。使用隨機(jī)函 數(shù)rand()來產(chǎn)生119之間的游戲方塊編號,并作為預(yù)覽的方塊編號。其中的 正方形小方塊的大小為BSIZEX BSIZE BSIZE為設(shè)定的像素大小。 匚圖3.2游戲方塊預(yù)覽圖-9 -

13、3.1圖3.1游戲執(zhí)行主流程圖.3游戲方塊控制這是此游戲開發(fā)的重點和難點部分。下面分別較少左移、右移、下移、旋中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)轉(zhuǎn)及滿行判斷的實現(xiàn)。左移的實現(xiàn)過程如下:(1)判斷在當(dāng)前的游戲底板中能否左移。 這一判斷必須滿足如下兩條件:游 戲方塊整體左移一位后,游戲方塊不能超越游戲底板的左邊線, 否則越界;并 且在游戲方塊有值(值為1)的位置,游戲底板必須是沒有被占用的(占用時, 值為1)。若滿足這兩個條件,則執(zhí)行下面的左移動作。否則不執(zhí)行左移動作。(2) 清除左移前的游戲方塊。(3) 在左移一位的位置,重新顯示此游戲方塊。右移的實現(xiàn)過程如下:(1)判斷在當(dāng)前游戲

14、底板中能否右移。這一判斷必須滿足如下兩個條件:游 戲方塊整體右移一位后,游戲方塊不能超越游戲底板的右邊線, 否則越界;并 且在游戲方塊有值(值為1)的位置,游戲底板必須是沒有被占用的(占用時, 值為1)。若滿足這兩個條件,則執(zhí)行下面的右移動作。否則不只執(zhí)行右移動 作。(2) 清除右移前的游戲方塊。(3) 在右移一位的位置,重新顯示此游戲方塊。下移的實現(xiàn)過程如下:(1)判斷在當(dāng)前游戲底板中能否下移。這一判斷必須滿足如下兩個條件:游 戲方塊整體下移一位后,游戲方塊不能超越游戲底板的底邊線, 否則越界;并 且在游戲方塊有值(值為1)的位置,游戲底板必須是沒有被占用的(占用時, 值為1)。若滿足這兩個

15、條件,則執(zhí)行下面的下移動作。否則,將 flag_newbox 標(biāo)志置1,主循環(huán)中會判斷此標(biāo)志,若為 1,則會生成下一個游戲方塊,并更新預(yù)覽游戲方塊。(2) 清除下移前的游戲方塊。(3) 在下移一位的位置,重新顯示此游戲方塊。旋轉(zhuǎn)的實現(xiàn)過程如下:(1)判斷在當(dāng)前游戲底板中能否旋轉(zhuǎn)。這一判斷必須滿足如下條件:游戲方 塊整旋轉(zhuǎn)后,游戲方塊不能超越游戲底板的左邊線、 右邊線和底邊線,否則越 界;并且在游戲方塊有值(值為1)的位置,游戲底板必須是沒有被占用的(占 用時,值為1)。若滿足這些條件,則執(zhí)行下面的旋轉(zhuǎn)動作。否則不只執(zhí)行旋 轉(zhuǎn)動作。(2) 清除旋轉(zhuǎn)前的游戲方塊。(3) 在游戲方塊顯示區(qū)域(4X4

16、)不變的位置,利用保存當(dāng)前游戲方塊的數(shù)據(jù) 結(jié)構(gòu)中的next值作為旋轉(zhuǎn)后形成的新游戲方塊的編號,并重新顯示這個編號 的游戲方塊。當(dāng)生成新的游戲方塊前,執(zhí)行行滿的檢查,判斷行滿的過程為:一次從下到上掃描游戲底板中的各行,若某行中1的個數(shù)等于游戲底板水平 方向上的小方塊的個數(shù),則表示此行是滿的。找到滿行后,立即將游戲底板中 的數(shù)據(jù)往下順移一行,直到游戲底板逐行掃描完畢。3.1.4 游戲顯示更新當(dāng)游戲方塊左右移動、下落、旋轉(zhuǎn)時,要清除先前的游戲方塊,用新坐標(biāo)重 繪游戲方塊。當(dāng)消除滿行時,要重繪游戲底板的當(dāng)前狀態(tài)。清除方塊的過程為:用先畫輪廓再填充的方式,使用背景色填充小方塊,然 后使用前景色畫一個游戲

17、底板中的小方塊。 循環(huán)此過程,變化當(dāng)前坐標(biāo),填充 及畫出共16個這樣的小方塊。這樣在游戲底板中,清除了此游戲方塊。3.1.5 游戲速度分?jǐn)?shù)更新當(dāng)判斷出一行滿時,score變量一固定值(如10),可以吧等級level看作是 速度speed,因為速度speed是根據(jù)計分score值不斷上升的,所以我們定義 level=speed=score/speed_step , 其中 speed_step 是每升級所需要的分 數(shù)。方塊下落速度加快,這是不斷修改了定時計數(shù)器變量TimerCounter判斷條件的結(jié)果。速度越快,時間中斷的間隔就越短。3.1.6 游戲幫助實現(xiàn)比較簡單,使用outtextxy()函數(shù)

18、實現(xiàn)。3.2數(shù)據(jù)結(jié)構(gòu)設(shè)計3.2.1 游戲底板BOARD吉構(gòu)體Struct BOARDInt var;Int color;Table_boardVertical_boxsHorizontal_boxs;BOARD結(jié)構(gòu)體表示游戲底板中每個小方塊所具有的屬性。其中var表示小方塊當(dāng)前狀態(tài),只有。與1兩個值,表示此小方塊已被占用,。表示未被占用。 Color表示小方塊的顏色,游戲底板的每個小方塊可以擁有不同的顏色,以增 強(qiáng)美觀。Vertical_boxs 為游戲底板上垂直的方向上小方塊的個數(shù), Horizontal_boxs為游戲底板上水平的方向上小方塊的個數(shù)。11中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)

19、論文(論文)3.2.2 游戲方塊SHAPE吉構(gòu)體struct SHAPEchar box2;int color;/*每個方塊的顏色*/int next;/*下個方塊的編號*/;SHAPE結(jié)構(gòu)體表示某個游戲方塊具有的屬性。其中,char box2表示用2個字節(jié)來表示這個游戲方塊的形狀。每4位來表示一個游戲方塊的一行。Color 表示每個游戲方塊的顏色,顏色可設(shè)為BLACK BLUE GREENCYAN RE MAGENT A BROW LIGHTGRAY5ARKGRAYGHTBLUSLIGHTCYANLIGHTREDLIGHTMAGENTA YELLOWR WHITEnext表示下個游戲方塊的編

20、號,在旋轉(zhuǎn)時需要用到此編號。如box0="0x88",box1="0xc0", 其中0x88和0xc0為十六進(jìn)制表示形式, 具體表現(xiàn)的含義如圖3.3所示。1000100011000000圖3.3 SHAPE結(jié)構(gòu)示意圖3.2.3 SHAPE結(jié)構(gòu)數(shù)組初始化游戲方塊內(nèi)容,即定義MAX_BO淤SHAP或型的結(jié)構(gòu)數(shù)組,并初始化 MAX_BOX19。應(yīng)為一共有19種不同形狀的俄羅斯方塊。struct SHAPE shapesMAX_BOX= /*口口口口口口口口口口*/0x88, 0xc0, CYAN, 1,0xe8, 0x0, CYAN, 2,0xc4, 0x40

21、, CYAN, 3,0x2e, 0x0, CYAN, 0,/*口口 口口口口口* 口口 口口口 口*/0x44, 0xc0, MAGENTA, 5,0x8e, 0x0, MAGENTA, 6,0xc8, 0x80, MAGENTA, 7,0xe2, 0x0, MAGENTA, 4, /*15口口口口口口*/0x8c,0x40,YELLOW, 9,0x6c,0x0,YELLOW, 8,/*口口口口口口*/0x4c,0x80,BROWN, 11,0xc6,0x0,BROWN, 10,/* 口口口口口口口口口口*/0x4e, 0x0,WHITE,13,0x8c, 0x80,WHITE,14,0xe4

22、, 0x0,WHITE,15,0x4c, 0x40,WHITE,12,/* 口中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)* 口口口口口* 口* /0x88, 0x88, RED, 17,0xf0, 0x0, RED, 16,/* 口口* 口口* /0xcc, 0x0, BLUE, 183.3函數(shù)功能描述(1) newtimer()函數(shù)原型:void interrupt newtimer(void)Newtimer()函數(shù)用于為新的時鐘中斷處理函數(shù)。(2) SetTimer()函數(shù)原型:void SetTimer(void interrupt(*IntProc)(void)SetTimer

23、()函數(shù)用于設(shè)置新的時鐘中斷處理過程。(3) KillTimer()函數(shù)原型:void KillTimer()KillTimer()函數(shù)用于恢復(fù)原有的時鐘中斷處理過程。(4) initialize。函數(shù)原型:void initialize( int x,int y,int m,int n)Initialize。函數(shù)用于初始化界面,具體為在傳入?yún)?shù)x、y指明位置上畫 m行n列小方塊,并顯示積分、等級、幫助及預(yù)覽游戲方塊等。(5) DelFullRow()函數(shù)原型:int DelFullRow(int y)DelFullRow()函數(shù)用于處理刪除一滿行的情況。Y指明具體哪一行為滿行。(6) set

24、FullRow()函數(shù)原型:void setFullRow(int t_boardy)setFullRow()函數(shù)用于找到滿行,并調(diào)用 DelFullRow()函數(shù)來處理滿行。t_boardy為在游戲底板中的垂直方向的坐標(biāo)值。(7) MkNextBox()函數(shù)原型:int MkNextBox(int box_numb)MkNextBox()函數(shù)用于生成下一個游戲方塊,并返回方塊號。Box_numbg示當(dāng)前的游戲方塊號。(8) EraseBox()函數(shù)原型: void EraseBox(int x,int y,int box_numb)EraseBox()函數(shù)用于清除(x,y)位置開始的編號為b

25、ox_numb的游戲方塊。(9) show_box()函數(shù)原型: void show_box(int x,int y,int box_numb,int color)show_box()函數(shù)用于顯示(x,y)位置開始的編號為 box_numb的、顏色值為 color的游戲方塊。(10) MoveAble()函數(shù)原型:int MoveAble(int x,int y,int box_numb,int direction)MoveAble()函數(shù)判斷是否可以移動。(x,y)為當(dāng)前方塊位置,box_numb為方 塊號,direction為方向標(biāo)志,返回true和false 。(11) 主函數(shù) main

26、()17中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)整個游戲的主控部分194.程序?qū)崿F(xiàn)4.1 源碼分析4.1.1 程序預(yù)處理包括加載頭文件,定義結(jié)構(gòu)體、常量和變量,并對它們進(jìn)行初始化工作/*加載頭文件*/#include <stdio.h>#include <stdlib.h>#include <dos.h>#include <graphics.h> /*/*定義按鍵碼*/#define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00#define VK_DOWN 0x5000#define VK_UP 0x480

27、0#define VK_ESC 0x011b# define TIMER 0x1c /*/*定義常量*/# define MAX_BOX 19/*# define BSIZE 20/*# define Sys_x 160/*圖形函數(shù)庫*/設(shè)置中斷號*/總共有19種各形態(tài)的方塊*/方塊的邊長是20個象素*/顯示方塊界面的左上角x座標(biāo)*/ 顯示方塊界面的左上角y座標(biāo)*/# define Sys_y 25/*中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)# define Horizontal_boxs 10 /* 水平的方向以方塊為單位的長度 */# define Vertical_boxs 15

28、 /* 垂直的方向以方塊為單位的長度 */# define Begin_boxs_x Horizontal_boxs/2 /* 產(chǎn)生第一個方塊時出現(xiàn)的起始 位置*/# define FgColor 3/*前景顏色,如文字.2-green*/# define BgColor 0/*背景顏色.0-blac*/# define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右邊狀態(tài)欄的 x座標(biāo)*/# define false 0# define true 1/*移動的方向*/# define MoveLeft 1# define MoveRight 2# de

29、fine MoveDown 3# define MoveRoll 4/*以后坐標(biāo)的每個方塊可以看作是像素點是BSIZE*BSIZE的正方形*/*定義全局變量*/int current_box_numb; /*保存當(dāng)前方塊編號*/int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y; /*x,y 是保存方塊的當(dāng)前坐標(biāo)的*/int flag_newbox=false; /* 是否要產(chǎn)生新方塊的標(biāo)記 0*/int speed=0; /*下落速度 */int score=0; /*總分*/int speed_step=30; /*每等級所需要分?jǐn)?shù)*/

30、void interrupt (*oldtimer)(void); /*指向原來時鐘中斷處理過程入口的中斷處理函數(shù)指針*/struct BOARD /*游戲底板結(jié)構(gòu),表示每個點所具有的屬性*/int var;/*當(dāng)前狀態(tài) 只有。和1,1表示此點已被占用*/int color;/*顏色,游戲底板的每個點可以擁有不同的顏色.增強(qiáng)美觀*/Table_boardVertical_boxsHorizontal_boxs;/*方塊結(jié)構(gòu)*/struct SHAPEchar box2;/*的一行是:1000100011000000*/int color;/*一個字節(jié)等于8位,每4位來表示一個方塊如:box0=

31、"0x88",box1="0xc0" 表示的每個方塊的顏色*/下個方塊的編號*/int next;/* ;/*初始化方塊內(nèi)容.即定義MAX_BOX SHAPE1型的結(jié)構(gòu)數(shù)組,并初始化*/struct SHAPE shapesMAX_BOX=-23/*口口口口口口口口口口*/0x88,0xc0,CYAN,1,0xe8,0x0,CYAN,2,0xc4,0x40,CYAN,3,0x2e,0x0,CYAN,0,/*口口口口口口口口口口*/0x44,0xc0,MAGENTA,5,0x8e,0x0,MAGENTA,6,0xc8,0x80,MAGENTA,7,0xe2

32、,0x0,MAGENTA,4,/*口口口口口口*/中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)-250x8c, 0x40, YELLOW, 9,0x6c, 0x0, YELLOW, 8,/* 口口口* 口口口口* 口* /0x4c, 0x80, BROWN, 11,0xc6, 0x0, BROWN, 10,/* 口口口* 口口口 口口口口口口口* 口口口*/0x4e, 0x0, WHITE, 13,0x8c, 0x80, WHITE, 14,0xe4, 0x0, WHITE, 15,0x4c, 0x40, WHITE, 12, /* 口* 口口口口口* 口* 口*/0x88, 0x88,

33、RED, 17,0xf0, 0x0, RED, 16,/* 口口* 口口* /0xcc, 0x0, BLUE, 18;unsigned int TimerCounter=0; /*定時計數(shù)器變量 */4.1.2 主函數(shù) main()Main()函數(shù)主要是實現(xiàn)了對整個程序的運行控制,以及相關(guān)功能模塊的調(diào) 用。void main()int GameOver=0;int key,nextbox;int Currentaction=0;/*標(biāo)記當(dāng)前動作狀態(tài)*/int gd=VGA,gm=VGAHI,errorcode;initgraph(&gd,&gm,"");er

34、rorcode = graphresult();if (errorcode != grOk)printf("nNotice:Graphicserror:%sn",grapherrormsg(errorcode);printf("Press any key to quit!");getch();exit(1);setbkcolor(BgColor);setcolor(FgColor);randomize();SetTimer(newtimer);initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*

35、初始化*/nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color);show_intro(Sys_x,Curbox_y+320);getch();while(1)/* Currentaction=0;flag_newbox=false;檢測是否有按鍵*/if (bioskey(1)key=bioskey(0); else key=0; sw

36、itch(key)中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)case VK_LEFT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Curre ntaction=MoveLeft;break;case VK_RIGHT:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)EraseBox(Curbox_x,Curbox_y,current_b

37、ox_numb);Curbox_x+=BSIZE;Curre ntaction=MoveRight;break;case VK_DOWN:if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Curre ntaction=MoveDown;else flag_newbox=true;break;旋轉(zhuǎn)方塊*/case VK_UP:/*if(MoveAble(Curbox_x,Curbox_y,shapescurrent

38、_box_numb.next,MoveRol l)EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shap escurrent_box_numb.next;Currentaction=MoveRoll;break;case VK_ESC:GameOver=1;break;default:break;if(Currentaction) /*表示當(dāng)前有動作,移動或轉(zhuǎn)動*/show_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);Cu

39、rrentaction=0;/*按了往下鍵,但不能下移,就產(chǎn)生新方塊*/if(flag_newbox)/*這時相當(dāng)于方塊到底部了,把其中出現(xiàn)點滿一行的清去,置0*/ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(nextbox);show_box(LeftWin_x,Curbox_y+200,nextbox,shapesnextbox.color);if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)/* 剛開 始,游戲結(jié)束*/show_box(Curbox_x,

40、Curbox_y,current_box_numb,shapescurrent_box_numb .color);GameOver=1; else flag_newbox=false;Currentaction=0;else /* 自由下落*/if(Currentaction=MoveDown | TimerCounter>(20-speed*2)if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown) EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;show

41、_box(Curbox_x,Curbox_y,current_box_numb,shapescurrent_box_numb .color);TimerCounter=0;if(GameOver )/*| flag_newbox=-1*/printf("game over,thank you! your score is %d”,score);getch();break;-29中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)getch();KillTimer();closegraph();4.1.3初始化界面玩家進(jìn)行游戲時,需要對游戲界面進(jìn)行初始化工作。 此代碼被main()函數(shù)調(diào)用

42、。主要進(jìn)行的工作如下:循環(huán)調(diào)用line()函數(shù)繪制當(dāng)前游戲板。調(diào)用ShowScore()函數(shù)顯示初始的成績,初始成績?yōu)?0。調(diào)用ShowSpeed()函數(shù)顯示初始的速度(等級),初始速度1。/*初始化界面 *參數(shù)說明:x,y 為左上角坐標(biāo)m,n 對應(yīng)于 Vertical_boxs,Horizontal_boxs分別表示縱橫方向上方塊的個數(shù)(以方塊為單位)BSIZE Sys_x Sys_y*void initialize(int x,int y,int m,int n)int i,j,oldx;oldx=x;for(j=0;j<n;j+) for(i=0;i<m;i+)Table_b

43、oardji.var=0;Table_boardji.color=BgColor;line(x,y,x+BSIZE,y);line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE);line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE;y+=BSIZE;x=oldx;Curbox_x=x;Curbox_y=y;/*x,y是保存方塊的當(dāng)前坐標(biāo)的*/flag_newbox=false; /* 是否要產(chǎn)生新方塊的標(biāo)記 0*/speed=0; /*下落速度*/score=0; /*總分*/ShowScore(score);Show

44、Speed(speed);4.1.4 時鐘中斷處理隨著用戶等級的提高,需要加快方塊的下落速度,以增加游戲難度。速度越快,時間中斷的間隔就越短。主要進(jìn)行的工作如下:(1) 定義新的時鐘中斷處理函數(shù) void interrupt newtimer(void) 。(2) 使用SetTimer()設(shè)置新的時鐘中斷處理過程。(3) 定義中斷恢復(fù)過程 KillTimer()。void interrupt newtimer(void)(*oldtimer)(); /* call the old routine */TimerCounter+;/* increase the global counter */

45、*設(shè)置新的時鐘中斷處理過程*/void SetTimer(void interrupt(*IntProc)(void)01dtimer=getvect(TIMER); /*獲取中斷號為TIMER的中斷處理函數(shù)的入口地址*/disable。;/*設(shè)置新的時鐘中斷處理過程時,禁止所有中斷*/setvect(TIMER,IntProc);/* 將中斷號為TIMER勺中斷處理函數(shù)的入口地址改為IntProc()函數(shù)的入 口地址即中斷發(fā)生時,將調(diào)用IntProc()函數(shù)。*/enable。; /*開啟中斷*/*恢復(fù)原有的時鐘中斷處理過程*/-31中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)void

46、KillTimer()disable。;setvect(TIMER,oldtimer);enable();4.1.5 成績、速度及幫助的顯示成績、速度及幫助的顯示是此游戲開發(fā)的一部分。不要進(jìn)行的工作如下:(1) 調(diào)用ShowScore()函數(shù),顯示當(dāng)前用戶的成績,成績是不斷提高的。(2) 調(diào)用ShowSpeed()函數(shù),顯示當(dāng)前游戲方塊的下落速度,速度與等級是 成正比的。(3) 調(diào)用Show_help()函數(shù),提示用戶如何進(jìn)行游戲的相關(guān)操作,此函數(shù)只 在初始部分調(diào)用。/*顯示分?jǐn)?shù)*/void ShowScore(int score)int x,y;char score_str5;/*保存游戲得

47、分 */setfillstyle(SOLID_FILL,BgColor);x=LeftWin_x;y=100;bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);sprintf(score_str,"%3d",score);outtextxy(x,y,"SCORE");-35中國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文) outtextxy(x,y+10,score_str);/*顯示速度*/void ShowSpeed(int speed)int x,y;char speed_str5;/* 保存速度值 */setfillstyle

48、(SOLID_FILL,BgColor);x=LeftWin_x;y=150;bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);/*確定一個以(x1,y1)為左上角,(x2,y2)為右下角的矩形窗口,再按規(guī)定圖模和顏色填充。*/sprintf(speed_str,"%3d”,speed+1);outtextxy(x,y,"Level");outtextxy(x,y+10,speed_str);/* 輸出字符串指針speed_str所指的文本在規(guī)定的(x, y)位置*/ outtextxy(x,y+50,"Nextbox");

49、4.1.6 滿行處理在左移、右移、旋轉(zhuǎn)和下落動作不能進(jìn)行時,即游戲方塊不滿足相關(guān)操作條 件時,需要對游戲主板進(jìn)行是否有滿行的判斷,若有滿行的情況,則必須進(jìn)行消除滿行的處理。如圖4.1所示,當(dāng)豎直的游戲方塊下落在當(dāng)前游戲板中,不能再下移時,出現(xiàn)了兩個行事滿的,則必須進(jìn)行滿行處理。滿行處理包括兩個 動作:第一,找到滿行;第二,處理此滿行。1) 調(diào)用 setFullRow()函數(shù)調(diào)用setFullRow()函數(shù),找到一滿行。具體過程如下:(1) 對當(dāng)前游戲方塊落在的位置,從下到上逐行判斷,若該行的小方塊的值 為1的個數(shù)等于游戲主板行的大小時,則該行為滿行,立即調(diào)用DelFullRow() 函數(shù)進(jìn)行滿

50、行處理,并返回當(dāng)前的游戲主板的非空行的最高點。 否則,繼續(xù)進(jìn) 行對上一行的判斷,直到游戲方塊的最上行。(2) 若有滿行,則根據(jù) DelFullRow()函數(shù)處理后的游戲主板 Table_board 數(shù)組中的值,進(jìn)行游戲主板的重繪,即顯示消除行后的游戲界面,并且對成績 和速度進(jìn)行更新。2) 調(diào)用 DelFullRow()函數(shù)調(diào)用DelFullRow()函數(shù),處理此滿行,主要執(zhí)行的是將上行數(shù)據(jù)移至下移 的操作。圖4.1滿行示意圖/*找到一行滿的情況*/void setFullRow(int t_boardy)int n,full_numb=0,top=0; /*top保存的是當(dāng)前方塊的最高點*/中

51、國石油大學(xué)(北京)現(xiàn)代遠(yuǎn)程教育畢業(yè)論文(論文)register m;/*t_boardy 口5口6口口口口口口 7n 口口口口口口 8*/for(n=t_boardy+3;n>=t_boardy;n-)if(n<0 | n>=Vertical_boxs )continue; /*for(m=0;m<Horizontal_boxs;m+) /*if(!Table_boardn+full_numbm.var)break; /* 有一個是空就跳過該行*/if(m=Horizontal_boxs)/*if(n=t_boardy+3)/*高的*/top=DelFullRow(n+

52、full_numb); /*的該行,并下移數(shù)據(jù)*/elseDelFullRow(n+full_numb);超過低線了 */水平的方向*/發(fā)現(xiàn)找到滿行了 */第一次獻(xiàn)給了 n,最清除游戲板里統(tǒng)計找到的行數(shù)*/full_numb+;/*if(full_numb)int oldx,x=Sys_x,y=BSIZE*top+Sys_y;oldx=x;score=score+full_numb*10; /*力口分?jǐn)?shù) */*這里相當(dāng)于重顯調(diào)色板*/for(n=top;n<t_boardy+4;n+)if(n>=Vertical_boxs)continue; /*超過低線了 */for(m=0;m<Horizontal_boxs;m+) /*水平的方向 */ if(Table_boardnm.var)setfillstyle(SOLID_FILL,Table_boardnm.color);/*Table_boardnm .color*/elsesetfillstyle(SOLID_FILL,BgColor);bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+B

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論