版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p><b> 目 錄</b></p><p> 一、課程設(shè)計的目的與要求3</p><p> 1.1課程設(shè)計的目的3</p><p> 1.2課程設(shè)計的要求3</p><p><b>
2、 二、設(shè)計正文3</b></p><p><b> 2.1需求分析3</b></p><p> 2.1.1 游戲需求3</p><p> 2.2.2游戲界面需求:3</p><p> 2.1.3游戲形狀(方塊)需求:3</p><p><b> 2.2算法
3、分析4</b></p><p> 2.2.1程序流程圖4</p><p> 2.2.2定義方塊的數(shù)據(jù)結(jié)構(gòu)6</p><p> 2.2.3 游戲設(shè)計分析7</p><p><b> 三 系統(tǒng)設(shè)計8</b></p><p> 3.1創(chuàng)建界面的主框架8</p>
4、;<p> 3.2正常流程的設(shè)計8</p><p> 3.2.1定時制機制8</p><p> 3.2.2定時處理9</p><p> 4.1底部到達的判斷與銷行的實現(xiàn)10</p><p> 4.2中斷操作流程的實現(xiàn)13</p><p> 4.3變形的實現(xiàn)14</p>
5、<p> 4.4 游戲區(qū)域繪圖的實現(xiàn)15</p><p> 4.5 功能的完善15</p><p> 4.6 游戲演示16</p><p> 4.7主程序源程序清單17</p><p><b> 六、參考文獻32</b></p><p> 用VC++實現(xiàn)俄羅斯方塊
6、的程序設(shè)計</p><p> 一、課程設(shè)計的目的與要求</p><p> 1.1課程設(shè)計的目的</p><p> 綜合運用所學(xué)知識,熟練掌握VC++程序設(shè)計的編碼與MFC框架結(jié)構(gòu) 。</p><p> 1.2課程設(shè)計的要求</p><p> 要求用VC++設(shè)計與實現(xiàn)俄羅斯方塊游戲。要求包括系統(tǒng)的需求分析;系統(tǒng)
7、總框圖及每個模塊的設(shè)計分析;MFC應(yīng)用程序架構(gòu);框架的擴展;算法的設(shè)計與實現(xiàn);游戲的內(nèi)部實現(xiàn);游戲區(qū)域繪圖的實現(xiàn);系統(tǒng)存在的問題及錯誤處理;列出所有定義的函數(shù)及說明;附上程序源代碼。</p><p><b> 二、設(shè)計正文</b></p><p><b> 2.1需求分析</b></p><p> 2.1.1 游戲需
8、求</p><p> 隨機給出不同的形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當達到一定的分數(shù)時,過關(guān),設(shè)置六關(guān),每關(guān)方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域,為輸者。游戲功能要求如下:</p><p> 2.2.2游戲界面需求:</p><p> 良好的用戶界面,有關(guān)數(shù)顯示和分數(shù)顯示。
9、讓方塊在一定的區(qū)域內(nèi)運動和變形,該區(qū)域用一種顏色表明,既用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來,寬度適中,要實現(xiàn)美感。</p><p> 2.1.3游戲形狀(方塊)需求:</p><p> 良好的方塊形狀設(shè)計,繪制七種常見的基本圖形(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個方塊要能實現(xiàn)它的變形,可設(shè)為順時針或逆 時針變形,一般為逆時針。&l
10、t;/p><p><b> 2.2算法分析</b></p><p> 2.2.1程序流程圖</p><p> 圖2.2.3 程序運行調(diào)用圖</p><p> 2.2.2定義方塊的數(shù)據(jù)結(jié)構(gòu)</p><p> 對于方塊在某一瞬間的位置標識,我們采用一個4×2的小數(shù)組標識出來,即用4個存
11、儲單位空間存儲當前下墜物的每一子塊的位置,也就是說,用4個存儲單位空間存儲當前下墜物的每一子塊的位置來對整個下墜物件的位置進行標識,而每個存儲空間的大小就是一個典的坐標值(x,y),而每個方塊按照從左到右的方式進行編號,并且在編號過程中對于同一列的方塊實行從上到下進行編號 [2] 。</p><p><b> 圖3.1 方塊編號</b></p><p> Acti
12、veStatus[0][0]和ActiveStatus[0][1]則是第0號方塊的橫坐標x和縱坐標y ;ActiveStatus[2][0]和ActiveStatus[2][1]則是第2號方塊的橫坐標x和縱坐標y。</p><p> 2.2.3 游戲設(shè)計分析</p><p> 有前面的功能描述可知,我先虛擬出俄羅斯方塊游戲的類對象,并抽象出核心的數(shù)據(jù)屬性和操作方法等,然后再作細化,最后
13、將整個虛擬類的外殼脫掉,再移植到視圖類中去,其實現(xiàn)如下:</p><p> CRectGameView : public CView</p><p><b> {</b></p><p> //內(nèi)部存取數(shù)據(jù)結(jié)構(gòu)</p><p> int m_stateMap[MAX_ROW][MAX_COL];</p>
14、;<p><b> //初始化操作</b></p><p> GameInitnal(); //游戲的初始化</p><p> //用于判斷數(shù)據(jù)相關(guān)狀態(tài)的操作</p><p> IsLeftLimit(); //下墜物件是否可向左移動</p><p> IsRightLitm
15、it(); //</p><p> IsBottom(); //是否已經(jīng)到達了底部</p><p> IsGameEnd(); //是否游戲已經(jīng)結(jié)束</p><p> //方塊物件下墜過程中的操作</p><p> RectChange(); //下墜物件變形</p>
16、<p> RectDown(); //下墜物件正常下落</p><p> RectArrow(); //下墜物件方向移動(左,右,下加速)</p><p><b> //狀態(tài)控制操作</b></p><p> GameStart(); //游戲開始</p>&
17、lt;p> GamePause(); //游戲暫停</p><p> GameEnd(); //游戲結(jié)束</p><p><b> }</b></p><p> 通過上面的代碼可以看出,在虛擬類中抽象出了核心的內(nèi)部數(shù)據(jù)和一些基本的操作函數(shù)。對于操作函數(shù),可以把它們分為內(nèi)部實現(xiàn)的基本核心操作(如判
18、斷操作)以及明顯提供給外部使用的整體模塊外部操作(如狀態(tài)控制操作)。而內(nèi)部的基本操作又可以分為判斷操作和執(zhí)行操作這樣兩種類型[3]。</p><p><b> 三 系統(tǒng)設(shè)計</b></p><p> 3.1創(chuàng)建界面的主框架</p><p> 首先建立一個項目工程,名為skyblue_Rect,并在AppWizard的架構(gòu)選擇過程中選擇單文
19、檔方式,其他保持默認選項。其項目的架構(gòu)類視圖信息如圖所示:</p><p> 在構(gòu)架類視圖中是MFC基本架構(gòu)組合:App(應(yīng)用程序)類、Document(文檔)類、View(視圖)類、Frame(框架)類和用于提示關(guān)于作者的對話框CAboutDlg類,至于COptionDlg類是用作俄羅斯方塊參數(shù)選擇的對話框類對象。 </p><p> 3.2正常流程的設(shè)計
20、 </p><p> 3.2.1定時制機制</p><p> 從分析游戲的特性可以知道,定時器的產(chǎn)生與生效應(yīng)該在游戲開始的時候,而在游戲暫?;蛘哂螒蚪Y(jié)束時則將已經(jīng)設(shè)定的定時器失效/銷亡(對于暫停的情況,使它銷亡,當游戲從暫停狀態(tài)又進入游戲狀態(tài)時候,則重新創(chuàng)建一個定時器并激活它的運作),所以分別在游戲的開始函數(shù)、暫停函數(shù)已經(jīng)結(jié)束函數(shù)中
21、實現(xiàn)定時器的激活與去激活工作。這里,先在資源編輯器菜單資源里面添加三個菜單選項,分別是游戲的“開始”、“暫?!?、和“結(jié)束”,然后利用ClassWizard直接在視圖類對象Cskyblue_RectView中為它們添加空白的處理函數(shù),具體如表2所示。</p><p> 3.2.1菜單選項功能對應(yīng)表</p><p><b> 3.2.2定時處理</b></p&g
22、t;<p> 經(jīng)過定時器的設(shè)置后,這里通過利用ClassWizard跳到定時器到時候的處理函數(shù)OnTimer()去實現(xiàn),當固定時間片間隔到達后,先檢測當前下墜物是否已經(jīng)到達了底部,不是則進行RectDown()下墜物向下移動一個單位的操作,是則到底后產(chǎn)生一個新的“下一個下墜物”,并代替舊的,將原先舊的“下一個下墜物”用作當前激活狀態(tài)下正在使用的下墜物,并對使用后的一些狀態(tài)進行檢測:是否馬上到達底部,使則進行銷行操作<
23、;/p><p> ?。皇欠裨诘竭_底部的同時到達游戲區(qū)域的頂部,從而判定游戲是否因違規(guī)而結(jié)束。</p><p> 圖 3.2.2裝載方塊</p><p> 視圖類創(chuàng)建了m_icurrentStatus和m_inextStatus兩個成員變量來記錄下墜物的類型,共有七種形狀,并從7種方塊中隨機抽取圖形。而m_currentRect除了記錄下墜物的類型外,還需記錄其當前的
24、變形狀態(tài),最多用兩位表示,第1位用作類型標識(1~7),第2位用作同種類型的不同表現(xiàn)方式,最多有4種狀態(tài)(1~4)。</p><p> 在產(chǎn)生新的下一個下墜物前,需要先將當前狀態(tài)物的記錄和舊的下一個下墜物保存下來,然后用隨機函數(shù)Random()產(chǎn)生一個最大值不大于指定值的隨機正整數(shù),將這個新生成的正整數(shù)用作新的“下一個下墜物”的形狀值。</p><p><b> 四、系統(tǒng)實施
25、</b></p><p> 4.1底部到達的判斷與銷行的實現(xiàn)</p><p> 圖3.2.3 處理方塊到達圖</p><p> 將新的下墜物放置到游戲區(qū)域中去,這時可能出現(xiàn)馬上到達底部的情況,因此需要對它進行判斷,如果是到達底部,則進行銷行處理,并且修改相應(yīng)的數(shù)據(jù)狀態(tài)。而判斷是否已經(jīng)到達了底部,可以通過當前下墜物件所對應(yīng)的接觸面的方塊位置為被占用狀
26、態(tài)(MAP_STATE_NOT_EMPTY=1)來確定,利用數(shù)組InterFace[74][4]記錄1~7種下墜物的1~4種形態(tài)的接觸面信息。</p><p> 統(tǒng)計分數(shù):在消行處理里面有一個專門用來統(tǒng)計消行數(shù)的變量,然后根據(jù)變量的值決定分數(shù)的多少,程序統(tǒng)計分數(shù)是:消一行得100分,同時消2行得400分,銷掉x行,則分數(shù)為:x*(x*100)。如果總分數(shù)達到過關(guān)條件就過關(guān),改變游戲速度,游戲初始化,開啟新的一關(guān)
27、,然后再加載方塊。沒有達到過關(guān)分數(shù)或者沒有滿行,則加載下一個方塊繼續(xù)游戲。</p><p> 4.2中斷操作流程的實現(xiàn)</p><p><b> 處理鍵盤事件</b></p><p> 關(guān)于按鍵命令消息的響應(yīng),可以通過對WM_KEYDOWN消息的處理函數(shù)進行截獲并重寫來實現(xiàn),下面是對該處理函數(shù)OnKeyDown()的重寫。</p&g
28、t;<p> // 功能:處理用戶的輸入,方塊的左,右移,加速及變形</p><p> void CSkyblue_RectView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) </p><p><b> {</b></p><p> switch(nChar)<
29、;/p><p><b> {</b></p><p> case VK_LEFT:</p><p> RectArrow(LEFT);</p><p><b> break;</b></p><p> case VK_RIGHT:</p><p>
30、; RectArrow(RIGHT);</p><p><b> break;</b></p><p> case VK_UP:</p><p> RectChange();</p><p><b> break;</b></p><p> case VK_DOW
31、N:</p><p> RectArrow(DOWN);</p><p><b> break;</b></p><p><b> }</b></p><p> CView::OnKeyDown(nChar, nRepCnt, nFlags);</p><p><
32、;b> }</b></p><p><b> 4.3變形的實現(xiàn)</b></p><p> 當按下向上鍵時,將會執(zhí)行方塊變化事件(change())。常見的方塊有7種(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有圖形都是用兩個一維數(shù)組來統(tǒng)計它的橫坐標和縱坐標,每個方塊有4種不同的變化形狀。</p><p>
33、; 例計算變形后的小方塊的坐標和顯示的狀態(tài)值</p><p> //變形后位置在數(shù)組中的存放順序仍需遵循先左后右,在同一列中先上后下</p><p> xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3=y3; yy4=y4;</p><p> switch(m_currentRect)</p>
34、<p><b> {</b></p><p><b> case 1:</b></p><p> xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2; yy4=y4+2;</p><p> m_lscurrentRect = 11;</p>
35、<p><b> break;</b></p><p><b> case 11:</b></p><p> xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2;</p><p> m_lscurrentRect = 1;</p>
36、;<p><b> break;</b></p><p><b> ……</b></p><p> //省略部分為同類實現(xiàn)的變形后小方塊坐標的計算代碼</p><p><b> case 73:</b></p><p> xx2=x2+1; yy2=y2
37、-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;</p><p> m_lscurrentRect = 7;</p><p><b> break;</b></p><p><b> }</b></p><p> 4.4 游戲區(qū)域繪圖的實現(xiàn)</p&
38、gt;<p> 首先將外部位圖文件rect.bmp中的位圖動態(tài)導(dǎo)入(映射)到內(nèi)存位圖里面,根據(jù)游戲區(qū)域中的二維數(shù)組GameStatus[MAX_ROW][MAX_COL]中的內(nèi)部數(shù)據(jù)將所有數(shù)據(jù)狀態(tài)中為被占用狀態(tài)MAP_STATE_NOT_EMPTY的小方塊區(qū)域用指定的小方塊圖樣類型來填充,然后將已經(jīng)繪制好的游戲區(qū)域圖像一次性的拷貝到與屏幕關(guān)聯(lián)的設(shè)備環(huán)境中,從而達到屏幕的顯示。</p><p>&l
39、t;b> 4.5 功能的完善</b></p><p> 為了使得游戲功能更加健全,另外為用戶提供了一些附加功能,如表4.5.1所示。</p><p> 表 4.5.1 附加功能描述列表</p><p> 先將這些目標功能通過資源編輯器在主菜單條進行添加,將前面已有的菜單選項補全,再通過ClassWizard添加對應(yīng)的響應(yīng)處理函數(shù)。其最終
40、效果如圖</p><p><b> 1</b></p><p> 圖 4..5.2 游戲設(shè)置</p><p> 游戲是用來給大家娛樂的,所以要能在使用的過程中給大家?guī)砜鞓罚蠹业钠?,所以我在游戲中添加了漂亮的場景和動聽的背景音樂,設(shè)置了個性化的工具欄快捷鍵,激發(fā)大家的娛樂激情。</p><p><b&
41、gt; 4.6 游戲演示 </b></p><p> 游戲主界面如圖所示。</p><p> 圖4..6.1 俄羅斯方塊游戲運行主界面</p><p> 4.7主程序源程序清單</p><p> CSkyblue_RectView::CSkyblue_RectView()</p><p><
42、;b> {</b></p><p><b> //第一次開始游戲</b></p><p> m_bFistPlay = TRUE;</p><p> //缺省為不是游戲暫停狀態(tài)</p><p> m_bGamePaush = FALSE;</p><p> //缺省為
43、不插放背景音樂</p><p> m_bMusic = FALSE;</p><p><b> //缺省為畫網(wǎng)格線</b></p><p> m_bDrawGrid = TRUE;</p><p><b> //總分值清零</b></p><p> m_iPerfo
44、rmance = 0;</p><p> //測試值:為12行,10列</p><p> m_iRow = 12;</p><p> m_iCol = 10;</p><p> //左上角X,Y坐標</p><p> m_iStartX = 10;</p><p> m_iStart
45、Y = 10;</p><p><b> //缺省級別為3級</b></p><p> m_iLevel = 2;</p><p><b> //第一種樣式</b></p><p> m_iBlockSytle = 0;</p><p> //缺省方塊大小為m_iL
46、arge個象素</p><p> m_iLarge = 30;</p><p> //缺省游戲是結(jié)束的</p><p> m_bGameEnd = TRUE;</p><p><b> int i,j;</b></p><p><b> //賦初值</b></
47、p><p> for (i=0;i<100;i++)</p><p> for (j=0;j<100;j++)</p><p> GameStatus[i][j]=0;</p><p> //各種形狀方塊的接觸面數(shù)據(jù),參見設(shè)計書的接觸面表格, </p><p> //5.判斷游戲是否已結(jié)束: 碰了底,
48、且第1行有小方塊</p><p> if (m_isBottom)</p><p> for (i=0;i<m_iCol;i++)</p><p> if (GameStatus[0][i])</p><p><b> {</b></p><p> KillTimer(1);<
49、;/p><p> AfxMessageBox("游戲已結(jié)束!");</p><p> for (j=0;j<m_iRow;j++)</p><p> for (k=0;k<m_iCol;k++)</p><p> GameStatus[j][k]=0;</p><p> Inval
50、idate(FALSE);</p><p> m_bGameEnd = TRUE;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> else //當
51、前方塊下降</p><p><b> {</b></p><p> RectDown();</p><p><b> }</b></p><p> CView::OnTimer(nIDEvent);</p><p><b> }</b><
52、/p><p> // 函數(shù):產(chǎn)生一個最大值不大于指定值的隨機正整數(shù)(Random)</p><p> // 參數(shù):MaxNumber : 隨機數(shù)的上限</p><p> // 返回值: 產(chǎn)生的隨機數(shù)</p><p> int CSkyblue_RectView::Random(int MaxNumber)</p><p
53、><b> {</b></p><p><b> //布下隨機種子</b></p><p> srand( (unsigned)time( NULL ) );</p><p><b> //產(chǎn)生隨機數(shù)</b></p><p> int random = rand
54、() % MaxNumber;</p><p><b> //保證非0</b></p><p> if(random == 0 ) random++;</p><p> return random;</p><p><b> }</b></p><p><b&g
55、t; }</b></p><p><b> }</b></p><p> //內(nèi)部函數(shù):刷新當前的區(qū)域</p><p> void CSkyblue_RectView::InvalidateCurrent()</p><p><b> {</b></p><
56、p><b> int i;</b></p><p> for (i=0;i<4;i++)</p><p><b> {</b></p><p> CRect rect(m_iStartX+ActiveStatus[i][1]*m_iLarge, </p><p> m_iSta
57、rtY+ActiveStatus[i][0]*m_iLarge,</p><p> m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5,</p><p> m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);</p><p> //InvalidateRect(&rect);<
58、/p><p> Invalidate(FALSE);</p><p><b> }</b></p><p><b> }</b></p><p> // 內(nèi)部函數(shù):當前方塊下降加速,左移,右移</p><p> void CSkyblue_RectView::RectA
59、rrow(int m_Type)</p><p><b> {</b></p><p> //獲取當前下墜物4個小方塊的位置坐標</p><p> int x1,x2,x3,x4,y1,y2,y3,y4;</p><p> x1 = ActiveStatus[0][0];</p><p>
60、 x2 = ActiveStatus[1][0];</p><p> x3 = ActiveStatus[2][0];</p><p> x4 = ActiveStatus[3][0];</p><p> y1 = ActiveStatus[0][1];</p><p> y2 = ActiveStatus[1][1];</p
61、><p> y3 = ActiveStatus[2][1];</p><p> y4 = ActiveStatus[3][1];</p><p> //對不同的移動命令指示進行分類實現(xiàn)</p><p> switch(m_Type)</p><p><b> {</b></p>
62、<p> case LEFT:</p><p> //對每種不同的移動命令指示特性作相應(yīng)的可移動分析</p><p> if ( (ActiveStatus[0][1]>0) && IsLeftLimit() && !m_isBottom)</p><p><b> {</b></
63、p><p><b> //清原來的方塊</b></p><p> GameStatus[x1][y1]=MAP_STATE_EMPTY;</p><p> GameStatus[x2][y2]=MAP_STATE_EMPTY;</p><p> GameStatus[x3][y3]=MAP_STATE_EMPTY;&
64、lt;/p><p> GameStatus[x4][y4]=MAP_STATE_EMPTY;</p><p> //添加新的移動后數(shù)據(jù)狀態(tài)</p><p> ActiveStatus[0][1] -= 1;</p><p> ActiveStatus[1][1] -= 1;</p><p> ActiveStat
65、us[2][1] -= 1;</p><p> ActiveStatus[3][1] -= 1;</p><p> GameStatus[x1][y1-1]=MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x2][y2-1]=MAP_STATE_NOT_EMPTY;</p><p> GameStat
66、us[x3][y3-1]=MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x4][y4-1]=MAP_STATE_NOT_EMPTY;</p><p> InvalidateCurrent();</p><p><b> }</b></p><p><b> break
67、;</b></p><p> case RIGHT:</p><p> if ( (ActiveStatus[3][1]< m_iCol-1) && IsRightLitmit() && !m_isBottom)</p><p><b> {</b></p><p>
68、;<b> //清原來的方塊</b></p><p> GameStatus[x1][y1]=MAP_STATE_EMPTY;</p><p> GameStatus[x2][y2]=MAP_STATE_EMPTY;</p><p> GameStatus[x3][y3]=MAP_STATE_EMPTY;</p><
69、p> GameStatus[x4][y4]=MAP_STATE_EMPTY;</p><p> //添加新的移動后數(shù)據(jù)狀態(tài)</p><p> ActiveStatus[0][1] += 1;</p><p> ActiveStatus[1][1] += 1;</p><p> ActiveStatus[2][1] += 1;&
70、lt;/p><p> ActiveStatus[3][1] += 1;</p><p> GameStatus[x1][y1+1]=MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x2][y2+1]=MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x3][y3+1]=MA
71、P_STATE_NOT_EMPTY;</p><p> GameStatus[x4][y4+1]=MAP_STATE_NOT_EMPTY;</p><p> InvalidateCurrent();</p><p><b> }</b></p><p><b> break;</b><
72、;/p><p> case DOWN:</p><p> RectDown();</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p>
73、 // 內(nèi)部函數(shù):方塊的變形</p><p> void CSkyblue_RectView::RectChange()</p><p><b> {</b></p><p> //先預(yù)先變形,然后判斷變形后的方塊是否有空間,如有足夠空間,則進行實際變形,否則不變</p><p> int xx1,xx2,xx3
74、,xx4,yy1,yy2,yy3,yy4;</p><p> int m_lscurrentRect;</p><p> CString lsStr;</p><p> int x1,x2,x3,x4,y1,y2,y3,y4;</p><p> x1 = ActiveStatus[0][0];</p><p>
75、; x2 = ActiveStatus[1][0];</p><p> x3 = ActiveStatus[2][0];</p><p> x4 = ActiveStatus[3][0];</p><p> y1 = ActiveStatus[0][1];</p><p> y2 = ActiveStatus[1][1];</
76、p><p> y3 = ActiveStatus[2][1];</p><p> y4 = ActiveStatus[3][1];</p><p> //變形后位置在數(shù)組中的存放順序仍需遵循先左后右,在同一列中先上后下</p><p> xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3
77、=y3; yy4=y4;</p><p> switch(m_currentRect)</p><p><b> {</b></p><p><b> case 1:</b></p><p> xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2;
78、 yy4=y4+2;</p><p> m_lscurrentRect = 11;</p><p><b> break;</b></p><p><b> case 11:</b></p><p> xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x
79、4+2; yy4=y4-2;</p><p> m_lscurrentRect = 1;</p><p><b> break;</b></p><p><b> ……</b></p><p> //省略部分為同類實現(xiàn)的變形后小方塊坐標計算代碼</p><p><
80、;b> case 73:</b></p><p> xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1;</p><p> m_lscurrentRect = 7;</p><p><b> break;</b></p><p>
81、<b> }</b></p><p><b> //改變形狀代碼</b></p><p> m_currentRect = m_lscurrentRect;</p><p><b> }</b></p><p><b> else</b><
82、/p><p><b> {//恢復(fù)原來狀態(tài)</b></p><p> GameStatus[x1][y1] = MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x2][y2] = MAP_STATE_NOT_EMPTY;</p><p> GameStatus[x3][y3] = M
83、AP_STATE_NOT_EMPTY;</p><p> GameStatus[x4][y4] = MAP_STATE_NOT_EMPTY;</p><p><b> }</b></p><p><b> //判斷是否已到底</b></p><p> IsBottom();</p>
84、;<p><b> }</b></p><p> //繪圖設(shè)備環(huán)境的初始化</p><p> void CSkyblue_RectView::DcEnvInitial(void)</p><p><b> {</b></p><p> if(m_bFistPlay)</
85、p><p><b> {</b></p><p> m_bFistPlay = FALSE;</p><p><b> //黑色的黑筆</b></p><p> m_pBlackPen = new CPen(PS_SOLID,1,BLACK);</p><p><
86、b> //畫刷</b></p><p> m_pGrayBrush = new CBrush(RGB(66,66,66));</p><p> m_pBlackBrush = new CBrush(BLACK);</p><p><b> }</b></p><p><b> }
87、</b></p><p> void CSkyblue_RectView::DCEnvClear(void)</p><p><b> {</b></p><p><b> //設(shè)備環(huán)境</b></p><p> m_memDC.DeleteDC();</p>&l
88、t;p> m_memRectDC.DeleteDC();</p><p><b> //位圖資源</b></p><p> DeleteObject(m_memBmp);</p><p> DeleteObject(m_hMemRectBmp);</p><p> delete(m_pBlackPen);
89、</p><p> delete(m_pGrayBrush);</p><p> delete(m_pBlackBrush);</p><p><b> }</b></p><p> void CSkyblue_RectView::DrawGame(CDC *pDC)</p><p>&l
90、t;b> {</b></p><p><b> int i,j;</b></p><p> //選用黑色畫刷,繪制整個游戲所在窗口的背景</p><p> pDC -> SelectObject(m_pBlackBrush);</p><p> CRect rect;</p>
91、<p> GetClientRect(&rect);</p><p> pDC -> Rectangle(rect);</p><p> //選用灰色畫刷,繪制游戲區(qū)域的背景</p><p> pDC -> SelectObject(m_pGrayBrush);</p><p> pDC ->
92、 Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);</p><p> pDC->SelectObject(m_pBlackPen);</p><p><b> //畫網(wǎng)格線</b></p><p> if (m_bDrawGrid)</p&
93、gt;<p><b> {</b></p><p><b> //畫橫線</b></p><p> for (i=0;i<m_iRow;i++)</p><p><b> {</b></p><p> pDC->MoveTo(m_iStart
94、Y, m_iStartX + i*m_iLarge);</p><p> pDC->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);</p><p><b> }</b></p><p><b> //畫豎線</b></p><p> for
95、 (i=0;i<m_iCol;i++)</p><p><b> {</b></p><p> pDC->MoveTo(m_iStartY+i*m_iLarge, m_iStartX);</p><p> pDC->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);</p>
96、;<p><b> }</b></p><p><b> }</b></p><p> int x,y,nW,nH;</p><p><b> //小方塊的繪制</b></p><p> for (i=0;i<m_iRow;i++)</p&g
97、t;<p> for (j=0;j<m_iCol;j++)</p><p><b> {</b></p><p> if (GameStatus[i][j]==MAP_STATE_NOT_EMPTY)</p><p><b> {</b></p><p> //在游戲區(qū)
98、域中狀態(tài)為被占用狀態(tài)的區(qū)域繪制小方塊</p><p> x = m_iStartY+j*m_iLarge +2;</p><p> y = m_iStartX+i*m_iLarge +2;</p><p> nW = m_iLarge-4;</p><p> nH = m_iLarge-4;</p><p>
99、 pDC->BitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);</p><p><b> }</b></p><p><b> }</b></p><p> //畫下一次將要出現(xiàn)的方塊,用于提示用戶</p><p>
100、; if (!m_bGameEnd)</p><p><b> {</b></p><p> pDC -> SetBkColor(BLACK);</p><p> pDC -> SetTextColor(WHITE);</p><p> pDC -> TextOut(m_iStartY+320
101、, m_iStartX,"下一個方塊:");</p><p> int x,y,nW,nH;</p><p> for (UINT k=0;k<4;k++)</p><p><b> {</b></p><p> i = NextStatus[k][0];</p>&l
102、t;p> j = NextStatus[k][1];</p><p> x = m_iStartY+j*30 +2+320;</p><p> y = m_iStartX+i*30 +2+30;</p><p> nW = m_iLarge-4;</p><p> nH = m_iLarge-4;</p><
103、;p> pDC->BitBlt(x,y,nW,nH,&m_memRectDC,m_iBlockSytle*30,0,SRCCOPY);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&
104、lt;p> // 功能:承擔所有繪制屏幕工作</p><p> void CSkyblue_RectView::OnDraw(CDC* pDC)</p><p><b> {</b></p><p> DcEnvInitial();</p><p> DrawGame(&m_memDC); //
105、在內(nèi)存位圖的游戲區(qū)域繪制</p><p> pDC->BitBlt(0,0,m_nWidth,m_nHeight,&m_memDC,0,0,SRCCOPY);</p><p><b> }</b></p><p> 五、課程設(shè)計總結(jié)或結(jié)論</p><p> 在本次課程設(shè)計中,我從指導(dǎo)老師顏宏文身上學(xué)
106、到了很多東西。老師認真負責的工作態(tài)度,嚴謹?shù)闹螌W(xué)精神和深厚的理論水平都使我收益匪淺。她無論在理論上還是在實踐中,都給與我很大的幫助,使我得到不少的提高這對于我以后的工作和學(xué)習都有一種巨大的幫助,感她耐心的輔導(dǎo)。另外,在游戲開發(fā)過程中xx老師也給于我們很大的幫助,幫助解決了不少的難點,使得游戲能及時開發(fā)完成,還有所有的同學(xué)同樣給與我不少幫助,這里一并表示感謝。</p><p><b> 六、參考文獻&l
107、t;/b></p><p> [1]Ben Sawyer. 游戲軟件設(shè)計與開發(fā)指南[M].北京:人民郵電出版社,1998.8~46</p><p> [2]欽科技. Visual C++游戲設(shè)計[M]. 北京:科海電子出版社,2003.1~211</p><p> [3]坂本千尋.Visual C++專業(yè)游戲程序設(shè)計[M]. 北京:中國鐵道出版社,20
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計---用vc++實現(xiàn)俄羅斯方塊的程序設(shè)計
- 俄羅斯方塊課程設(shè)計-- 用c++實現(xiàn)的俄羅斯方塊程序設(shè)計
- vc++俄羅斯方塊課程設(shè)計報告
- 《c++俄羅斯方塊》課程設(shè)計--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計
- 課程設(shè)計---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計
- c課程設(shè)計--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計報告
- java俄羅斯方塊課程設(shè)計
- 俄羅斯方塊課程設(shè)計論文
- arm課程設(shè)計俄羅斯方塊
- 俄羅斯方塊課程設(shè)計報告
- 簡單俄羅斯方塊課程設(shè)計
- 課程設(shè)計--俄羅斯方塊設(shè)計報告
評論
0/150
提交評論