




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
人工智能程序設(shè)計(jì)報告俄羅斯方塊一、課程設(shè)計(jì)的目的綜合運(yùn)用所學(xué)知識,熟練掌握VC++程序設(shè)計(jì)的編碼與MFC框架結(jié)構(gòu)來完成俄羅斯方塊的設(shè)計(jì)。二、設(shè)計(jì)正文2.1問題描述屏幕中央有一個矩形容器,程序剛開始時是空的;但鼠標(biāo)單擊開始菜單時,矩形容器內(nèi)從上向下隨機(jī)出現(xiàn)俄羅斯方塊的部件。通過鍵盤的上的左右鍵分別左右移動部件(一個單位),向上鍵順時針旋轉(zhuǎn)90度。當(dāng)部件到達(dá)容器底部或已停止的部件上時,停止;當(dāng)容器的同一行被部件填滿時,該行消失。其他行依次向下移動。計(jì)分方法:一次消去一行100分,同時兩行為200分。在適當(dāng)位置顯示當(dāng)前累計(jì)分。當(dāng)部件總行數(shù)超過矩形容器高度是,顯示“游戲失敗”消息并停止。設(shè)有六個級別難度供選擇。難度越大、下落越快。2.2需求分析2.2.1游戲需求隨機(jī)給出不同的形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當(dāng)達(dá)到一定的分?jǐn)?shù)時,過關(guān),設(shè)置六關(guān),每關(guān)方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域,為輸者。游戲功能要求如下:2.2.2游戲界面需求:良好的用戶界面,有關(guān)數(shù)顯示和分?jǐn)?shù)顯示。讓方塊在一定的區(qū)域內(nèi)運(yùn)動和變形,該區(qū)域用一種顏色表明,既用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來,寬度適中,要實(shí)現(xiàn)美感。2.2.3游戲形狀(方塊)需求:良好的方塊形狀設(shè)計(jì),繪制七種常見的基本圖形(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個方塊要能實(shí)現(xiàn)它的變形,可設(shè)為順時針或逆時針變形,一般為順時針。三系統(tǒng)設(shè)計(jì)3.1創(chuàng)建界面的主框架首先建立一個項(xiàng)目工程,名為skyblue_Rect,并在AppWizard的架構(gòu)選擇過程中選擇單文檔方式,其他保持默認(rèn)選項(xiàng)。其項(xiàng)目的架構(gòu)類視圖信息如圖所示:在構(gòu)架類視圖中是MFC基本架構(gòu)組合:App(應(yīng)用程序)類、Document(文檔)類、View(視圖)類、Frame(框架)類和用于提示關(guān)于作者的對話框CAboutDIg類,至于COptionDIg類是用作俄羅斯方塊參數(shù)選擇的對話框類對象。卸skyblueRectclassesCAhsutDIg+CM&inFrame“■COptionDIg+ CSkyblueRectAppCSkyblueRectDoc+ CSkyblue_RectViev+_■Ginbals3.2正常流程的設(shè)計(jì)3.2.1定時制機(jī)制從分析游戲的特性可以知道,定時器的產(chǎn)生與生效應(yīng)該在游戲開始的時候,而在游戲暫?;蛘哂螒蚪Y(jié)束時則將已經(jīng)設(shè)定的定時器失效/銷亡(對于暫停的情況,使它銷亡,當(dāng)游戲從暫停狀態(tài)又進(jìn)入游戲狀態(tài)時候,則重新創(chuàng)建一個定時器并激活它的運(yùn)作),所以分別在游戲的開始函數(shù)、暫停函數(shù)已經(jīng)結(jié)束函數(shù)中實(shí)現(xiàn)定時器的激活與去激活工作。這里,先在資源編輯器菜單資源里面添加三個菜單選項(xiàng),分別是游戲的“開始”、“暫?!?、和“結(jié)束”,然后利用ClassWizard直接在視圖類對象Cskyblue_RectView中為它們添加空白的處理函數(shù),具體如表2所示。3.2.1菜單選項(xiàng)功能對應(yīng)表菜單選項(xiàng)名稱快捷鍵資源ID響應(yīng)處理函數(shù)開始游戲&SID_GAME_STATOnGameStart()暫停游戲&PID_GAME_PAISHOnGamePaush()結(jié)束游戲&EID_GAME_ENDOnGameEnd()3.2.2定時處理經(jīng)過定時器的設(shè)置后,這里通過利用ClassWizard跳到定時器到時候的處理函數(shù)OnTimer()去實(shí)現(xiàn),當(dāng)固定時間片間隔到達(dá)后,先檢測當(dāng)前下墜物是否已經(jīng)到達(dá)了底部,不是則進(jìn)行RectDown()下墜物向下移動一個單位的操作,是則到底后產(chǎn)生一個新的“下一個下墜物”,并代替舊的,將原先舊的“下一個下墜物”用作當(dāng)前激活狀態(tài)下正在使用的下墜物,并對使用后的一些狀態(tài)進(jìn)行檢測:是否馬上到達(dá)底部,使則進(jìn)行銷行操作
;是否在到達(dá)底部的同時到達(dá)游戲區(qū)域的頂部,從而判定游戲是否因違規(guī)而結(jié)束。圖3.2.2裝載方塊視圖類創(chuàng)建了m_icurrentStatus和m_inextStatus兩個成員變量來記錄下墜物的類型,共有七種形狀,并從7種方塊中隨機(jī)抽取圖形。而m_currentRect除了記錄下墜物的類型外,還需記錄其當(dāng)前的變形狀態(tài),最多用兩位表示,第1位用作類型標(biāo)識(1?7),第2位用作同種類型的不同表現(xiàn)方式,最多有4種狀態(tài)(1?4)。在產(chǎn)生新的下一個下墜物前,需要先將當(dāng)前狀態(tài)物的記錄和舊的下一個下墜物保存下來,然后用隨機(jī)函數(shù)Random()產(chǎn)生一個最大值不大于指定值的隨機(jī)正整數(shù),將這個新生成的正整數(shù)用作新的“下一個下墜物”的形狀值。四、系統(tǒng)實(shí)施
4.1底部到達(dá)的判斷與銷行的實(shí)現(xiàn)圖3.2.3處理方塊到達(dá)圖將新的下墜物放置到游戲區(qū)域中去,這時可能出現(xiàn)馬上到達(dá)底部的情況,因此需要對它進(jìn)行判斷,如果是到達(dá)底部,則進(jìn)行銷行處理,并且修改相應(yīng)的數(shù)據(jù)狀態(tài)。而判斷是否已經(jīng)到達(dá)了底部,可以通過當(dāng)前下墜物件所對應(yīng)的接觸面的方塊位置為被占用狀態(tài)(MAP_STATE_NOT_EMPTY=1)來確定,利用數(shù)組InterFace[74][4]記錄1?7種下墜物的1?4種形態(tài)的接觸面信息。統(tǒng)計(jì)分?jǐn)?shù):在消行處理里面有一個專門用來統(tǒng)計(jì)消行數(shù)的變量,然后根據(jù)變量的值決定分?jǐn)?shù)的多少,程序統(tǒng)計(jì)分?jǐn)?shù)是:消一行得100分,同時消2行得400分,銷掉x行,則分?jǐn)?shù)為:x*(x*100)。如果總分?jǐn)?shù)達(dá)到過關(guān)條件就過關(guān),改變游戲速度,游戲初始化,開啟新的一關(guān),然后再加載方塊。沒有達(dá)到過關(guān)分?jǐn)?shù)或者沒有滿行,則加載下一個方塊繼續(xù)游戲。4.2中斷操作流程的實(shí)現(xiàn)(1)處理鍵盤事件關(guān)于按鍵命令消息的響應(yīng),可以通過對WM_KEYDOWN消息的處理函數(shù)進(jìn)行截獲并重寫來實(shí)現(xiàn),下面是對該處理函數(shù)OnKeyDown()的重寫。//功能:處理用戶的輸入,方塊的左,右移,加速及變形voidCSkyblue_RectView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)(switch(nChar)(caseVK_LEFT:RectArrow(LEFT);break;caseVK_RIGHT:RectArrow(RIGHT);break;caseVK_UP:RectChange();break;caseVK_DOWN:RectArrow(DOWN);break;}CView::OnKeyDown(nChar,nRepCnt,nFlags);}4.3變形的實(shí)現(xiàn)當(dāng)按下向上鍵時,將會執(zhí)行方塊變化事件(change。)。常見的方塊有7種(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有圖形都是用兩個一維數(shù)組來統(tǒng)計(jì)它的橫坐標(biāo)和縱坐標(biāo),每個方塊有4種不同的變化形狀。例計(jì)算變形后的小方塊的坐標(biāo)和顯示的狀態(tài)值〃變形后位置在數(shù)組中的存放順序仍需遵循先左后右,在同一列中先上后下
xx1=x1;xx2=x2;xx3=x3;xx4=x4;yy1=y1;yy2=y2;yy3=y3;yy4=y4;switch(m_currentRect)(case1:xx1=x1+1;yy1=y1-1;xx3=x3-1;yy3=y3+1;xx4=x4-2;yy4=y4+2;m_lscurrentRect=11;break;case11:xx1=x1-1;yy1=y1+1;xx3=x3+1;yy3=y3T;xx4=x4+2;yy4=y4-2;m_lscurrentRect=1;break;〃省略部分為同類實(shí)現(xiàn)的變形后小方塊坐標(biāo)的計(jì)算代碼case73:xx2=x2+1;yy2=y2-1;xx3=x3+2;yy3=y3-2;xx4=x4T;yy4二y4T;m_lscurrentRect=7;break;}4.4游戲區(qū)域繪圖的實(shí)現(xiàn)首先將外部位圖文件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)境中,從而達(dá)到屏幕的顯示。
4.5功能的完善為了使得游戲功能更加健全,另外為用戶提供了一些附加功能,如表4.5.1所示。表4.5.1 附加功能描述列表功能名稱選項(xiàng)其他描述游戲等級選擇初級 頂級對游戲快慢難度的設(shè)定方塊圖案樣式選擇深藍(lán) 條紋對下墜物的小方塊圖案樣式選擇游戲區(qū)域大小選擇小、中、大對游戲區(qū)域的行列數(shù)選擇網(wǎng)格的選用有、無是否需要在游戲區(qū)域繪制網(wǎng)格背景音樂的選用有、無在游戲過程中是否播放背景音樂先將這些目標(biāo)功能通過資源編輯器在主菜單條進(jìn)行添加,將前面已有的菜單選項(xiàng)補(bǔ)全,再通過ClassWizard添加對應(yīng)的響應(yīng)處理函數(shù)。其最終效果如圖4.6游戲演示游戲主界面如圖所示。
4.7主程序源程序清單//skyblue_RectView.h:interfaceoftheCSkyblue_RectViewclass///////////////////////////////////////////////////////////////////////////////#if!defined(AFX_SKYBLUE_RECTVIEW_H__D33E8EC7_BE69_4161_9B54_FB14CBA27F2E__INCLUDED_)#defineAFX_SKYBLUE_RECTVIEW_H__D33E8EC7_BE69_4161_9B54_FB14CBA27F2E__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000//宏變量:白色和黑色#defineWHITERGB(255,255,255)#defineBLACKRGB(0,0,0)#defineBLUERGB(0,0,255)//中斷操作的運(yùn)動趨勢#defineLEFT0 //向左移動#defineRIGHT1 //向左移動#defineUP 2 //向上(變形)#defineDOWN3 //向下移動(加速)〃游戲區(qū)域地圖最大限制#defineMAX_ROW 100#defineMAX_COL 100//地圖的最大行數(shù)//地圖的最大列數(shù)//地圖狀態(tài)#defineMAP_STATE_#defineMAP_STATE__EMPTY_NOT_EMPTY0 //空(未被占據(jù))1 //被占據(jù)classCSkyblue_RectView:publicCView(protected://createfromserializationonlyCSkyblue_RectView();DECLARE_DYNCREATE(CSkyblue_RectView)//Attributespublic:CSkyblue_RectDoc*GetDocument();//Operationspublic://Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CSkyblue_RectView)public:virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisviewvirtualBOOLPreCreateWindow(CREATESTRUCT&cs);//}}AFX_VIRTUAL//Implementationpublic:virtual~CSkyblue_RectView();protected:intm_nWidth;//子窗口的寬度intm_nHeight;//子窗口的高度//列與行的數(shù)量intm_iCol;intm_iRow;//小方塊的大小,它會隨著行與列的不同而不同,具體為://12行10列,30個象素的正方形//18行15歹【J,20//24行20歹【J,15//30行25歹【J,12intm_iLarge;//當(dāng)前的級別,換算成速度的算法為:1500-m_iLevel*200intm_iLevel;〃當(dāng)前選擇的方塊顯示樣式intm_iBlockSytle;//游戲區(qū)域左上角的坐標(biāo)intm_iStartX;intm_iStartY;voidRectChange();BOOLIsLeftLimit(); //下墜物件是否可向左移動BOOLIsRightLitmit();〃接觸面二維數(shù)組,記錄1?7種下墜物的1?4種形態(tài)的接觸面信息〃我們把該下墜物的某種形態(tài)種的4個方塊,有接觸面則記錄方位,無則為-1標(biāo)識。intInterFace[74][4];〃當(dāng)前的方塊形狀intm_currentRect;〃判斷當(dāng)前方塊是否到底voidIsBottom();//當(dāng)前方塊下降voidRectDown();//當(dāng)前方塊加速:UP,左移:LEFT,右移:RIGHTvoidRectArrow(intm_Type);〃根據(jù)下墜物的類型映射出它的具體形態(tài)功能組//根據(jù)舊的下一下墜物映射出當(dāng)前激活狀態(tài)下的下墜物形態(tài)voidRectStatusToActiveStatus(intm_which);//根據(jù)下墜物形態(tài)映射出下一下墜物的形態(tài)voidRectStatusToNextStatus(intm_which);//將當(dāng)前的狀態(tài)映射到地圖游戲區(qū)域voidActiveStatusToGameStatus();intRandom(intMaxNumber);//標(biāo)識方塊已到底的變量,到底為TRUEBOOLm_isBottom;//用于標(biāo)志方塊狀態(tài)的數(shù)組,大小由橫格與豎格數(shù)據(jù)決定,為1表示該方塊顯示,或者不顯示//畫形狀只需要修改數(shù)組中相應(yīng)元素的狀態(tài)值即可//由時鐘控制,定時在OnPaint函數(shù)中根據(jù)數(shù)組畫方塊intGameStatus[MAX_ROW][MAX_COL];〃用于保存當(dāng)前方塊的動態(tài)位置,4個小方塊分別在大數(shù)組中的位置//存放位置為先左后右,每一列又遵循先上后下的原則intActiveStatus[4][2];//存入下一次要出來的方塊的模樣的數(shù)組intNextStatus[4][2];//Generatedmessagemapfunctionsprotected:BOOLm_bGamePaush;voidStopMid();voidPlayMid();voidCurrentAreaAndLevel();〃用于記錄當(dāng)前區(qū)域大小與當(dāng)前級別的字符串,用于顯示在屏幕上提示用戶當(dāng)前狀態(tài)CStringm_strArea;CStringm_strLevel;〃當(dāng)前的樣式,下一個將會出現(xiàn)的樣式intm_icurrentStatus;intm_inextStatus;//OnDraw中需要用到的設(shè)備名稱CPen*m_pBlackPen;CBrush*m_pGrayBrush;CBrush*m_pBlackBrush;//是否畫網(wǎng)格線BOOLm_bDrawGrid;〃是否插放背景音樂BOOLm_bMusic;
//游戲總成績intm_iPerformance;〃游戲是否已結(jié)束,為FALSE表示開始,否則為結(jié)束BOOLm_bGameEnd;〃刷新指定的區(qū)域,它的大小為:四個小方塊所在的正方形的大小voidInvalidateCurrent();//內(nèi)存繪圖設(shè)備的處理//內(nèi)存設(shè)備環(huán)境//內(nèi)存位圖//內(nèi)存設(shè)備環(huán)境//內(nèi)存位圖CDCm_memRectDC;CBitmapm_memBmp;CDCm_memRectDC;//方塊內(nèi)存設(shè)備環(huán)境HBITMAPm_hMemRectBmp;//方塊內(nèi)存位圖句柄intm_bFistPlay;voidDcEnvInitial(void);intm_bFistPlay;voidDcEnvInitial(void);voidDCEnvClear(void);voidDrawGame(CDC*pDC);//是否是第一次開始游戲////Generatedmessagemapfunctionsprotected://{{AFX_MSG(CSkyblue_RectView)afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);afx_msgvoidOnTimer(UINTnIDEvent);afx_msgvoidOnGameStart();afx_msgvoidOnGameEnd();afx_msgvoidOnGameOption();afx_msgvoidOnUpdateGameStart(CCmdUI*pCmdUI);afx_msgvoidOnUpdateGameOption(CCmdUI*pCmdUI);afx_msgvoidOnUpdateGameEnd(CCmdUI*pCmdUI);afx_msgvoidOnUpdateGameExit(CCmdUI*pCmdUI);afx_msgvoidOnUpdateHelpAbout(CCmdUI*pCmdUI);afx_msgvoidOnUpdateHelpHelp(CCmdUI*pCmdUI);afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnHelpHelp();afx_msgvoidOnUpdateOptionArea1(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionArea2(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionArea3(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionArea4(CCmdUI*pCmdUI);afx_msgvoidOnOptionArea1();afx_msgvoidOnOptionArea2();afx_msgvoidOnOptionArea3();afx_msgvoidOnOptionArea4();afx_msgvoidOnUpdateOptionLevel1(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionLevel2(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionLevel3(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionLevel4(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionLevel5(CCmdUI*pCmdUI);afx_msgvoidOnUpdateOptionLevel6(CCmdUI*pCmdUI);afx_msgvoidOnOptionLevel1();afx_msgvoidOnOptionLevel2();afx_msgvoidOnOptionLevel3();afx_msgvoidOnOptionLevel4();afx_msgvoidOnOptionLevel5();afx_msgvoidOnOptionLevel6();afx_msgvoidOnUpdateOptionGrid(CCmdUI*pCmdUI);afx_msgvoidOnOptionGrid();afx_msgvoidOnUpdateOptionMusic(CCmdUI*pCmdUI);afx_msgvoidOnOptionMusic();afx_msgvoidOnUpdateGamePaush(CCmdUI*pCmdUI
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 皖西衛(wèi)生職業(yè)學(xué)院《語言數(shù)據(jù)分析與應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 漢江師范學(xué)院《英美文學(xué)(二)》2023-2024學(xué)年第一學(xué)期期末試卷
- 衡陽師范學(xué)院南岳學(xué)院《基礎(chǔ)英語技能拓展》2023-2024學(xué)年第一學(xué)期期末試卷
- 河南科技大學(xué)《基礎(chǔ)生物學(xué)二》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025產(chǎn)品購銷合同
- 安徽無為開城中學(xué)2025年高三5月綜合測試(三模)英語試題文試題含解析
- 江蘇大學(xué)《新媒體廣告研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 電力行業(yè)交流發(fā)言
- 云南國土資源職業(yè)學(xué)院《海洋與食品生物技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖北省陽新縣興國高級中學(xué)2025年高三教學(xué)質(zhì)量統(tǒng)一檢測試題(一)化學(xué)試題含解析
- 醫(yī)務(wù)人員的肺結(jié)核防護(hù)指南與培訓(xùn)
- 二手乘用車出口檢驗(yàn)規(guī)范
- 室分系統(tǒng)培訓(xùn)材料
- 人教版高中英語選修《計(jì)算機(jī)英語》全冊課件
- 眼鏡各部件英語知識點(diǎn)梳理匯總
- 2023年江西省?;栉幕糜伟l(fā)展有限責(zé)任公司招聘筆試題庫含答案解析
- 安全風(fēng)險告知卡(一般吊裝作業(yè))
- YS/T 682-2008釕粉
- GB/T 902.3-2008儲能焊用焊接螺柱
- GB/T 18612-2011原油有機(jī)氯含量的測定
- 九年級化學(xué)第二次模擬考試質(zhì)量分析析中考化學(xué)試卷分析
評論
0/150
提交評論