版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)部</p><p><b> 面向?qū)ο笳n程設(shè)計(jì)</b></p><p> 題 目 俄 羅 斯 方 塊 </p><p> 學(xué) 部 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班 級(jí) 計(jì) 科 1003班
2、</p><p> 指 導(dǎo) 教 師 </p><p> 姓 名 </p><p> 學(xué) 號(hào) </p><p><b> 2011年6月</b></p
3、><p><b> 摘 要</b></p><p> 俄羅斯方塊上手極其簡(jiǎn)單,但是要熟練地掌握其中的操作與擺放技巧,難度卻不低。作為家喻戶曉老少皆宜的大眾游戲,其普及程度可以說是史上任何一款游戲都無法相比的。</p><p> 該俄羅斯方塊程序采用了面向?qū)ο缶幊陶Z(yǔ)言,我們運(yùn)用了很少有關(guān)計(jì)算機(jī)程序知識(shí),完成游戲的需求來實(shí)了游戲的一些簡(jiǎn)單的功能,
4、如不同樣式的俄羅斯方塊的隨機(jī)產(chǎn)生、俄羅斯方塊的鍵盤操作移動(dòng)功能、方塊滿行消行功能、方塊到頂游戲結(jié)束功能等。該課程設(shè)計(jì)中詳細(xì)闡述了程序的設(shè)計(jì)目標(biāo)、總體架構(gòu)及程序的詳細(xì)設(shè)計(jì)。</p><p> 俄羅斯方塊這款游戲,要通過設(shè)計(jì)者對(duì)界面的調(diào)色設(shè)置適當(dāng),方塊下落也要設(shè)置合理,因些我們這款游戲置了良好的用戶界面設(shè)計(jì),實(shí)現(xiàn)方塊下落時(shí),可通過鍵盤方向鍵(上、下、左、右鍵)對(duì)該方塊進(jìn)行向上(變行),向下(加速)、向左、向右移動(dòng)。
5、隨機(jī)給出不同的形狀(長(zhǎng)條形、Z字形、田字形、7字形等)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當(dāng)達(dá)到一定的分?jǐn)?shù)時(shí),過關(guān),一共設(shè)置十關(guān),每關(guān)方塊下落的速度不同,游戲中先結(jié)束的一方為本局輸家,十關(guān)過后,勝出局?jǐn)?shù)多的為贏家,并且用戶通過界面可以看到下一個(gè)下落的方塊和下下一個(gè)下落的方塊,這樣給用戶降低了難度。從而讓廣大朋友越來越喜愛這款游戲。</p><p> 用戶啟動(dòng)游戲后,即進(jìn)入游戲主畫面,用戶按下[start
6、]按鈕后,就可以開始玩游戲了,當(dāng)用戶想暫停時(shí),再次按一下[stop]按鈕,游戲就暫停了,并給予提示,在暫停的情況下再按[stop]按鈕,游戲繼續(xù)運(yùn)行。任何時(shí)候按[end]按鈕,游戲就會(huì)結(jié)束,并且繼續(xù)開始游戲。</p><p> 由于設(shè)計(jì)者水平有限,不當(dāng)之處在所難免,如有好的建議懇請(qǐng)讀者提出并加以指正。</p><p> 關(guān)鍵詞:俄羅斯方塊;交互動(dòng)態(tài)更新;計(jì)時(shí)器;</p>
7、<p><b> 課程設(shè)計(jì)任務(wù)分配表</b></p><p><b> 表1</b></p><p><b> 表2</b></p><p> 相關(guān)編程知識(shí)的課程設(shè)計(jì)</p><p> 關(guān)鍵變量定義及作用:</p><p> int
8、 m_GameEnd=1;//游戲是否結(jié)束</p><p> int Level=1;//游戲過了幾關(guān)了</p><p> int Score=0;//玩游戲中你所得到的分?jǐn)?shù)</p><p> char m_Game_Pouse=TRUE;//游戲是否暫停</p><p> char m_xialuo=true;//初始下落變量<
9、;/p><p> int m_Sudu=200;//初始計(jì)時(shí)器時(shí)間間隔</p><p> 實(shí)現(xiàn)程序相關(guān)知識(shí)的引用:</p><p> CBrush brush(crseg);//畫刷的應(yīng)用</p><p> SetTimer(1,m_Sudu,NULL);// 安裝計(jì)時(shí)器</p><p> BackGrounds
10、et(pDC);//描繪游戲背景</p><p> m_NextImage(pDC,m_OldNextpoint,m_NextShape);//畫出下一個(gè)方塊</p><p> m_NextImage(pDC,m_Nextpoint,m_Next2Shape);//畫出下下一個(gè)方塊</p><p> m_DrawImage(pDC,m_pcurpos,m_Cu
11、rShape);//畫出當(dāng)前操作的方塊</p><p> pDC -> TextOut(310, 120,lis);//畫一條豎線</p><p> pDC->MoveTo(300,0);//移到某一個(gè)點(diǎn)</p><p> pDC->LineTo(300,500);//畫出剛才MoveTo函數(shù)指向的那一個(gè)點(diǎn)的直線</p><
12、;p> COLORREF wins=RGB(0,0,0);//背景顏色的設(shè)置</p><p> CPen pen(PS_INSIDEFRAME,1,line);//畫筆的操作</p><p> CancelRangle(pDC);//判斷是否可以消格,是否升級(jí)。</p><p><b> 目 錄</b></p>&
13、lt;p> 第1章 前 言1</p><p><b> 1.1簡(jiǎn)介說明1</b></p><p> 1.1.1 研究背景1</p><p> 1.1.2 游戲適合對(duì)象及注意事項(xiàng)1</p><p> 1.2 設(shè)計(jì)的目的及工作原理1</p><p> 1.2.1工作原理
14、1</p><p> 1.2.2設(shè)計(jì)的目的1</p><p> 1.3 設(shè)計(jì)內(nèi)容2</p><p> 第2章 游戲功能分析4</p><p> 2.1 游戲總體功能分析4</p><p> 2.1.1描繪俄羅斯方塊功能和方塊預(yù)覽功能4</p><p> 2.1.2方塊自由
15、下落及判斷功能和描繪背景方塊堆積狀況的功能6</p><p> 2.1.3按鍵操作響應(yīng)功能和消行加分升級(jí)功能8</p><p> 2.1.4背景設(shè)置和游戲控制功能9</p><p> 第3章 系統(tǒng)測(cè)試11</p><p> 3.1 程序運(yùn)行測(cè)試11</p><p> 3.1.1程序主界面圖11&
16、lt;/p><p> 3.1.2 游戲開始的界面11</p><p> 3.1.3游戲暫停的界面12</p><p> 3.1.4 游戲停止的界面12</p><p> 3.1.5用戶過了通關(guān)后運(yùn)行的界面:13</p><p> 3.1.6方塊到頂不能運(yùn)行造成游戲結(jié)束的界面13</p>&
17、lt;p> 3.1.7 方塊進(jìn)行變形14</p><p> 3.2 程序流程圖14</p><p> 3.2.1游戲開始時(shí)流程圖15</p><p> 3.2.2消格加分升級(jí)模塊運(yùn)行流程圖16</p><p><b> 第4章 總結(jié)17</b></p><p><b
18、> 參考文獻(xiàn)19</b></p><p><b> 第1章 前 言</b></p><p><b> 1.1簡(jiǎn)介說明</b></p><p> 1.1.1 研究背景</p><p> 隨著社會(huì)的發(fā)展,人們智慧的需要,現(xiàn)在益智游戲也越來越多。為了滿足廣人們的需要,我們研
19、發(fā)了一款新的俄羅斯方塊。俄羅斯方塊是最經(jīng)典的益智休閑游戲之一,這個(gè)超級(jí)俄羅斯方塊是一個(gè)演化版本,不同的地方就在于游戲中的方塊不是慢慢落下來,而是可以在空間內(nèi)任意擺放,雖然是小小的變化,在玩法技巧上確大有不同,而且難度也沒有因此降低,玩起來別有另一番樂趣。</p><p> 1.1.2 游戲適合對(duì)象及注意事項(xiàng)</p><p> 適合于那些青少年、兒童及老人玩耍,對(duì)于那些成年人來說,這個(gè)游
20、戲太小兒科了,青少年和兒童玩??梢栽鲩L(zhǎng)他們的智力,老人玩??梢允顾麄冞h(yuǎn)離老人憂郁癥及一些老人易得的病癥。但值得注意的是,請(qǐng)選擇本游戲的廣大玩家,請(qǐng)不要對(duì)本游戲著迷,要適當(dāng)?shù)淖⒁庑菹ⅲ瑢?duì)本游戲上癮有害健康。 </p><p> 1.2 設(shè)計(jì)的目的及工作原理</p><p><b> 1.2.1工作原理</b></p><p> 點(diǎn)擊“sta
21、rt”用戶就可以看到隨機(jī)而形成的方塊會(huì)根據(jù)設(shè)計(jì)速度,用戶可以通過對(duì)方塊進(jìn)行控制,同是可以按“end”按鈕停止,按“stop”按鈕,可以進(jìn)行暫?;蜷_始,并且同時(shí)當(dāng)分值達(dá)到設(shè)置的分?jǐn)?shù)就可以進(jìn)入到下一關(guān),如果方塊鋪滿整個(gè)界面,游戲結(jié)束。</p><p> 1.2.2設(shè)計(jì)的目的</p><p> 為了人們休閑娛樂的需要,并且人們更加注重那些游戲是否可以益智,并且在人煩惱的時(shí)候可以幫助人解除疲勞
22、,這樣給了人們一個(gè)比較好的放松環(huán)境。從而我們從這次課程設(shè)計(jì)使得課堂教學(xué)與實(shí)驗(yàn)實(shí)踐之間關(guān)系更為密切,讓我們認(rèn)識(shí)到必須重視實(shí)踐環(huán)節(jié),多讀程序,多編寫程序,多上機(jī)實(shí)踐.進(jìn)一步培養(yǎng)結(jié)構(gòu)化程序設(shè)計(jì)的思想,加深對(duì)高級(jí)語(yǔ)言要素和控制結(jié)構(gòu)的理解,針對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)中的重點(diǎn)和難點(diǎn)內(nèi)容進(jìn)行訓(xùn)練,獨(dú)立完成有一定的工作量的程序設(shè)計(jì)任務(wù),同時(shí)強(qiáng)調(diào)好的程序風(fēng)格。</p><p><b> 1.3 設(shè)計(jì)內(nèi)容</b>&
23、lt;/p><p> 俄羅斯方塊中具體實(shí)現(xiàn)的功能包括:顯示當(dāng)前方塊模塊、方塊預(yù)覽模塊、游戲背景設(shè)置模塊、消格計(jì)分升級(jí)模塊、計(jì)時(shí)器模塊、按鍵模塊和工具及菜單模塊,其中所有功能集成十個(gè)主要的函數(shù)。</p><p> 顯示當(dāng)前方塊模塊的主要函數(shù):m_DrawImage,</p><p> 方塊預(yù)覽模塊的主要函數(shù): m_NextImage,</p>&
24、lt;p> 游戲背景設(shè)置模塊的主要函數(shù):BackGroundset,</p><p> 消格計(jì)分升級(jí)模塊的主要函數(shù):OnTimer、OnInitialUpdate,</p><p> 按鍵模塊的主要函數(shù): OnKeyDown、OnKeyUp,</p><p> 工具及菜單模塊的主要函數(shù): OnGameEnd、OnGamePouse、OnG
25、ameStart及OnAppAbout。</p><p> 當(dāng)用戶啟動(dòng)該程序則會(huì)通過使用VC++文件操作函數(shù)調(diào)用就立即生成一個(gè)重繪線程,該線程每隔1s繪制一次屏幕。當(dāng)然,重繪時(shí)有一些優(yōu)化措施,并不是屏幕上所有的像素都需要重繪,而是有所選擇,比如游戲畫布上那些已經(jīng)固定下來的下墜物(下墜物一共有7種,由4個(gè)小磚塊組成,每種下墜物顏色固定,可以上下左右旋轉(zhuǎn))就不需重繪。游戲畫布是一個(gè)CommandListene可以接
26、受用戶鍵盤命令,控制下墜物的左移,右移,下移,旋轉(zhuǎn)動(dòng)作。整個(gè)游戲的流程控制體現(xiàn)在游戲畫布函數(shù)的BackGroundset方法里。BackGroundset根據(jù)當(dāng)前的游戲狀態(tài),繪制出當(dāng)時(shí)的游戲畫面。繪制出游戲背景,單擊開始按鈕通過調(diào)用OnGameStart后通過m_DrawImage并且繪制出一個(gè)方塊往下掉,如果到底后,即滿足條件就會(huì)結(jié)束往下掉式,則把下墜物固定下來,同時(shí)檢查游戲畫布上下墜物當(dāng)前行下面的所有行,看是否需要進(jìn)行行刪除動(dòng)作,如
27、果需要行刪除,則清除游戲地圖上被刪行的數(shù)據(jù),再把被刪行繪制成背景色。然后初始化一個(gè)新的下墜物,繪制這個(gè)新的下墜物。就這樣慢慢的累計(jì)通過m_NextImage函數(shù)來顯示下一個(gè)掉下來什么方塊,如果全部填滿則通過</p><p> 當(dāng)你要進(jìn)行方塊向左、向右、向下及變形時(shí)通過調(diào)用OnKeyDown、OnKeyUp這兩個(gè)函數(shù)來達(dá)到所要的效果。OnKeyDown函數(shù)采用的是switch語(yǔ)句來判斷從鍵盤上按下的是上、下、左、
28、右鍵,如果按下的是“上”鍵表示對(duì)該方塊進(jìn)行變形,并且在變形的過程中,當(dāng)靠近邊界地區(qū)時(shí),要進(jìn)行判斷,如果是長(zhǎng)條時(shí),則要在離邊界處的第三個(gè)地方才可以進(jìn)行變形,其他的方塊,可以在離邊界處的第二個(gè)處進(jìn)行變行;按下的是“下”鍵表示對(duì)該方塊加速往下掉;按下的是“左”鍵表示對(duì)該方塊是往左邊移;但不能移不游戲界面,按下的是“右”鍵表示是對(duì)該方塊進(jìn)行右移,達(dá)到你想要的效果。然而OnKeyUp函數(shù)是與OnKeyDown函數(shù)相反,對(duì)鍵盤所輸入的數(shù)進(jìn)行釋放。&
29、lt;/p><p> 在中途要暫??赏∣nGamePouse來實(shí)現(xiàn),首先判斷該游已經(jīng)開始沒,如果開始了,就對(duì)暫停有效,否則不運(yùn)行,暫停是BackGroundset執(zhí)行的時(shí)候無需真正執(zhí)行重繪動(dòng)作,并對(duì)當(dāng)前方塊不再下落懸掛起來,并且給出提示對(duì)話框,提醒該游戲已暫停,使整個(gè)畫面處于不運(yùn)行狀態(tài),直到再按一下“stop”鍵時(shí),整個(gè)游戲界面又開始重新運(yùn)行。</p><p> 要結(jié)束游戲通過調(diào)用OnGa
30、meEnd來完成,歡迎畫面和OnGameEnd畫面的繪制相當(dāng)簡(jiǎn)單??煞謨煞N情況:一種是全部方塊全部堆滿時(shí),讓BackGroundset執(zhí)行的時(shí)候無需真正執(zhí)行重繪動(dòng)作。對(duì)于游戲處于運(yùn)行狀態(tài)的畫面的繪制,則需要在下墜物的當(dāng)前位置,繪制下墜物。在繪制下墜物之前,判斷下墜物是否還能下墜,如果能下墜的話,就讓它下落一格,再進(jìn)行繪制,如果下墜物已無法下墜,則判斷游戲是否處于“結(jié)束”狀態(tài),如果是處于“結(jié)束”狀態(tài)的話,則設(shè)置游戲狀態(tài)為“結(jié)束”狀態(tài),這樣
31、畫布在下一次重繪時(shí)就繪出“結(jié)束”的畫面.如果游戲不是處于“結(jié)束”狀態(tài);另外一種是用戶自已不想玩游戲,通過“end”按鈕來完成,當(dāng)你下此按扭時(shí),系統(tǒng)的BackGroundset函數(shù)直接為你初始化背景,回到剛開始啟運(yùn)游戲的狀態(tài),當(dāng)你按下“start”按鈕時(shí),游戲進(jìn)入玩耍狀態(tài)。</p><p> 如果有一些對(duì)游戲不懂的問題可通過幫助來解除你的疑惑該按扭通過調(diào)用OnAppAbout函數(shù),解決你要解決的問題,就這樣就完成
32、了你對(duì)游戲的操作。</p><p> 第2章 游戲功能分析</p><p> 2.1 游戲總體功能分析</p><p><b> 功能需求:</b></p><p> 描繪俄羅斯方塊功能、描繪背景方塊堆積狀況的功能、方塊預(yù)覽功能、消行加分升級(jí)功能、按鍵操作響應(yīng)功能、游戲控制功能,方塊自由下落及判斷功能;<
33、/p><p><b> 游戲代碼模版設(shè)計(jì):</b></p><p> 該游戲主要是通過十個(gè)主要的函數(shù)來實(shí)現(xiàn)系統(tǒng)的所有功能,這十個(gè)函數(shù)的功能包括顯示當(dāng)前方塊模塊、方塊預(yù)覽模塊、游戲背景設(shè)置模塊、消格計(jì)分升級(jí)模塊、計(jì)時(shí)器模塊、按鍵模塊和工具及菜單模塊。該程序所有的函數(shù)都是用面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)的</p><p> 2.1.1描繪俄羅斯方塊功能和方塊預(yù)
34、覽功能</p><p> 描繪俄羅斯方塊功能對(duì)應(yīng)的是顯示當(dāng)前方塊模塊</p><p> 每一個(gè)俄羅斯方塊由四個(gè)小正方形組成的</p><p> 而每一個(gè)小正方形是用畫刷畫出來的,以下代碼就是定義畫刷的功能:</p><p> GetClientRect(FC);</p><p> COLORREF crseg
35、=RGB(0,250,0);//定義畫刷的顏色是嫩綠色</p><p> CBrush brush(crseg);</p><p> CBrush *oldbrush=pDC->SelectObject(&brush);</p><p> 只要知道小方塊的一個(gè)坐標(biāo)點(diǎn)和他的邊長(zhǎng)(本程序中用size表示,以增強(qiáng)代碼可讀性),就能將小方塊通過畫刷把它畫
36、出來。要畫出俄羅斯方塊,就要確定每個(gè)小正方形的一個(gè)坐標(biāo),那么每個(gè)方塊就要確定4個(gè)坐標(biāo),一共8個(gè)數(shù)據(jù),在此程序中,用了一個(gè)數(shù)據(jù)類型為CPoint的一位數(shù)組PointArray[4]來保存這4個(gè)坐標(biāo),方塊類型一共有7中,一共19種不同的形狀如下圖:</p><p> 為了便于實(shí)現(xiàn)方塊類型的變換,在此程序中用到如下圖的計(jì)算每種方塊的4個(gè)坐標(biāo)的公式:</p><p> PointArray[0
37、].x=point.x+Shape[shape][0]*size;</p><p> PointArray[0].y=point.y+Shape[shape][1]*size; </p><p> PointArray[1].x=point.x+Shape[shape][2]*size;</p><p> PointArray[1].y=point.y
38、+Shape[shape][3]*size+size;</p><p> PointArray[2].x=point.x+Shape[shape][4]*size+size;</p><p> PointArray[2].y=point.y+Shape[shape][5]*size; </p><p> PointArray[3].x=point
39、.x+Shape[shape][6]*size+size;</p><p> PointArray[3].y=point.y+Shape[shape][7]*size+size;</p><p> 注:這段代碼是void CTextView::m_DrawImage(CDC *pDC ,CPoint point, int shape)中的</p><p> 以
40、上代碼中的Shape二維數(shù)組,它的數(shù)據(jù)類型為int ,大小為Shape[19][8];</p><p> 通過改變Shape數(shù)組的一維下標(biāo),實(shí)現(xiàn)方塊形狀的改變。</p><p> Point的數(shù)據(jù)類型是CPoint,用來確定方塊顯示在背景的位置,在調(diào)用函數(shù)時(shí),通過改變實(shí)參,可在游戲區(qū)右邊實(shí)現(xiàn)方塊預(yù)覽功能。</p><p> 通過逆推,計(jì)算將Shape[19][
41、8]在視圖類的構(gòu)造函數(shù)中初始化如下:</p><p> Shape1[19][8]={{0,0,0,0,0,0,0,0},{0,0,0,0,-1,2,-1,2},{0,0,-1,-1,0,0,1,-1},</p><p> {0,0,0,0,0,2,0,0},{2,0,0,0,0,0,0,0},{0,2,0,0,0,0,0,0},{0,0,2,0,0,0,0,0},</p>
42、<p> {0,0,0,0,-1,2,0,1},{0,0,0,0,0,0,1,-1},{0,0,1,1,0,0,0,0},{-1,1,0,0,0,0,0,0},</p><p> {2,0,1,1,0,0,0,0},{0,0,2,-1,0,0,1,0},{0,0,0,0,-1,-1,0,0},{0,0,2,-1,0,0,-1,-2},</p><p> {0,0,0,0
43、,-1,2,0,0},{0,0,0,0,0,0,-2,-1},{0,0,1,-2,0,0,0,0},{0,0,0,0,-2,1,0,0} };//初始化方塊形狀數(shù)組</p><p> 預(yù)覽區(qū)如何顯示下一塊及下下一塊方快呢?,此程序就是用通過多次賦值,是數(shù)據(jù)后移:</p><p> _OldNextShape=m_NextShape;</p><p> m_Cu
44、rShape=m_NextShape;</p><p> m_NextShape=m_Next2Shape;</p><p> m_Next2Shape=rand()%19;</p><p> 再通過2次調(diào)用m_NextImage(CDC *pDC, CPoint point, int shape)來實(shí)現(xiàn)預(yù)覽功能:</p><p>
45、OnDraw(CDC* pDC)</p><p> ?。鸰NextImage(pDC,m_OldNextpoint,m_NextShape);//畫出下一個(gè)方塊</p><p> m_NextImage(pDC,m_Nextpoint,m_Next2Shape);//畫出下下一個(gè)方塊}</p><p> 2.1.2方塊自由下落及判斷功能和描繪背景方塊堆積狀況的功
46、能</p><p> 方塊自由下落及判斷功能對(duì)應(yīng)的是計(jì)時(shí)器模塊(OnTimer(UINT nIDEvent)函數(shù))</p><p><b> 其核心代碼如下:</b></p><p> for(i=0;i<4;i++)</p><p> {//判斷是否觸底,及當(dāng)前方塊下是否已經(jīng)有方塊</p>
47、<p> if(PointArray[i].y==24*size || Map[PointArray[i].x/size][PointArray[i].y/size+1]==1)</p><p> {for( j=0;j<4;j++)</p><p> {Map[PointArray[j].x/size][PointArray[j].y/size]=1;</p&
48、gt;<p> if(Map[PointArray[j].x/size][1]==1)</p><p> {m_GameEnd=1;Level=1;</p><p> Score=0;m_Sudu=200;</p><p><b> break;</b></p><p><b> }
49、</b></p><p> m_touchBottom=1;//用來表示觸底</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(m_GameEn
50、d==0&&m_touchBottom==1)//觸底時(shí)且游戲沒結(jié)束進(jìn)行變量更新操作</p><p><b> {</b></p><p> m_pcurpos.x=120;m_pcurpos.y=0;</p><p> m_OldNextShape=m_NextShape;</p><p> m
51、_CurShape=m_NextShape;</p><p> m_NextShape=m_Next2Shape;</p><p> m_Next2Shape=rand()%19;</p><p> m_touchBottom=0;//賦值操作完畢后,讓m_touchBottom恢復(fù)初始值,重新判斷</p><p><b>
52、 }</b></p><p> if(i>=4&&m_Game_Pouse)</p><p> {m_pcurpos.y+=size; }//通過對(duì)當(dāng)前方塊的縱坐標(biāo)做累加操作實(shí)現(xiàn)方塊下落</p><p> Invalidate(FALSE);更新數(shù)據(jù)</p><p> 需要說明的是:游戲區(qū)域是25行1
53、5列;(怎么在游戲區(qū)描繪已下降的俄羅斯方塊呢?)在程序定義了一個(gè)數(shù)組int Map[15][25]用來記錄游戲區(qū)方塊分布的狀況</p><p><b> 初始值都為0。</b></p><p> 通過循環(huán),判斷,描繪背景方塊堆積狀況,代碼如下:</p><p> for(i=0;i<15;i++)//畫方格圖Map[27][41]&
54、lt;/p><p><b> {</b></p><p> for( j=0;j<25;j++)</p><p><b> {</b></p><p> if(Map[i][j]==1)</p><p> pDC->Rectangle(i*size,j*si
55、ze,(i+1)*size,(j+1)*size);</p><p> } 注:代碼在m_DrawImage函數(shù)中</p><p><b> }</b></p><p> 2.1.3按鍵操作響應(yīng)功能和消行加分升級(jí)功能</p><p> 按鍵響應(yīng)功能包括:方塊的左移、右移、變形、下降加快。</p>
56、<p> 它對(duì)應(yīng)的是按鍵模塊。</p><p> 移動(dòng)也就是使方塊每個(gè)坐標(biāo)按需求一致變動(dòng),但要判讀是否出界,被已有方塊阻擋,舉向左移的代碼如下:</p><p> for( i=0;i<4;i++)</p><p> {if(PointArray[i].x<=0||Map[PointArray[i].x/size-1][Poi
57、ntArray[i].y/size]==1)</p><p><b> a1=1;}</b></p><p><b> if(a1==0)</b></p><p> m_pcurpos.x-=size;</p><p> else m_pcurpos.x=m_pcurpos.x; &l
58、t;/p><p> 右移類同,下移加速就更簡(jiǎn)單了。</p><p> 變形:是通過改變正在傳遞的m_CurShape的值,前面講到過方塊有7種類型,為了實(shí)現(xiàn)變形,將每種類型的不同形狀放在數(shù)組相鄰的位置(這是本程序的有一大亮點(diǎn))在變形的同時(shí),要判斷能不能變形。</p><p> 橫豎狀變化實(shí)現(xiàn)代碼如下:</p><p> if(m_CurS
59、hape>=1&&m_CurShape<=2)</p><p><b> {</b></p><p> for(i=0;i<4;i++)</p><p> {if(PointArray[i].x>240)</p><p><b> j=1;}</b>&
60、lt;/p><p><b> if(!j)</b></p><p><b> {</b></p><p> if(m_CurShape==2)</p><p> m_CurShape=1;//形狀變?yōu)闄M</p><p> elsem_CurShape+=1;}<
61、;/p><p><b> }</b></p><p> 至于消行加分升級(jí)功能,他對(duì)應(yīng)與消格計(jì)分升級(jí)模塊</p><p> 消行的核心代碼如下:</p><p> CPen pen(PS_INSIDEFRAME,2,RGB(0,0,0));</p><p> CBrush brush1(RG
62、B(0,0,0));//創(chuàng)建背景色筆刷</p><p> CBrush *oldbrush1=pDC->SelectObject(&brush1); </p><p> pDC->SelectObject(&pen);</p><p><b> int k;</b></p><p>
63、for(k=i;k>=1;k--)</p><p><b> {</b></p><p> for(int m=0;m<15;m++)</p><p><b> {</b></p><p> Map[m][k]=0;</p><p> Map[m][k]
64、=Map[m][k-1];//下移堆積的方塊i</p><p> pDC->Rectangle(m*size,k*size,m*size+size,k*size+size);</p><p> } </p><p><b> }</b></p><p> 2.1
65、.4背景設(shè)置和游戲控制功能</p><p> 此游戲背景很簡(jiǎn)單,在此就不多說了</p><p> 游戲背景設(shè)置模塊首先獲得當(dāng)前窗口大小,然后繪制區(qū)域大小,線、畫刷和筆,通過PDC指針來指向繪制區(qū)域大小、輸出文本、顏色背景、繪制豎線得到當(dāng)前的背景界面。</p><p> 游戲控制功能對(duì)應(yīng)于工具及菜單模塊</p><p> 工具及菜單模塊
66、主要通過四個(gè)函數(shù)來實(shí)現(xiàn)的:</p><p> OnGameEnd 函數(shù)首先進(jìn)行該游戲是否暫停,如果沒有,則直接結(jié)束該游戲,如果暫停,則會(huì)出現(xiàn)一個(gè)對(duì)話框,進(jìn)行提示,關(guān)閉該對(duì)話框就可以結(jié)束游戲了。OnGamePouse 函數(shù)是對(duì)該游戲暫停,當(dāng)你按下Stop按扭時(shí),該游戲進(jìn)行暫停,如果已經(jīng)暫停了,再按一次就可以開始游戲了。</p><p> OnGameStart 函數(shù)是對(duì)該游戲進(jìn)行
67、開始,首先進(jìn)行判斷是否暫停,如果沒有暫停,游戲又進(jìn)行判斷是否結(jié)束,如果是表示已結(jié)束,又進(jìn)行賦值,對(duì)游戲進(jìn)行初始狀態(tài);如果暫停,進(jìn)行恢復(fù)開始,并繼續(xù)執(zhí)行游戲。</p><p> OnAppAbout 函數(shù)是由于讀者剛開始對(duì)游戲的不了解,該函數(shù)主要是幫助讀者解決疑難問題的。</p><p><b> 第3章 系統(tǒng)測(cè)試</b></p><p>
68、; 3.1 程序運(yùn)行測(cè)試</p><p> 3.1.1程序主界面圖</p><p> 當(dāng)用戶運(yùn)行程序運(yùn)行時(shí)將會(huì)運(yùn)行如下界面:</p><p> 圖3.1 游戲運(yùn)行的主界面</p><p> 3.1.2 游戲開始的界面</p><p> 當(dāng)單擊“開始”按扭,顯示如下界面:</p><p&g
69、t;<b> 圖3.2 游戲開始</b></p><p> 3.1.3游戲暫停的界面</p><p> 當(dāng)單擊“暫?!卑磁ぃ@示如下界面: </p><p> 圖3.3按下“暫?!?lt;/p><p> 3.1.4 游戲停止的界面</p><p> 當(dāng)單擊“停止”按扭,顯示如下界面:<
70、;/p><p> 圖3.4 在運(yùn)行中 圖3.5 按下“停止”按鈕</p><p> 3.1.5用戶過了通關(guān)后運(yùn)行的界面:</p><p> 當(dāng)比較聰明的用戶通過自已各個(gè)方面的能力玩過通關(guān)的界面:</p><p><b> 圖3.6過通關(guān)</b></p><p>
71、 3.1.6方塊到頂不能運(yùn)行造成游戲結(jié)束的界面</p><p> 因用戶操作失誤造成方塊到頂造成游戲結(jié)束的界面:</p><p> 圖3.7 到頂結(jié)束游戲 圖3.8 重新開始游戲</p><p> 3.1.7 方塊進(jìn)行變形</p><p> 拼湊的需要用戶需將方塊任意變形的界面:</p>&l
72、t;p> 圖3.9變形之前 圖3.10變形之后</p><p><b> 3.2 程序流程圖</b></p><p> 3.2.1游戲開始時(shí)流程圖</p><p> m_GameEnd=1程序運(yùn)行:</p><p> 圖3.11整個(gè)程序的運(yùn)行過程</p>
73、<p> 3.2.2消格加分升級(jí)模塊運(yùn)行流程圖</p><p> 圖3.12 消格加分升級(jí)流程圖</p><p><b> 第4章 總結(jié)</b></p><p> 這本次課程設(shè)計(jì)剛開始時(shí),遇到的問題一大堆,開始我還想自己憑空開發(fā)一個(gè)俄羅斯方塊游戲,幾個(gè)星期下來沒有一點(diǎn)進(jìn)展,我還是一頭霧水,后來我想同學(xué)說起了此事,同學(xué)對(duì)我說
74、了一句關(guān)鍵的話,像北極星一樣給我們指明了課程設(shè)計(jì)的方向,他的這句話就是:“你以為你神啊,不看別人的代碼,怎么知道這東西怎么來的,先要看別人是怎么做出來的,然后才知道怎么去做”。這話雖然有點(diǎn)長(zhǎng),但一針見血,讓我如夢(mèng)初醒,很快,在余下的一個(gè)星期,我從網(wǎng)上下載了很多資料,剛開始,看別人的代碼,很難受,而且,不知所云,一天下來,感覺沒什么收獲,但第二天,我還在繼續(xù)看,終于,量變產(chǎn)生質(zhì)變,我看懂了別人的核心代碼,當(dāng)晚11:00,我開始著手編自己的
75、代碼,從此一發(fā)不可收拾,在后來陸陸續(xù)續(xù)遇到很多問題,通過與合作伙伴以及同班同學(xué)討論,使代碼一步步完善?;仡櫰鸫舜螁纹瑱C(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,從選題到定稿,從理論到實(shí)踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是</p><p>
76、; 雖然這只是一個(gè)簡(jiǎn)單游戲程序,這個(gè)課程設(shè)計(jì)讓深入了解了面向?qū)ο蟪绦虻幕玖鞒?,從而也更加深入了面向?qū)ο蟪绦虻膶W(xué)習(xí),在這次課程設(shè)計(jì)中遇上了很多問題,例如:畫筆、畫刷及DDX/DDV技術(shù)的失誤操作,通過這一次實(shí)踐,更加讓我明白動(dòng)手是多么的重要,不要一味聽老師講的那些知識(shí),那一點(diǎn)點(diǎn)知識(shí)永遠(yuǎn)不能滿足我們實(shí)踐的需要,要通過平時(shí)的自學(xué)和知識(shí)的積累,這樣才能讓自已寫起程序來非常的熟練,非常的快。</p><p> 在這次
77、課程設(shè)計(jì)中,我發(fā)現(xiàn)團(tuán)隊(duì)力量是很重要的,一個(gè)人的力量永遠(yuǎn)是不夠的,當(dāng)你走向社會(huì),一個(gè)好的團(tuán)隊(duì)對(duì)你來說非常重要,這個(gè)團(tuán)隊(duì)決定你的生命的寬度。在這次程序課程設(shè)計(jì)雖然我們發(fā)生了很多不快的回憶,我的隊(duì)友在我不自覺的時(shí)侯監(jiān)督我做事,雖然當(dāng)時(shí)有點(diǎn)反抗,但是現(xiàn)在想起來,感覺很搞笑。非常感謝我的隊(duì)友,讓我懂得如何去完成任務(wù)。同時(shí)也要感謝老師給我們的指導(dǎo),讓我們學(xué)會(huì)怎么獨(dú)立去完成代碼,怎么看懂別人的代碼和完善代碼。</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- c課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 簡(jiǎn)單俄羅斯方塊課程設(shè)計(jì)
- java俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)論文
- arm課程設(shè)計(jì)俄羅斯方塊
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- c_課程設(shè)計(jì)-俄羅斯方塊
- c++俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--俄羅斯方塊游戲
評(píng)論
0/150
提交評(píng)論