版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
hhhhhh畢業(yè)設(shè)計(jì)(論文)正文題目俄羅斯方塊游戲?qū)I(yè)班級(jí)姓名學(xué)號(hào)指導(dǎo)教師職稱hhhhhh俄羅斯方塊游戲摘要:在現(xiàn)代信息高速發(fā)展的時(shí)代,電子游戲已經(jīng)深入了人們的日常生活,成為了老少咸宜的娛樂方式,但是游戲設(shè)計(jì)結(jié)合了日新月異的技術(shù),在一個(gè)產(chǎn)品中整合了復(fù)雜的藝術(shù),設(shè)計(jì),聲音和軟件,所以并不是人人皆知,直到今天,在中國(guó)從事游戲設(shè)計(jì)的人仍然很少,但是游戲行業(yè)的發(fā)展之快,遠(yuǎn)超如汽車,家電等傳統(tǒng)行業(yè),也正因?yàn)槿绱?,游戲人才的教育培養(yǎng)遠(yuǎn)落后于行業(yè)的發(fā)展。俄羅斯方塊是一個(gè)老少咸宜的小游戲,它實(shí)現(xiàn)有四個(gè)正方形的色塊組成,然后存儲(chǔ)于一個(gè)數(shù)組的四個(gè)元素中,計(jì)算機(jī)隨機(jī)產(chǎn)生七種不同類型的方塊,根據(jù)計(jì)算機(jī)時(shí)鐘控制它在一定的時(shí)間不停的產(chǎn)生,用戶根據(jù)鍵盤的四個(gè)方向鍵進(jìn)行向左,向右,向下,翻轉(zhuǎn)操作。然后程序根據(jù)這七種方塊折疊成各種不同的類型。論文描述了游戲開發(fā)的背景,意義,算法分析,功能實(shí)現(xiàn),功能測(cè)試。以C++為開發(fā)語(yǔ)言進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。關(guān)鍵詞:電子游戲,算法,C++,測(cè)試hhhhhhTheRussiansquarepieceAbstract:Intheeraofhigh-speeddevelopmentofelectronicofinformation,computergamehasenterpeople’sdailylife,becomeanamusementadapttooldandyoung.Butgamedesignisacombinationoffast-movingtechnology,thecomplexityofintegratingdesign,art,audioandsoftwareintoasingleproduction,sothisthechnologyisn’tknownbyeveryone.up-to-date,therearefewpeopleworkatgamedesignallthesame,whereas,thedevelopmentofgameindustrymorefasterthantraditionalindustryashomeappliancesandautomobile,bythereasonofthissituation,theeducationandtrainingofpersonwithablityofgamedesigndropbehindthedevelopmentofgameindustry.TheRussiansquarepieceisaget-awaydramawithallproperoldyoung,itcarryouttobeconstitutebyfourpiecesofcoloursofexactsquarepiece,thensaveinonefourchemicalelementsofthepieceset,randomcreationdissimilarityofcalculatorseventhesquarepieceofthecategorytype,controlitaccordingtothecalculatorclockincertaintimecontinuouslycreation,thecustomerisinsideoutaccordingtofourdirectionskeycontrolofthekeyboard,toleft,rightwardsandgetdown,(therealizationofthecontrolkeyistobecarryoutbytheeventhandingofthedirectionkeyofthekeyboard)Thentheprocedurepiledsaccordingtothesesevenkindsofsquarepiecesvariousdifferentmodel.Thethesishasdescribedthegamehistory,hasdevelopedthisgamehistory,hasdevelopedthisgameenvironment,developmentsignificanceofgame.Knowledgeabidingbyasoftwareengineering,definitionbeginsfromsoftwareproblem,proceedtocarryoutfeasibilitystudy,needanalysis,essentialsdesign,theatlasthascarriedoutatestingonthesoftwareengineeringknowledgehierarchy.ThecomputergamesdesignandpracticearedesignedoeclipsedevelopingplatformwithC++developinginstrument,underMicrosoftWindowsXPsystemthistime.KeyWords:electronicgamecalculatewayC++testhhhhhh目錄1引言 11.1課題背景 11.2畢設(shè)意義 22需求與算法分析 32.1需求分析 32.1.1游戲需求 32.1.2游戲界面需求 42.1.3游戲形狀(方塊)需求 42.2算法分析 52.2.1定義方塊的數(shù)據(jù)結(jié)構(gòu) 52.2.2俄羅斯方塊流程 53系統(tǒng)功能實(shí)現(xiàn) 73.1產(chǎn)生主窗口 73.2定義俄羅斯方塊數(shù)據(jù)結(jié)構(gòu) 83.3游戲的主邏輯 93.4銷行功能實(shí)現(xiàn) 113.5中斷操作流程的實(shí)現(xiàn) 133.6變形的實(shí)現(xiàn) 153.7游戲區(qū)域繪圖的實(shí)現(xiàn) 163.8游戲方塊繪制 203.9煙花燃放功能 224功能測(cè)試 244.1測(cè)試環(huán)境 244.2圖像功能測(cè)試 244.3銷行和計(jì)分功能測(cè)試 274.4速度功能測(cè)試 285總結(jié) 29[參考文獻(xiàn)] 30致謝 31hhhhhh俄羅斯方塊的程序設(shè)計(jì)1引言計(jì)算機(jī)游戲產(chǎn)業(yè)在隨著網(wǎng)絡(luò)的發(fā)展有了長(zhǎng)足的發(fā)展。游戲最早起源于純文字的交互游戲MUD,MUD是英文Multi-userDungeons的縮寫。純文字交互,顧名思義,是一純文字的形式來(lái)進(jìn)行游戲。即,所有的場(chǎng)景描述、物品的樣子、所有人的行動(dòng)、時(shí)間的描述都是用文字的方式表達(dá)的??傊?,文字MUD是一個(gè)很需要想象力的游戲形式,需要從文字轉(zhuǎn)化成玩家自己腦海中的現(xiàn)實(shí)場(chǎng)景。隨著電子元器件的發(fā)展,電子產(chǎn)品迅速發(fā)展。掌上游戲機(jī)和電視游戲機(jī)在80年代和90年代風(fēng)靡一時(shí),此時(shí)由蘇聯(lián)人AlexPajitnov制作的游戲俄羅斯方塊在掌上游戲機(jī)和電視游戲機(jī)上流行,其造成的轟動(dòng)和經(jīng)濟(jì)價(jià)值成為游戲史上的大事。所以本文通過(guò)用C++實(shí)現(xiàn)俄羅斯方塊學(xué)習(xí)游戲的整個(gè)設(shè)計(jì)和測(cè)試過(guò)程,學(xué)習(xí)用基于Windows的游戲程序設(shè)計(jì)。1.1課題背景俄羅斯方塊是個(gè)老幼皆宜的小游戲,它實(shí)現(xiàn)由四塊正方形的色塊組成,然后存儲(chǔ)在一個(gè)數(shù)組的四個(gè)元素中,計(jì)算機(jī)隨機(jī)產(chǎn)生不同七種類型的方塊,根據(jù)計(jì)算機(jī)時(shí)鐘控制它在一定的時(shí)間不停的產(chǎn)生,用戶根據(jù)鍵盤的四個(gè)方向鍵控制翻轉(zhuǎn)、向左、向右和向下操作,(控制鍵的實(shí)現(xiàn)是由鍵盤的方向鍵的消息函數(shù)實(shí)現(xiàn))。然后程序根據(jù)這七種方塊堆疊成各種不同的模型?;赪indows的游戲設(shè)計(jì)有很多方式,如基于java跨平臺(tái)的設(shè)計(jì),基于.net平臺(tái)的設(shè)計(jì)和基于MFC的設(shè)計(jì),三種設(shè)計(jì)各有優(yōu)缺。基于java的設(shè)計(jì)能夠充分運(yùn)用java跨平臺(tái)的特性,便于移植,可以做到一次代碼在不同環(huán)境下的運(yùn)行,從而大大提高可移植性,便于在移動(dòng)設(shè)備上運(yùn)行,但是基于java的設(shè)計(jì)由于運(yùn)行在虛擬機(jī)上,效率比較低。基于.net平臺(tái)的設(shè)計(jì)可以利用.net平臺(tái)提高的接口大大簡(jiǎn)化設(shè)計(jì)過(guò)程,然而其通用性不好,需要.net平臺(tái)支持,在執(zhí)行效率上也不如MFC程序。基于MFC的程序設(shè)計(jì)具有執(zhí)行高效的特點(diǎn),跟windows的契合比較好,但不具有跨平臺(tái)能力。相比三種設(shè)計(jì)方案,為了能夠在Windows平臺(tái)上以更好的性能運(yùn)行,本文采用VC++基于MFC的設(shè)計(jì),來(lái)完成俄羅斯方塊的游戲。hhhhhh1.2畢設(shè)意義此次畢設(shè)通過(guò)用C++設(shè)計(jì)與實(shí)現(xiàn)俄羅斯方塊游戲。包括系統(tǒng)的需求分析;系統(tǒng)總框圖及每個(gè)模塊的設(shè)計(jì)分析;MFC應(yīng)用程序架構(gòu);框架的擴(kuò)展;算法的設(shè)計(jì)與實(shí)現(xiàn);游戲的內(nèi)部實(shí)現(xiàn);游戲區(qū)域繪圖的實(shí)現(xiàn);系統(tǒng)存在的問題及錯(cuò)誤處理;以及游戲的測(cè)試和改進(jìn)。通過(guò)此次畢業(yè)設(shè)計(jì),我對(duì)軟件設(shè)計(jì)的過(guò)程有了清晰的認(rèn)識(shí),通過(guò)編寫游戲的各個(gè)方面工作學(xué)習(xí)了設(shè)計(jì)思想,程序架構(gòu),數(shù)據(jù)結(jié)構(gòu)和算法,同時(shí)也對(duì)windows程序設(shè)計(jì)特別是基于MFC的程序設(shè)計(jì)有了直觀的認(rèn)識(shí)。通過(guò)游戲的測(cè)試學(xué)習(xí)到了常用的測(cè)試過(guò)程,測(cè)試方法。hhhhhh2需求與算法分析2.1需求分析2.1.1游戲需求功能性需求如下:隨機(jī)給出不同的形狀(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,若同時(shí)消去兩行以上則會(huì)放煙花來(lái)慶祝,游戲可以設(shè)置難度,難度主要由方塊的下降速度決定,下降速度越大難度越大,若在游戲中各形狀填滿了給定區(qū)域,為輸者。如下表(表2.1)為游戲功能性需求表。功能簡(jiǎn)介順時(shí)針旋轉(zhuǎn)順時(shí)針旋轉(zhuǎn)轉(zhuǎn)塊逆時(shí)針旋轉(zhuǎn)逆時(shí)針旋轉(zhuǎn)轉(zhuǎn)塊繪制轉(zhuǎn)塊指定畫板上繪制轉(zhuǎn)塊擦除矩形指定畫板上擦除矩形右移動(dòng)右移動(dòng)轉(zhuǎn)塊左移動(dòng)左移動(dòng)轉(zhuǎn)塊下移動(dòng)下移動(dòng)轉(zhuǎn)塊丟下轉(zhuǎn)塊在畫板上丟下轉(zhuǎn)塊燃放煙花在面板內(nèi)根據(jù)一次得分多少燃放煙花計(jì)分根據(jù)用戶消去的行數(shù)計(jì)分表2.1示例作為玩家,玩家可以控制難度,查看幫助等,對(duì)于操作性的需求如下:◆
玩家可以自己來(lái)控制方塊下落的速度。◆
玩家可以自己來(lái)控制游戲的難度?!?/p>
玩家可以看到游戲的積分?!?/p>
對(duì)本游戲有幫助說(shuō)明和作者介紹等hhhhhh2.1.2游戲界面需求良好的用戶界面,有提示顯示和分?jǐn)?shù)顯示。讓方塊在一定的區(qū)域內(nèi)運(yùn)動(dòng)和變形,該區(qū)域用一種顏色表明,即用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來(lái),寬度適中,要實(shí)現(xiàn)美感。將整體界面分為三部分:左側(cè)半部分用來(lái)存放俄羅斯方塊,是游戲的活動(dòng)區(qū),用戶操作的圖形變化在這個(gè)主界面區(qū)完成。右上側(cè)部分顯示下一次要產(chǎn)生的俄羅斯方塊形狀,以便用戶預(yù)先知道,增加游戲的可玩性。右側(cè)下半部分用來(lái)顯示用戶的分?jǐn)?shù)和當(dāng)前等級(jí),以便讓用戶有成就感增加可玩性。如圖為整體的界面設(shè)計(jì)需求效果,將整個(gè)界面分成了三部分,顯得簡(jiǎn)易清爽,作為用戶界面讓玩家感覺比較舒服得體。如圖2.1所示:圖2.1示例2.1.3游戲形狀(方塊)需求良好的方塊形狀設(shè)計(jì),繪制七種常見的基本圖形(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個(gè)方塊要能實(shí)現(xiàn)它的變形,可設(shè)為順時(shí)針或逆時(shí)針變形,一般為逆時(shí)針。hhhhhh為了使游戲更加美觀更具可玩性,在繪制方塊的過(guò)程中不采用默認(rèn)的繪制方式,而是用經(jīng)過(guò)處理的圖片效果,這樣讓組成的方塊更加美觀,同時(shí)彩色的方塊也讓人賞心悅目,增加了游戲的可玩性。下圖(圖2.2)就是用來(lái)拼接方塊顏色的樣板色。圖2.2示例由圖可見這種帶有實(shí)體效果的方塊比一般的二維方塊更具立體效果,更美觀,會(huì)更吸引玩家。2.2算法分析2.2.1定義方塊的數(shù)據(jù)結(jié)構(gòu)對(duì)于方塊在某一瞬間的位置標(biāo)識(shí),我們采用一個(gè)4×2的小數(shù)組標(biāo)識(shí)出來(lái),即用4個(gè)存儲(chǔ)單位空間存儲(chǔ)當(dāng)前下墜物的每一子塊的位置,也就是說(shuō),用4個(gè)存儲(chǔ)單位空間存儲(chǔ)當(dāng)前下墜物的每一子塊的位置來(lái)對(duì)整個(gè)下墜物件的位置進(jìn)行標(biāo)識(shí),而每個(gè)存儲(chǔ)空間的大小就是一個(gè)典的坐標(biāo)值(x,y),而每個(gè)方塊按照從左到右的方式進(jìn)行編號(hào),并且在編號(hào)過(guò)程中對(duì)于同一列的方塊實(shí)行從上到下進(jìn)行編號(hào)。如圖2.3所示:(x0,y0)(x1,y1)(x2,y2)(x3,y3)2301(x0,y0)(x1,y1)(x2,y2)(x3,y3)0123
方塊編號(hào)圖2.3示例方塊表示方法,即四個(gè)小方塊的坐標(biāo)設(shè)定:其中一個(gè)方塊是原點(diǎn),坐標(biāo)為(0,0);右側(cè)方塊坐標(biāo)(1,0),下面的方塊坐標(biāo)(0,1),以此類推。如下為程序中定義的各種方塊的數(shù)據(jù)結(jié)構(gòu)定義。hhhhhh2.2.2俄羅斯方塊流程俄羅斯方塊流程(圖2.4):到達(dá)底部到達(dá)底部游戲結(jié)束到達(dá)底部結(jié)束銷行操作生成下一個(gè)下墜物將新生的下墜物代替舊的“下一個(gè)下墜物“將舊的“下一個(gè)下墜物”用作當(dāng)前下墜物銷行操作游戲結(jié)束處理下降一個(gè)單位開始圖2.4示例hhhhhh如圖中所示是俄羅斯方塊的處理流程,從開始判斷是否到底底部,到達(dá)則做銷行操作,然后生成下一個(gè)下墜物,將新的下墜物代替舊的下一個(gè)下墜物,將舊的下墜物當(dāng)做當(dāng)前的下墜物,下到底部判斷是否做銷行操作,然后判斷游戲是否結(jié)束,未結(jié)束則繼續(xù)新一輪的生產(chǎn)方塊,若方塊達(dá)到了頂部,占滿了空間則游戲結(jié)束。hhhhhh3系統(tǒng)功能實(shí)現(xiàn)3.1產(chǎn)生主窗口通過(guò)InitInstance函數(shù)來(lái)初始化窗口的各個(gè)信息,包括窗口的位置,位圖信息按鈕和時(shí)鐘初始化等。InitInstance函數(shù)的實(shí)現(xiàn)如下,程序首先調(diào)用CreatWindow函數(shù)創(chuàng)建初始窗口句柄,然后設(shè)置窗口顯示坐標(biāo),將窗口居中,用空的位圖來(lái)初始化使界面內(nèi)都是是空的。定義好窗口和時(shí)鐘最后講窗口顯示出來(lái)。BOOLInitInstance(HINSTANCEhInstance,intnCmdShow){ HWNDhWnd; intx,y; hInst=hInstance;//Storeinstancehandleinourglobalvariable hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL); if(!hWnd) { returnFALSE; } //窗口居中,高度包含標(biāo)題欄的30 x=GetSystemMetrics(SM_CXSCREEN); y=GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd,(x-GAMEWIDTH)/2,(y-GAMEHEIGHT-30)/2,GAMEWIDTH,GAMEHEIGHT+30,false); //設(shè)置dc hdcwindow=GetDC(hWnd); hdcmem=CreateCompatibleDC(hdcwindow); hdccanvas=CreateCompatibleDC(hdcwindow); //用空位圖初始化DC hmapnull=CreateCompatibleBitmap(hdcwindow,GAMEWIDTH,GAMEHEIGHT); SelectObject(hdccanvas,hmapnull); SelectObject(hdcmem,hmapnull); //位圖初始化 bmStart.Init(hInstance,IDB_BITMAP_START); bmStart.SetDevice(hdccanvas,hdcmem); bmStart.InitSizeList(1,PICW,PICH); bmBack.Init(hInstance,IDB_BITMAP_BACK); bmBack.SetDevice(hdccanvas,hdcmem);hhhhhh bmBack.InitSizeList(1,200,200); bmSquare.Init(hInstance,IDB_BITMAP_SQUARE); bmSquare.SetDevice(hdccanvas,hdcmem); bmSquare.InitSizeList(5,22,22); bmBomb.Init(hInstance,IDB_BITMAP_BOMB); bmBomb.SetDevice(hdccanvas,hdcmem); bmBomb.InitSizeList(5,22,22,1); //按鈕 mybutton.Init(hInstance,IDB_BITMAP_BUTTON); mybutton.SetDevice(hdccanvas,hdcmem); mybutton.InitButton(6,BtRect);//按鈕 myclock.Init(hWnd,TIME_INFO);//時(shí)鐘 srand((unsigned)time(NULL));//初始化隨機(jī)函數(shù) ////////////顯示窗口 ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); returnTRUE;}3.2定義俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)俄羅斯方塊通過(guò)坐標(biāo)來(lái)實(shí)現(xiàn),其數(shù)據(jù)結(jié)構(gòu)如下://每四個(gè)點(diǎn),表示一種方塊//(一維,二維都可以做)POINTgl_square[28]={ //方形 {0,0},{1,0},{0,1},{1,1}, //長(zhǎng)條 {0,-1},{0,0},{0,1},{0,2}, //Z {-1,-1},{0,-1},{0,0},{1,0}, //Z {-1,1},{0,1},{0,0},{1,0}, //L {-1,-1},{-1,0},{0,0},{1,0}, //L {-1,0},{0,0},{1,0},{1,-1}, // {-1,0},{0,0},{1,0},{0,-1},};hhhhhh3.3游戲的主邏輯將新的下墜物放置到游戲區(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)來(lái)確定,利用數(shù)組記錄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ù)是:消一行得10分,同時(shí)消2行得30分,消得3行得60分,消得4行得100分。如果總分?jǐn)?shù)達(dá)到過(guò)關(guān)條件就過(guò)關(guān),改變游戲速度。沒有達(dá)到過(guò)關(guān)分?jǐn)?shù)或者沒有滿行,則加載下一個(gè)方塊繼續(xù)游戲。如圖3.1所示:是是否堆積方塊,判斷接觸面狀態(tài)及是否得分2.統(tǒng)計(jì)分?jǐn)?shù)判斷是否過(guò)關(guān)關(guān)數(shù)增加,游戲速度將變快。調(diào)用游戲速度模塊增加游戲速度視圖重繪(InvalidateView())1.判斷行滿、處理銷行、堆積方塊向下移動(dòng)圖3.1示例hhhhhh以下為實(shí)際代碼中游戲的主要邏輯檢測(cè)函數(shù)Checkgame的代碼部分,根據(jù)系統(tǒng)的狀態(tài)確定是否生產(chǎn)新的方塊還是移動(dòng)當(dāng)前方塊直到其落到底部判斷是否該銷行,進(jìn)行下次的循環(huán)。if(INVALID==squareNow.id) { //如果沒有當(dāng)前移動(dòng)的方塊 //生成當(dāng)前方塊 memcpy(&squareNow,&squareNext,sizeof(squareNext)); squareNow.pos.x=4; squareNow.pos.y=0; iTime=0; if(!CanMove()) { //如果新生成的方塊無(wú)法移動(dòng),失敗 iState=GAME_FAIL; myclock.ReStart(TIME_FAIL); } //生成下一個(gè) CreateNext(); } else { //移動(dòng)當(dāng)前方塊 iTime++; if(iTime>=12-iSpeed) { iTime=0; if(!CanMove())hhhhhh { //清除當(dāng)前方塊 squareNow.id=INVALID; //寫入數(shù)組 PutSpare(); } else { squareNow.pos.y++; } } }3.4銷行功能實(shí)現(xiàn)當(dāng)俄羅斯方塊占滿了空間內(nèi)的一塊或者多行時(shí),系統(tǒng)就該消去一行,同時(shí)給用戶相應(yīng)的得分,當(dāng)用戶得分達(dá)到20分以上時(shí)則根據(jù)分?jǐn)?shù)等級(jí)給予用戶煙花表演以示鼓勵(lì)。用戶游戲空間有19行,10列,每次判斷銷行時(shí)從最低行開始判斷是否十列都被俄羅斯方塊填滿,填滿則清楚該行然后循環(huán)判斷。其代碼如下。voidGAMEBOX::ClearRow(){ inti; intm,n;//行列 intiNum; intiScoreRow[]={0,10,30,60,100};//分值,1行10分,2行30,3行60,4行100 intiRow;//消去多少行 iRow=0; //第19行,是最底一行 for(m=19;m>0;m--)hhhhhh { iNum=0; for(n=0;n<10;n++) { iNum+=gamemap[m][n]; } //消去一行 if(iNum==10) { iRow++;//統(tǒng)計(jì)消去多少行 for(i=m;i>0;i--) { //移動(dòng) memcpy(gamemap[i],gamemap[i-1],10*sizeof(int)); } memset(gamemap[0],0,10*sizeof(int)); m++;//重要,再次檢測(cè)這一行 } if(iNum==0) { //空行,不再判斷 break; } }//以下代碼會(huì)根據(jù)消去的行數(shù),判斷是否然后煙花,以及燃放煙花的級(jí)數(shù)。 iScore+=iScoreRow[iRow];//增加分?jǐn)?shù) if(iRow>=2) { //消除兩行以上hhhhhh BeginBomb(iRow); }}3.5中斷操作流程的實(shí)現(xiàn)處理鍵盤事件關(guān)于按鍵命令消息的響應(yīng),可以通過(guò)對(duì)WM_KEYDOWN消息的處理函數(shù)進(jìn)行截獲并重寫來(lái)實(shí)現(xiàn),下面是對(duì)該處理函數(shù)KeyProc。根據(jù)輸入的字符選擇適當(dāng)?shù)牟僮?。voidGAMEBOX::KeyProc(intiKey){ //只有游戲進(jìn)行中,才響應(yīng)按鍵 if(iState!=GAME_IN) return; switch(iKey) { caseVK_UP: Rotate(); break; caseVK_LEFT: MoveLeft(); break; caseVK_RIGHT: MoveRight(); break; caseVK_DOWN:hhhhhh MoveDown(); break;以上就是在輸入上下左右鍵時(shí)要做的操作,程序會(huì)根據(jù)鍵盤輸入選擇是向哪移動(dòng)。以下為一些功能鍵輸入后的反應(yīng),如輸入F2可燃放2級(jí)的煙花,輸入F3可燃放3級(jí)煙花,輸入F4可燃放4級(jí)煙花。按F12可以加快游戲的速度,按ESC可以退回到主菜單然后退出游戲。 caseKEY_F2: BeginBomb(2); break; caseKEY_F3: BeginBomb(3); break; caseKEY_F4: BeginBomb(4); break; caseKEY_F12: if(iSpeed<9) { iSpeed++; } break; caseVK_ESCAPE: iState=GAME_MENU; break; default:hhhhhh break; }}3.6變形的實(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種不同的變化形狀。voidGAMEBOX::Rotate(){ inti; intm,n;//行列 intiCan=1; inttemp; //正方形不旋轉(zhuǎn) if(ID_SQAURE==squareNow.id) return; for(i=0;i<4;i++) { //旋轉(zhuǎn)后的小塊坐標(biāo) //旋轉(zhuǎn)公式(x,y)旋轉(zhuǎn)90度變?yōu)?-y,x),再加上當(dāng)前位置 m=squareNow.pos.y+squareNow.chip[i].x; n=squareNow.pos.x-squareNow.chip[i].y; if(n<0||n>9 ||m<0||m>19 ||VALID==gamemap[m][n]) { iCan=0;hhhhhh break; } } if(iCan) { for(i=0;i<4;i++) { temp=squareNow.chip[i].x; //旋轉(zhuǎn)后的小塊坐標(biāo) squareNow.chip[i].x=-squareNow.chip[i].y; squareNow.chip[i].y=temp; } }}3.7游戲區(qū)域繪圖的實(shí)現(xiàn)首先將外部位圖文件square.bmp中的位圖動(dòng)態(tài)導(dǎo)入(映射)到內(nèi)存位圖里面,根據(jù)游戲區(qū)域中的二維數(shù)組中的內(nèi)部數(shù)據(jù)將所有數(shù)據(jù)狀態(tài)中為被占用狀態(tài)的小方塊區(qū)域用指定的小方塊圖樣類型來(lái)填充,然后將已經(jīng)繪制好的游戲區(qū)域圖像一次性的拷貝到與屏幕關(guān)聯(lián)的設(shè)備環(huán)境中,從而達(dá)到屏幕的顯示。程序中通過(guò)MYBITMAP類來(lái)實(shí)現(xiàn)游戲區(qū)域的繪圖工作,以下代碼為MYBITMAP類中顯示函數(shù)Show和ShowNoBack函數(shù)。voidMYBITMAP::Show(intid,intx,inty){ SelectObject(hdcsrc,hBm); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id],SRCCOPY); }hhhhhhvoidMYBITMAP::ShowNoBack(intid,intx,inty){ SelectObject(hdcsrc,hBm); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id]+hlist[id],SRCAND); BitBlt(hdcdest,x,y,wlist[id],hlist[id], hdcsrc,0,ylist[id],SRCPAINT);}游戲的主要邏輯類GAMEBOX中定義了游戲的基本數(shù)據(jù)狀態(tài)結(jié)構(gòu),用來(lái)定義游戲的顯示狀態(tài),游戲中根據(jù)顯示狀態(tài)的不同顯示不同的界面程序。//游戲數(shù)據(jù)//基本數(shù)據(jù)enumeGameState{ GAME_INFO, GAME_MENU, GAME_MENU_HELP, GAME_MENU_SET, GAME_LOAD, GAME_IN_PRE, GAME_IN, GAME_WIN, GAME_ITEM, GAME_FAIL, GAME_PASS};根據(jù)上面定義的游戲狀態(tài)值,在GAMEBOX類中用類方法Show來(lái)顯示不同狀態(tài)下的程序,其具體實(shí)現(xiàn)如下,程序用Switch語(yǔ)句判斷當(dāng)前的狀態(tài)值,然后根據(jù)狀態(tài)進(jìn)行相應(yīng)的操作。hhhhhhvoidGAMEBOX::Show(){ inti; switch(iState) { caseGAME_INFO: //黑色背景 SelectObject(hdccanvas,hBrush); SelectObject(hdccanvas,hPen); Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); bmStart.Stretch(PIC0,30,100,GAMEWIDTH-60,GAMEHEIGHT-200); //第一秒從左至右顯示圖片 if(iAni<=25) { i=25-iAni; Rectangle(hdccanvas,GAMEWIDTH-i*i,0,GAMEWIDTH,GAMEHEIGHT);//按平方公式變化 } break; caseGAME_MENU: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); //顯示按鈕 mybutton.HideAll(); mybutton.Show2(BT_START); mybutton.Show2(BT_HELP); mybutton.Show2(BT_SET); hhhhhh break; caseGAME_MENU_HELP: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); mybutton.HideAll(); mybutton.Show2(BT_OK); ShowHelp(); break; caseGAME_MENU_SET: bmBack.Stretch(PIC0,0,0,GAMEWIDTH,GAMEHEIGHT); mybutton.HideAll(); mybutton.Show2(BT_LEFT); mybutton.Show2(BT_RIGHT); mybutton.Show2(BT_OK); ShowSet(); break;當(dāng)游戲進(jìn)入界面后,游戲界面的顯示如下將游戲界面分成3個(gè)部分,用黑色部分顯示背景,然后在右上角顯示下一次產(chǎn)生的俄羅斯方塊,右下角顯示分?jǐn)?shù)和速度等。 caseGAME_IN: //黑色背景 SelectObject(hdccanvas,hBrush); SelectObject(hdccanvas,hPenWhite); Rectangle(hdccanvas,0,0,GAMEWIDTH,GAMEHEIGHT); // Rectangle(hdccanvas,20,18,244,462); Rectangle(hdccanvas,LEFT_RECT_X,LEFT_RECT_Y,242,460); //右上角 Rectangle(hdccanvas,RIGHT_RECT_X,RIGHT_RECT_Y, RIGHT_RECT_X+132,RIGHT_RECT_Y+132);hhhhhh ShowInfoNow();//分?jǐn)?shù),速度文字 ShowSquare();//方塊 ShowBomb();//特效 break;3.8游戲方塊繪制一個(gè)游戲方塊被定義成一個(gè)MYBITMAP的對(duì)象,在俄羅斯方塊定義位圖對(duì)象bmSquare,然后通過(guò)對(duì)bmSquare的相關(guān)操作來(lái)達(dá)到達(dá)到繪圖的目的,GAMEBOX類通過(guò)調(diào)用ShowSquare來(lái)顯示方塊,首先顯示在右上角的方塊,定義好原始坐標(biāo)后,通過(guò)方塊位圖對(duì)象bmSqure調(diào)用MYBITMAP類的show方法繪制方塊坐標(biāo)。voidGAMEBOX::ShowSquare(){ inti; intx0,y0;//坐標(biāo)原點(diǎn) intm,n; //右上角顯示下一個(gè) x0=RIGHT_RECT_X+2*ITEM_EDGE; y0=RIGHT_RECT_Y+2*ITEM_EDGE; for(i=0;i<4;i++) { bmSquare.Show(squareNext.icolor, x0+squareNext.chip[i].x*ITEM_EDGE, y0+squareNext.chip[i].y*ITEM_EDGE); }繪制完右上角的方塊后則繼續(xù)繪制當(dāng)前移動(dòng)的方塊,定義方塊的初始坐標(biāo),判斷方塊是否在界面內(nèi)如果方塊在界面內(nèi)則顯示。hhhhhh //當(dāng)前移動(dòng)的方塊 x0=LEFT_RECT_X+squareNow.pos.x*ITEM_EDGE; y0=LEFT_RECT_Y+squareNow.pos.y*ITEM_EDGE; if(squareNow.id!=INVALID) { for(i=0;i<4;i++) { //方塊在界面內(nèi),則顯示 if(squareNow.pos.y+squareNow.chip[i].y>=0) { bmSquare.Show(squareNow.icolor, x0+squareNow.chip[i].x*ITEM_EDGE, y0+squareNow.chip[i].y*ITEM_EDGE); } } }最后在整個(gè)界面內(nèi),20行,10列根據(jù)當(dāng)前的gamemap確定每一個(gè)方塊格是否該繪圖,如果該相應(yīng)的map中需要繪制則繪制其圖像。//已經(jīng)放置的方塊 for(m=0;m<20;m++) { for(n=0;n<10;n++) { if(VALID==gamemap[m][n]) { bmSquare.Show(PIC0, LEFT_RECT_X+n*ITEM_EDGE, LEFT_RECT_Y+m*ITEM_EDGE); }hhhhhh } }3.9煙花燃放功能為了使游戲更具有娛樂性,在游戲銷行的過(guò)程中消一行得10分,同時(shí)消2行得30分,消得3行得60分,消得4行得100分。根據(jù)銷行的得分?jǐn)?shù)放煙花,得分多者放的煙花也多。燃放煙花分為兩個(gè)部分,一個(gè)是初始化煙花過(guò)程,就是根據(jù)得分級(jí)數(shù)決定燃放煙花的級(jí)數(shù),通過(guò)GAMEBOX類中的BeginBomb進(jìn)行初始化,其代碼如下。voidGAMEBOX::BeginBomb(intisize){ intiSizeTable[]={3,4,5,10,20}; //isize范圍:0至4,共5種煙花規(guī)模 if(isize<0||isize>4) return; iStartBomb=1; magicobj[0].x=120; magicobj[0].y=430; magicobj[0].xoff=0; magicobj[0].yoff=-16-isize*2;//設(shè)置初始上拋速度 iScene=SCENE0; iScale=iSizeTable[isize];//設(shè)置粒子數(shù)量}煙花的具體燃放過(guò)程通過(guò)GAMEBOX類中的ShowBomb函數(shù)燃放煙花,然后過(guò)程會(huì)將粒子上拋到空中,然后通過(guò)MYBITMAP燃放煙花對(duì)象bmBomb來(lái)顯示煙花。voidGAMEBOX::ShowBomb(){ inti;hhhhhh if(iStartBomb) { if(SCENE0==iScene) { //一個(gè)粒子上拋至頂點(diǎn) bmBomb.ShowNoBack(PIC0,magicobj[0].x,magicobj[0].y); //刷新坐標(biāo) magicobj[0].y+=magicobj[0].yoff; magicobj[0].yoff++; if(magicobj[0].yoff>=0) { iScene=SCENE1;//動(dòng)畫2 for(i=0;i<iScale;i++) { magicobj[i].x=magicobj[0].x; magicobj[i].y=magicobj[0].y; magicobj[i].yoff=-rand()%15; magicobj[i].xoff=rand()%9-4; } } } elseif(SCENE1==iScene) { //粒子上拋,下落 //iScale:粒子數(shù)量 for(i=0;i<iScale;i++) { bmBomb.ShowNoBack(rand()%5,magicobj[i].x,magicobj[i].y);hhhhhh //刷新坐標(biāo) magicobj[i].y+=magicobj[i].yoff; magicobj[i].x+=magicobj[i].xoff; magicobj[i].yoff++; } if(magicobj[0].yoff>15) { iStartBomb=0;//停止 } } }}hhhhhhhhhhhh4功能測(cè)試對(duì)于編寫好的游戲軟件,需要進(jìn)行各種測(cè)試來(lái)保證軟件的正常運(yùn)行,常見的測(cè)試手段包括黑盒測(cè)試和白盒測(cè)試,軟件測(cè)試主要工作內(nèi)容是驗(yàn)證(verification)和確認(rèn)(validation),驗(yàn)證(verification)是保證軟件正確地實(shí)現(xiàn)了一些特定功能的一系列活動(dòng),即保證軟件做了你所期望的事情。確認(rèn)(validation)是一系列的活動(dòng)和過(guò)程,目的是想證實(shí)在一個(gè)給定的外部環(huán)境中軟件的邏輯正確性。即保證軟件以正確的方式來(lái)做了這個(gè)事件。本文中著重用黑盒測(cè)試來(lái)測(cè)試軟件的各個(gè)功能是否正確。4.1測(cè)試環(huán)境本文中俄羅斯方塊的測(cè)試環(huán)境如下:硬件環(huán)境:聯(lián)想pC機(jī),Intel5300雙核CPU,2GB內(nèi)存,250G硬盤軟件環(huán)境:windowsXP操作系統(tǒng)4.2圖像功能測(cè)試當(dāng)游戲在剛剛啟動(dòng)后會(huì)進(jìn)入其啟動(dòng)界面,在啟動(dòng)界面中顯示學(xué)號(hào)和姓名,啟動(dòng)過(guò)程如下圖4.1所示:圖4.1示例程序正常運(yùn)行過(guò)程中,其初始界面如上圖顯示,初始界面后會(huì)顯示游戲的控制界面如下,在控制界面上顯示開始,操作和設(shè)置等幾個(gè)按鈕,如圖4.2所示:hhhhhh圖4.2示例當(dāng)選擇操作按鈕時(shí),顯示操作的提示頁(yè)面如下圖顯示操作按鍵的用法等。如下圖4.3所示:圖4.3示例在主界面選擇設(shè)置按鈕則可以顯示設(shè)置游戲速度的窗口,如下圖4.4所示,通過(guò)點(diǎn)擊左右來(lái)調(diào)整速度hhhhhh圖4.4示例當(dāng)選擇游戲開始時(shí),就進(jìn)入游戲的主界面,如圖主界面分為以下三部分,主游戲窗口,右上角的下一個(gè)方塊窗口和游戲的分?jǐn)?shù)級(jí)速度窗口。如下圖4.5所示:圖4.5示例當(dāng)游戲失敗
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圓珠筆制造工崗前實(shí)操操作考核試卷含答案
- 海城培訓(xùn)班教學(xué)課件
- 漁船無(wú)線電操作員復(fù)試強(qiáng)化考核試卷含答案
- 漁網(wǎng)具工變革管理測(cè)試考核試卷含答案
- 海參內(nèi)部培訓(xùn)課件
- 送受話器裝調(diào)工安全應(yīng)急競(jìng)賽考核試卷含答案
- 橋梁運(yùn)架培訓(xùn)
- 2025年CCFA連鎖經(jīng)營(yíng)企業(yè)組織能力調(diào)研報(bào)告
- 酒店員工培訓(xùn)計(jì)劃執(zhí)行與監(jiān)督制度
- 酒店客房用品管理及領(lǐng)用制度
- 2026年安全員之A證考試題庫(kù)500道(必刷)
- 眼科疾病常見癥狀解析及護(hù)理指南
- 鉗工安全操作規(guī)程完整版
- 農(nóng)村水表改造施工方案
- 支持民辦教育發(fā)展增加教育多元化選擇
- 《2+N糖尿病逆轉(zhuǎn)治療行業(yè)規(guī)范與操作流程》
- 注射用伏欣奇拜單抗-臨床用藥解讀
- (正式版)DB21∕T 1565-2025 《預(yù)應(yīng)力混凝土管樁基礎(chǔ)技術(shù)規(guī)程》
- 壓裂裂縫檢測(cè)技術(shù)
- 防化兵課件教學(xué)課件
- 傾轉(zhuǎn)旋翼機(jī)減速器潤(rùn)滑系統(tǒng):性能深度剖析與仿真平臺(tái)創(chuàng)新構(gòu)建
評(píng)論
0/150
提交評(píng)論