資源描述:
《保健品現(xiàn)狀及發(fā)展趨勢分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、綜合實例——俄羅斯方塊?1.問題描述屏幕中央有一個矩形容器,程序剛開始時是空的;當(dāng)鼠標單擊“開始”菜單時,矩形容器內(nèi)從上向下隨機出現(xiàn)俄羅斯方塊的部件。通過鍵盤上的左右鍵分別左右移動部件(一個單位),向上鍵順時針旋轉(zhuǎn)90度。當(dāng)部件到達容器底部或已停止的部件上時,停止;當(dāng)容器的同一行被部件填滿時,該行消失。其他行依次向下移動。計分方法:一次消去一行100分,同時消去行、3行或4行分別為300、500和900分。在適當(dāng)位置顯示當(dāng)前累計分。當(dāng)部件總行數(shù)超過矩形容器高度時,提示“游戲失敗”信息并停止。設(shè)有三個級別的游戲難度供選擇。難度越大、下落越快。?2.編程要求(1)屏幕中央有
2、一個矩形容器,選擇“開始”菜單,俄羅斯方塊的部件隨機產(chǎn)生并在容器中從上向下下落。(2)有七種標準俄羅斯方塊部件,并隨著鍵盤上的左右鍵分別左右移動,隨著鍵盤上的向上鍵分別順時針旋轉(zhuǎn)90度。(3)當(dāng)部件到達容器底部或已停止的部件上時,停止;當(dāng)同一行部件完整拼接上時,該行消失,其他行向下移動,在適當(dāng)位置顯示當(dāng)前累計分。(4)當(dāng)部件總行數(shù)超過矩形容器高度時,提示“游戲失敗”信息并停止。?3.?要點分析本題主要涉及到的知識點有:鍵盤消息、菜單、隨機函數(shù)、定時器和序列化。同時也需要有畫筆/畫刷使用,動態(tài)存儲空間的分配與回收等工作,難度偏大。該題的部件以及已經(jīng)停止的部件均用小方格來表
3、示。整個游戲區(qū)域?qū)?yīng)一個二維數(shù)組,數(shù)組為0時,表示空白,為1時表示已有方格。該數(shù)組存儲所有已經(jīng)不能再移動的部件。部件采用一維數(shù)組來表示,這些一維數(shù)組實際是一個n×n的矩陣。如表示一個方塊使用一個2×2的矩陣,實際存儲為(1,1,1,1);則表示一個長條使用一個4×4的矩陣,實際存儲為(0,1,0,0,0,1,0,0,0,1,0,0)。實際顯示的時候,先畫出已停止的方格,然后換算出正在下落的部件的正確坐標位置并將其畫出。旋轉(zhuǎn)部件時,變換存儲部件的矩陣,使其對應(yīng)為旋轉(zhuǎn)后的形態(tài)。判斷部件是否可以下落、旋轉(zhuǎn)、左移或右移時,將表示部件的數(shù)組對應(yīng)到游戲區(qū)域的二維數(shù)組中,再判斷是否允
4、許改操作。當(dāng)部件無法再動時,將部件數(shù)組中對應(yīng)項填入游戲區(qū)域?qū)?yīng)的二維數(shù)組中。使一層消失可以通過判斷游戲區(qū)域的二維數(shù)組是否某一行全為1;如果該數(shù)組的第一行有一項為1或者已沒有空白使新的部件可以加入到游戲區(qū)域中,則游戲結(jié)束。?3.解題步驟(1)首先用AppWizard生成一個名為RusBlock的SDI程序框架,其他選項均可用缺省設(shè)置。(2)在“ResourceView”中選擇Menu資源項中的菜單ID“IDB_MAINFRAME”,雙擊,增加“游戲”菜單,并在其中增加“開始”和“結(jié)束”菜單;再增加“難度”菜單,在其中添加“容易”、“普通”和“較難”菜單,如下表1,設(shè)置了菜
5、單的屬性。利用ClassWizard自動添加菜單的Command消息處理函數(shù)。?表1菜單屬性IDCaptionPromptID_GAME_START開始游戲開始ID_GAME_END結(jié)束游戲結(jié)束ID_LEVEL_EASY容易?ID_LEVEL_NORMAL普通?ID_LEVEL_HARD較難??(3)在視圖類上單擊鼠標右鍵,打開“AddWindowMessageHandler…”對話框,添加鍵盤和定時器事件。(4)完成以上工作后,即可在生成的程序框架中添加必要的代碼。源程序清單:(1)在視圖類的頭文件中定義宏、類成員變量和自定義類成員函數(shù)。#defineMAXCOM7/
6、/部件數(shù)#defineWIDE13//游戲區(qū)域?qū)?defineHIGH26//高#defineSIZE12//組成游戲區(qū)域的方格大小#defineTOP50//游戲左上角坐標#defineLEFT50#defineEASY500//游戲難度#defineNORMAL300#defineHARD200?typedefstructtagComponet{intintComID;//部件的ID號intintDimension;//存儲該部件所需的數(shù)組維數(shù)int*pintArray;//指向存儲該部件的數(shù)組}Componet;?classCRusBlockView:public
7、CView{//此處略去若干行系統(tǒng)生成的代碼private:intm_intComID;//當(dāng)前下落的部件intm_intState[HIGH][WIDE];//當(dāng)前狀態(tài)Componetm_Componets[MAXCOM];//所有部件的內(nèi)部表示intm_intScore;//分數(shù)intm_intLevel;Componetm_CurrentCom;//當(dāng)前的部件POINTptIndex;//部件數(shù)組在全局數(shù)組中的索引voidNewComponet(void);//產(chǎn)生一個新的部件boolCanDown(void);//是否還可以下落v