人工智能程序設(shè)計(jì)報(bào)告_第1頁(yè)
人工智能程序設(shè)計(jì)報(bào)告_第2頁(yè)
人工智能程序設(shè)計(jì)報(bào)告_第3頁(yè)
人工智能程序設(shè)計(jì)報(bào)告_第4頁(yè)
人工智能程序設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

人工智能程序設(shè)計(jì)報(bào)告俄羅斯方塊一、課程設(shè)計(jì)的目的綜合運(yùn)用所學(xué)知識(shí),熟練掌握VC++程序設(shè)計(jì)的編碼與MFC框架結(jié)構(gòu)來(lái)完成俄羅斯方塊的設(shè)計(jì)。二、設(shè)計(jì)正文2.1問題描述屏幕中央有一個(gè)矩形容器,程序剛開始時(shí)是空的;但鼠標(biāo)單擊開始菜單時(shí),矩形容器內(nèi)從上向下隨機(jī)出現(xiàn)俄羅斯方塊的部件。通過(guò)鍵盤的上的左右鍵分別左右移動(dòng)部件(一個(gè)單位),向上鍵順時(shí)針旋轉(zhuǎn)90度。當(dāng)部件到達(dá)容器底部或已停止的部件上時(shí),停止;當(dāng)容器的同一行被部件填滿時(shí),該行消失。其他行依次向下移動(dòng)。計(jì)分方法:一次消去一行100分,同時(shí)兩行為200分。在適當(dāng)位置顯示當(dāng)前累計(jì)分。當(dāng)部件總行數(shù)超過(guò)矩形容器高度是,顯示“游戲失敗”消息并停止。設(shè)有六個(gè)級(jí)別難度供選擇。難度越大、下落越快。2.2需求分析2.2.1游戲需求隨機(jī)給出不同的形狀(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當(dāng)達(dá)到一定的分?jǐn)?shù)時(shí),過(guò)關(guān),設(shè)置六關(guān),每關(guān)方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域,為輸者。游戲功能要求如下:2.2.2游戲界面需求:良好的用戶界面,有關(guān)數(shù)顯示和分?jǐn)?shù)顯示。讓方塊在一定的區(qū)域內(nèi)運(yùn)動(dòng)和變形,該區(qū)域用一種顏色表明,既用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來(lái),寬度適中,要實(shí)現(xiàn)美感。2.2.3游戲形狀(方塊)需求:良好的方塊形狀設(shè)計(jì),繪制七種常見的基本圖形(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個(gè)方塊要能實(shí)現(xiàn)它的變形,可設(shè)為順時(shí)針或逆時(shí)針變形,一般為順時(shí)針。三系統(tǒng)設(shè)計(jì)3.1創(chuàng)建界面的主框架首先建立一個(gè)項(xiàng)目工程,名為skyblue_Rect,并在AppWizard的架構(gòu)選擇過(guò)程中選擇單文檔方式,其他保持默認(rèn)選項(xiàng)。其項(xiàng)目的架構(gòu)類視圖信息如圖所示:在構(gòu)架類視圖中是MFC基本架構(gòu)組合:App(應(yīng)用程序)類、Document(文檔)類、View(視圖)類、Frame(框架)類和用于提示關(guān)于作者的對(duì)話框CAboutDIg類,至于COptionDIg類是用作俄羅斯方塊參數(shù)選擇的對(duì)話框類對(duì)象。卸skyblueRectclassesCAhsutDIg+CM&inFrame“■COptionDIg+ CSkyblueRectAppCSkyblueRectDoc+ CSkyblue_RectViev+_■Ginbals3.2正常流程的設(shè)計(jì)3.2.1定時(shí)制機(jī)制從分析游戲的特性可以知道,定時(shí)器的產(chǎn)生與生效應(yīng)該在游戲開始的時(shí)候,而在游戲暫?;蛘哂螒蚪Y(jié)束時(shí)則將已經(jīng)設(shè)定的定時(shí)器失效/銷亡(對(duì)于暫停的情況,使它銷亡,當(dāng)游戲從暫停狀態(tài)又進(jìn)入游戲狀態(tài)時(shí)候,則重新創(chuàng)建一個(gè)定時(shí)器并激活它的運(yùn)作),所以分別在游戲的開始函數(shù)、暫停函數(shù)已經(jīng)結(jié)束函數(shù)中實(shí)現(xiàn)定時(shí)器的激活與去激活工作。這里,先在資源編輯器菜單資源里面添加三個(gè)菜單選項(xiàng),分別是游戲的“開始”、“暫停”、和“結(jié)束”,然后利用ClassWizard直接在視圖類對(duì)象Cskyblue_RectView中為它們添加空白的處理函數(shù),具體如表2所示。3.2.1菜單選項(xiàng)功能對(duì)應(yīng)表菜單選項(xiàng)名稱快捷鍵資源ID響應(yīng)處理函數(shù)開始游戲&SID_GAME_STATOnGameStart()暫停游戲&PID_GAME_PAISHOnGamePaush()結(jié)束游戲&EID_GAME_ENDOnGameEnd()3.2.2定時(shí)處理經(jīng)過(guò)定時(shí)器的設(shè)置后,這里通過(guò)利用ClassWizard跳到定時(shí)器到時(shí)候的處理函數(shù)OnTimer()去實(shí)現(xiàn),當(dāng)固定時(shí)間片間隔到達(dá)后,先檢測(cè)當(dāng)前下墜物是否已經(jīng)到達(dá)了底部,不是則進(jìn)行RectDown()下墜物向下移動(dòng)一個(gè)單位的操作,是則到底后產(chǎn)生一個(gè)新的“下一個(gè)下墜物”,并代替舊的,將原先舊的“下一個(gè)下墜物”用作當(dāng)前激活狀態(tài)下正在使用的下墜物,并對(duì)使用后的一些狀態(tài)進(jìn)行檢測(cè):是否馬上到達(dá)底部,使則進(jìn)行銷行操作

;是否在到達(dá)底部的同時(shí)到達(dá)游戲區(qū)域的頂部,從而判定游戲是否因違規(guī)而結(jié)束。圖3.2.2裝載方塊視圖類創(chuàng)建了m_icurrentStatus和m_inextStatus兩個(gè)成員變量來(lái)記錄下墜物的類型,共有七種形狀,并從7種方塊中隨機(jī)抽取圖形。而m_currentRect除了記錄下墜物的類型外,還需記錄其當(dāng)前的變形狀態(tài),最多用兩位表示,第1位用作類型標(biāo)識(shí)(1?7),第2位用作同種類型的不同表現(xiàn)方式,最多有4種狀態(tài)(1?4)。在產(chǎn)生新的下一個(gè)下墜物前,需要先將當(dāng)前狀態(tài)物的記錄和舊的下一個(gè)下墜物保存下來(lái),然后用隨機(jī)函數(shù)Random()產(chǎn)生一個(gè)最大值不大于指定值的隨機(jī)正整數(shù),將這個(gè)新生成的正整數(shù)用作新的“下一個(gè)下墜物”的形狀值。四、系統(tǒng)實(shí)施

4.1底部到達(dá)的判斷與銷行的實(shí)現(xiàn)圖3.2.3處理方塊到達(dá)圖將新的下墜物放置到游戲區(qū)域中去,這時(shí)可能出現(xiàn)馬上到達(dá)底部的情況,因此需要對(duì)它進(jìn)行判斷,如果是到達(dá)底部,則進(jìn)行銷行處理,并且修改相應(yīng)的數(shù)據(jù)狀態(tài)。而判斷是否已經(jīng)到達(dá)了底部,可以通過(guò)當(dāng)前下墜物件所對(duì)應(yīng)的接觸面的方塊位置為被占用狀態(tài)(MAP_STATE_NOT_EMPTY=1)來(lái)確定,利用數(shù)組InterFace[74][4]記錄1?7種下墜物的1?4種形態(tài)的接觸面信息。統(tǒng)計(jì)分?jǐn)?shù):在消行處理里面有一個(gè)專門用來(lái)統(tǒng)計(jì)消行數(shù)的變量,然后根據(jù)變量的值決定分?jǐn)?shù)的多少,程序統(tǒng)計(jì)分?jǐn)?shù)是:消一行得100分,同時(shí)消2行得400分,銷掉x行,則分?jǐn)?shù)為:x*(x*100)。如果總分?jǐn)?shù)達(dá)到過(guò)關(guān)條件就過(guò)關(guān),改變游戲速度,游戲初始化,開啟新的一關(guān),然后再加載方塊。沒有達(dá)到過(guò)關(guān)分?jǐn)?shù)或者沒有滿行,則加載下一個(gè)方塊繼續(xù)游戲。4.2中斷操作流程的實(shí)現(xiàn)(1)處理鍵盤事件關(guān)于按鍵命令消息的響應(yīng),可以通過(guò)對(duì)WM_KEYDOWN消息的處理函數(shù)進(jìn)行截獲并重寫來(lái)實(shí)現(xiàn),下面是對(duì)該處理函數(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)按下向上鍵時(shí),將會(huì)執(zhí)行方塊變化事件(change。)。常見的方塊有7種(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型),所有圖形都是用兩個(gè)一維數(shù)組來(lái)統(tǒng)計(jì)它的橫坐標(biāo)和縱坐標(biāo),每個(gè)方塊有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中的位圖動(dòng)態(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ū)域用指定的小方塊圖樣類型來(lái)填充,然后將已經(jīng)繪制好的游戲區(qū)域圖像一次性的拷貝到與屏幕關(guān)聯(lián)的設(shè)備環(huán)境中,從而達(dá)到屏幕的顯示。

4.5功能的完善為了使得游戲功能更加健全,另外為用戶提供了一些附加功能,如表4.5.1所示。表4.5.1 附加功能描述列表功能名稱選項(xiàng)其他描述游戲等級(jí)選擇初級(jí) 頂級(jí)對(duì)游戲快慢難度的設(shè)定方塊圖案樣式選擇深藍(lán) 條紋對(duì)下墜物的小方塊圖案樣式選擇游戲區(qū)域大小選擇小、中、大對(duì)游戲區(qū)域的行列數(shù)選擇網(wǎng)格的選用有、無(wú)是否需要在游戲區(qū)域繪制網(wǎng)格背景音樂的選用有、無(wú)在游戲過(guò)程中是否播放背景音樂先將這些目標(biāo)功能通過(guò)資源編輯器在主菜單條進(jìn)行添加,將前面已有的菜單選項(xiàng)補(bǔ)全,再通過(guò)ClassWizard添加對(duì)應(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)動(dòng)趨勢(shì)#defineLEFT0 //向左移動(dòng)#defineRIGHT1 //向左移動(dòng)#defineUP 2 //向上(變形)#defineDOWN3 //向下移動(dòng)(加速)〃游戲區(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;//小方塊的大小,它會(huì)隨著行與列的不同而不同,具體為://12行10列,30個(gè)象素的正方形//18行15歹【J,20//24行20歹【J,15//30行25歹【J,12intm_iLarge;//當(dāng)前的級(jí)別,換算成速度的算法為:1500-m_iLevel*200intm_iLevel;〃當(dāng)前選擇的方塊顯示樣式intm_iBlockSytle;//游戲區(qū)域左上角的坐標(biāo)intm_iStartX;intm_iStartY;voidRectChange();BOOLIsLeftLimit(); //下墜物件是否可向左移動(dòng)BOOLIsRightLitmit();〃接觸面二維數(shù)組,記錄1?7種下墜物的1?4種形態(tài)的接觸面信息〃我們把該下墜物的某種形態(tài)種的4個(gè)方塊,有接觸面則記錄方位,無(wú)則為-1標(biāo)識(shí)。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)識(shí)方塊已到底的變量,到底為TRUEBOOLm_isBottom;//用于標(biāo)志方塊狀態(tài)的數(shù)組,大小由橫格與豎格數(shù)據(jù)決定,為1表示該方塊顯示,或者不顯示//畫形狀只需要修改數(shù)組中相應(yīng)元素的狀態(tài)值即可//由時(shí)鐘控制,定時(shí)在OnPaint函數(shù)中根據(jù)數(shù)組畫方塊intGameStatus[MAX_ROW][MAX_COL];〃用于保存當(dāng)前方塊的動(dòng)態(tài)位置,4個(gè)小方塊分別在大數(shù)組中的位置//存放位置為先左后右,每一列又遵循先上后下的原則intActiveStatus[4][2];//存入下一次要出來(lái)的方塊的模樣的數(shù)組intNextStatus[4][2];//Generatedmessagemapfunctionsprotected:BOOLm_bGamePaush;voidStopMid();voidPlayMid();voidCurrentAreaAndLevel();〃用于記錄當(dāng)前區(qū)域大小與當(dāng)前級(jí)別的字符串,用于顯示在屏幕上提示用戶當(dāng)前狀態(tài)CStringm_strArea;CStringm_strLevel;〃當(dāng)前的樣式,下一個(gè)將會(huì)出現(xiàn)的樣式intm_icurrentStatus;intm_inextStatus;//OnDraw中需要用到的設(shè)備名稱CPen*m_pBlackPen;CBrush*m_pGrayBrush;CBrush*m_pBlackBrush;//是否畫網(wǎng)格線BOOLm_bDrawGrid;〃是否插放背景音樂BOOLm_bMusic;

//游戲總成績(jī)intm_iPerformance;〃游戲是否已結(jié)束,為FALSE表示開始,否則為結(jié)束BOOLm_bGameEnd;〃刷新指定的區(qū)域,它的大小為:四個(gè)小方塊所在的正方形的大小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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論