《基于Visual C++的游戲設(shè)計(jì)和實(shí)現(xiàn)案例分析》12000字_第1頁(yè)
《基于Visual C++的游戲設(shè)計(jì)和實(shí)現(xiàn)案例分析》12000字_第2頁(yè)
《基于Visual C++的游戲設(shè)計(jì)和實(shí)現(xiàn)案例分析》12000字_第3頁(yè)
《基于Visual C++的游戲設(shè)計(jì)和實(shí)現(xiàn)案例分析》12000字_第4頁(yè)
《基于Visual C++的游戲設(shè)計(jì)和實(shí)現(xiàn)案例分析》12000字_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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)介

緒論1.1研究現(xiàn)狀在電腦普及發(fā)展的今天,游戲已成為人們生活中必不可少的一部分,連連看游戲總是排在受玩家歡迎排名的前幾名。但是,隨著智能手機(jī)的普及,手機(jī)游戲占據(jù)了中國(guó)游戲市場(chǎng)的一大半,而更具游戲性、創(chuàng)新性的單機(jī)游戲卻銷量平平。根據(jù)《2019年中國(guó)游戲產(chǎn)業(yè)發(fā)展報(bào)告》,2019年中國(guó)游戲用戶規(guī)摸非常之大,同比增長(zhǎng)2.5%。國(guó)內(nèi)游戲企業(yè)通過(guò)自己深入研究,移動(dòng)游戲市場(chǎng)收入保持持續(xù)上升,但是單機(jī)游戲市場(chǎng)繼續(xù)萎縮,分別只占市場(chǎng)份額的一點(diǎn)點(diǎn)[1]。經(jīng)典的單機(jī)游戲連連看的市場(chǎng)自然也不太可觀,因此要分析目前單機(jī)游戲存在的問(wèn)題,以經(jīng)典單機(jī)游戲連連看為例,發(fā)現(xiàn)問(wèn)題并想辦法解決。目前我國(guó)單機(jī)游戲漸漸淡出人們視野,是因?yàn)槠淦毡榇嬖谝韵聨c(diǎn)問(wèn)題,第一,游戲產(chǎn)品本身質(zhì)量不高,即游戲制作水平不足;第二,游戲性不強(qiáng),即游戲重復(fù)可玩性不高;第三,文化屬性不強(qiáng)[2]。據(jù)報(bào)告,全球游戲玩家在2016年創(chuàng)造了非常高的收入,其中單機(jī)游戲收入占70%以上。但并不是所有的游戲行業(yè)發(fā)展的都非常好,取得了可觀的效益。單機(jī)游戲在中國(guó)的發(fā)展之路困難重重?;谌绱?,游戲產(chǎn)業(yè)尤其是單機(jī)游戲產(chǎn)業(yè)發(fā)展的并不是特別的理想。在全球范圍內(nèi)來(lái)看游戲是一個(gè)具有強(qiáng)大旺盛生命力的產(chǎn)業(yè)。2016年中國(guó)游戲產(chǎn)業(yè)規(guī)模實(shí)現(xiàn)了非常可觀的收入,賺取了很大一筆資金,只是其中單機(jī)游戲的收入?yún)s是微不足道的,占比不到0.5%[3]。當(dāng)前發(fā)展比較好的小游戲平臺(tái)——狗仔游戲盒子,里面提供的單機(jī)小游戲都非常受歡迎,里面包括黃金礦工、金牌炮彈射手等等。但是大部分的單機(jī)小游戲質(zhì)量參差不齊,都存在各自的缺點(diǎn)[4]。在國(guó)外,玩家玩游戲的第一選擇是獨(dú)立游戲。大型獨(dú)立游戲的發(fā)展周期一般很長(zhǎng),發(fā)展計(jì)劃龐大。然而,中小型作品往往受到公眾的喜愛(ài),如"植物大戰(zhàn)僵尸"和"超級(jí)馬里奧",這是流行的世界各地的。這兩款獨(dú)立游戲在中國(guó)非常成熟和流行。這些獨(dú)立游戲不僅分布在公共PC平臺(tái)上,而且還涵蓋許多其他不同的平臺(tái)[5]。1.2主要研究的目的及內(nèi)容這種設(shè)計(jì)的主要目的是在Windows平臺(tái)下設(shè)計(jì)一個(gè)簡(jiǎn)單有趣的游戲,讓人們下班后放松和學(xué)習(xí)。與目前大型單機(jī)或網(wǎng)絡(luò)游戲(以下簡(jiǎn)稱大型游戲)不同,這款小型游戲旨在滿足人們休閑的需要,在努力工作后放松人們的精神[8]。這種休閑游戲很容易玩,不像在線游戲,它需要注冊(cè)帳戶和下載很長(zhǎng)一段時(shí)間。它不需要實(shí)時(shí)保持在線狀態(tài)[6][7]。在沒(méi)有網(wǎng)絡(luò)時(shí)也可以使用。它不像大型游戲那樣耗時(shí)和費(fèi)力,也不會(huì)把人們的精力牢牢地投入到游戲里。對(duì)于我們來(lái)說(shuō),隨著自由時(shí)間的日益分散,這個(gè)游戲不僅能給人們帶來(lái)最大的放松,而且還不會(huì)像大型游戲一樣疲憊不堪,而這個(gè)小游戲不會(huì)占用太多的電腦資源??梢哉f(shuō),工作和娛樂(lè)都是正確的[9]。1.3設(shè)計(jì)思路連連看看游戲的主要問(wèn)題是鼠標(biāo)點(diǎn)擊兩次的圖片是否可以消失。當(dāng)然,如果您單擊兩張相同的圖片,那就做處理。如果選擇兩張不同的圖片,則不會(huì)處理它。如果所有路徑中至少有一個(gè)路徑的拐點(diǎn)不超過(guò)兩個(gè),可以通過(guò)兩個(gè)相同的圖片連接,則可以消除該路徑,如果沒(méi)有,則不會(huì)進(jìn)行處理。此課題內(nèi)容以及目標(biāo)如下:(1)有難度選擇,根據(jù)時(shí)間進(jìn)度條的自減量以及消去成對(duì)塊后時(shí)間進(jìn)度條的回復(fù)量來(lái)設(shè)置難度。(2)點(diǎn)擊重新開(kāi)始后可隨機(jī)生成游戲界面。(3)棋子選中后圖片要有明顯標(biāo)示。(4)選擇兩個(gè)具有相同樣式的棋子。如果連接它們的拐點(diǎn)不超過(guò)兩個(gè),則可以消除該對(duì)棋子。在每場(chǎng)游戲中,玩家需要在指定時(shí)間內(nèi)消除所有對(duì)塊。消除所有對(duì)塊時(shí),則確定成功。(5)當(dāng)出現(xiàn)無(wú)解的局面時(shí),可按下重新排列按鈕。(6)游戲自動(dòng)統(tǒng)計(jì)玩家獲得的分?jǐn)?shù)。

相關(guān)技術(shù)簡(jiǎn)介2.1C++語(yǔ)言目前,一些語(yǔ)言為了提高效率總是以犧牲語(yǔ)言的靈活性為代價(jià)。但這種靈活性正是C/C++程序員所必不可少的。這種解決方案提供的功能差強(qiáng)人意,而且還對(duì)程序員有太多的限制。之前的系統(tǒng)也不能輕易的和他們交互,與當(dāng)前的網(wǎng)絡(luò)編程也不能很好地相結(jié)合。對(duì)于用戶來(lái)說(shuō),在快速發(fā)展的同時(shí)調(diào)用基礎(chǔ)平臺(tái)的所有功能是最理想的解決方案。希望有一個(gè)與最新網(wǎng)絡(luò)標(biāo)準(zhǔn)保持同步并與現(xiàn)有應(yīng)用程序很好地集成的環(huán)境。此外,一些C/C++開(kāi)發(fā)人員還需要在必要時(shí)進(jìn)行一些基礎(chǔ)編程。更新軟件組件是一項(xiàng)非常容易出錯(cuò)的工作,因?yàn)樾薷拇a可能會(huì)無(wú)意中更改原始程序的語(yǔ)義。為了幫助開(kāi)發(fā)人員完成此工作,C++版本的更新提供了內(nèi)部支持。一般來(lái)說(shuō),這些功能使開(kāi)發(fā)后續(xù)版本的程序項(xiàng)目的過(guò)程更加穩(wěn)健,從而降低了后續(xù)版本的開(kāi)發(fā)成本[10]。無(wú)論是支持COM的呼叫還是純API,它都是為了使開(kāi)發(fā)人員能夠直接在C++環(huán)境中具有必要的強(qiáng)大功能。VisualC++是以可視化技術(shù)為基礎(chǔ),以C++為主要編程語(yǔ)言,集成眾多工具的開(kāi)發(fā)利器。一般性的MFC界面開(kāi)發(fā)工作也可以全部交給它來(lái)完成,用戶就只需要在這些基礎(chǔ)上做出自己想要實(shí)現(xiàn)的功能即可。與其他開(kāi)發(fā)工具相比,VisualC++完成Windows圖形界面的程序所花費(fèi)的時(shí)間要少得多結(jié)論:C++是一種現(xiàn)代的面向?qū)ο笳Z(yǔ)言。這種框架使C++組件可以方便地轉(zhuǎn)化為XML網(wǎng)絡(luò)服務(wù),從而使任何平臺(tái)的應(yīng)用程序都可以通過(guò)Internet調(diào)用它。2.2MicrosoftVisualStudioVisualStudio是由微軟公司發(fā)行的開(kāi)發(fā)編程運(yùn)行環(huán)境,是當(dāng)前市面上最盛行的Windows平臺(tái)應(yīng)用程序開(kāi)發(fā)的環(huán)境。它比以前更加簡(jiǎn)單明了的原因是它重新設(shè)計(jì)和組織了其集成以及開(kāi)發(fā)環(huán)境(IDE)的界面。同時(shí)帶來(lái)VS2010CTP(CommunityTechnologyPreview--CTP)、NETFramework4.0,并支持開(kāi)發(fā)面向Windows7的應(yīng)用的程序。除了MicrosoftSQLServer,它還能夠支持IBMDB2和Oracle數(shù)據(jù)庫(kù)。而且,VS能夠更深層次的支持SQLServer。SQLServerYukon也將數(shù)據(jù)庫(kù)引擎整合了公共語(yǔ)言運(yùn)行時(shí)(CLR)的功能,并且將數(shù)據(jù)庫(kù)和工具的結(jié)合提高到新水平[11]。需求分析連連看游戲所占內(nèi)存比較小,對(duì)計(jì)算機(jī)存儲(chǔ)容量沒(méi)有過(guò)分特殊要求,可以在任意一款計(jì)算機(jī)上運(yùn)行。連連看游戲的基本規(guī)則為,每次刪除一對(duì)棋子時(shí),游戲限制時(shí)間都會(huì)自動(dòng)增加。當(dāng)所有的時(shí)間花完了,游戲就以失敗告終。在有限時(shí)間內(nèi),消除全部游戲區(qū)域內(nèi)的棋子,則可以進(jìn)入下一關(guān)較大難度的游戲,重現(xiàn)開(kāi)始新等級(jí)的游戲[12]。此款連連看游戲要實(shí)現(xiàn):(1)連連看的總體地圖設(shè)計(jì):整個(gè)游戲區(qū)域被視為由若干個(gè)空方塊組成的地圖,每個(gè)空方塊都充滿了不同的圖案。充滿不同圖案的空方塊可以稱為棋子。根據(jù)某些規(guī)則,這些不同的棋子分布在整個(gè)游戲區(qū)域的不同位置,每個(gè)棋子都應(yīng)有其相對(duì)應(yīng)的棋子。(2)圖案方塊的連接判斷:若選中的兩個(gè)小圖塊圖案相同,且在同一條直線上,它們之間也沒(méi)有其他的障礙物,則可以用直線進(jìn)行直接消除;若沒(méi)在同一條直線上,但是中間沒(méi)有其他障礙物,可以利用折線進(jìn)行消除;如果不是以上兩種情況,則返回開(kāi)始,直到出現(xiàn)以上兩種情況再進(jìn)行連線消除。(3)鼠標(biāo)交互功能的實(shí)現(xiàn):用戶在用鼠標(biāo)選擇了兩次圖案后,程序要自己判斷是否是可以消除的情況,若果符合可以消除的情況,則進(jìn)行圖塊的消除,反之則不進(jìn)行消除,在重復(fù)上述的選擇與操作。(4)游戲勝利的判斷:對(duì)于整個(gè)游戲區(qū)域進(jìn)行掃描判斷,若發(fā)現(xiàn)游戲區(qū)域有兩個(gè)及以上的圖塊沒(méi)有消除,則游戲沒(méi)有勝利,若檢測(cè)到整個(gè)游戲區(qū)域的圖塊都被消除完畢,則游戲勝利。(5)英雄榜的顯示及更新:當(dāng)用戶當(dāng)前級(jí)別超過(guò)記錄文件中的水平時(shí),英雄列表對(duì)話框?qū)棾?。要求用戶輸入姓名,并記錄在記錄文件中。?)游戲的幫助功能:在游戲界面中需要提供游戲使用說(shuō)明等幫助提示,以方便對(duì)此連連看游戲不了解的用戶對(duì)游戲進(jìn)行操作和使用。系統(tǒng)設(shè)計(jì)連連看游戲不單單要功能完備,且要界面友好,因此,對(duì)于一個(gè)成功的連連看游戲設(shè)計(jì)項(xiàng)目,功能模塊的設(shè)計(jì)是關(guān)鍵[13]。4.1概要設(shè)計(jì)概要設(shè)計(jì)就是分析連連看游戲要“做什么”,我們需要做系統(tǒng)功能模塊圖,如圖4-1所示的系統(tǒng)體系結(jié)構(gòu)圖:圖4-1系統(tǒng)體系結(jié)構(gòu)圖連連看游戲系統(tǒng)功能模塊有以下幾個(gè):首先是界面初始化,再接著是隨機(jī)生成圖片,然后是判斷圖片是否消除,即圖片消除判斷,再是連線消除加分和勝利條件判斷。對(duì)于用戶玩家來(lái)說(shuō)則有如下幾個(gè)功能:開(kāi)始游戲、暫停游戲、重新排列、游戲設(shè)置以及其他相關(guān)[14]。界面初始化:用戶在開(kāi)始游戲后,游戲的整個(gè)界面開(kāi)始進(jìn)行準(zhǔn)備工作,即開(kāi)始初始化,整個(gè)游戲的頁(yè)面會(huì)出現(xiàn)游戲難度的選擇、游戲背景音樂(lè)的選擇、游戲關(guān)卡的選擇、游戲幫助的選擇。主要負(fù)責(zé)顯示游戲界面、等級(jí)、時(shí)間顯示以及游戲幫助等內(nèi)容。其主要有如下幾個(gè)處理模塊:主菜單處理模塊、連接提示處理模塊、換盤處理模塊、初始化棋盤數(shù)據(jù)處理模塊、游戲信息處理模塊。(1)主菜單處理模塊:主菜單處理模塊比較簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)菜單對(duì)象。并在對(duì)話框初始化函數(shù)中進(jìn)行加載相應(yīng)資源并設(shè)置到對(duì)話框中即可。(2)連接提示處理模塊:連接提示模塊,主要調(diào)用棋子類中的查找有效連接接口函數(shù),通過(guò)返回的兩個(gè)圖標(biāo)相同的棋子位置來(lái)設(shè)置兩個(gè)棋子的狀態(tài)為按下。(3)換盤處理模塊:換盤處理模塊,主要是把棋盤數(shù)組中的數(shù)據(jù)重新進(jìn)行隨機(jī)排列。(4)初始化棋盤數(shù)據(jù)模塊:初始化棋盤數(shù)據(jù)模塊,利用隨機(jī)數(shù),隨機(jī)地選擇在棋盤數(shù)組中插入棋子數(shù)據(jù)。每一類棋子生成兩組四個(gè)相同的數(shù)據(jù)。(5)游戲信息處理模塊:游戲信息處理模塊,主要利用設(shè)置定時(shí)器,每一秒進(jìn)行更新顯示區(qū)域。在這些區(qū)域中,以繪圖方式進(jìn)行輸出。隨機(jī)生成圖片:在用戶點(diǎn)擊開(kāi)始游戲按鈕后,整個(gè)游戲地圖會(huì)隨機(jī)生成圖案不同的小圖片,也就是連連看的棋子,每一個(gè)棋子都有其相對(duì)應(yīng)的一個(gè),這兩個(gè)棋子組成一對(duì),只要用戶兩次點(diǎn)擊相同圖案的棋子,則可以將兩個(gè)相同圖塊的棋子消除。圖片消除判斷:用戶在用鼠標(biāo)第一次點(diǎn)擊棋子后,被點(diǎn)擊的這個(gè)棋子的圖案將被記錄;然后用戶第二次點(diǎn)擊棋子,如果用戶兩次點(diǎn)擊的棋子之間沒(méi)有其他的(障礙物)棋子,即兩個(gè)棋子之間是可以構(gòu)成一條橫著或者豎著的直線,又或者是兩個(gè)棋子之間構(gòu)成了一條折線,同樣中間是沒(méi)有障礙物的,那么,這就滿足了棋子消除的條件,可以進(jìn)行棋子的消除。連線消除加分:如果有兩個(gè)棋子可以進(jìn)行連線消除,那么就可以加一分,每連線消除一對(duì)棋子,就加一分,直到所有棋子消除完畢,則停止加分。勝利條件判斷:如果整個(gè)游戲地圖的棋子全部消除完畢,則游戲勝利。如果整個(gè)游戲地圖的棋子大于等于一,則游戲失敗。對(duì)于用戶玩家來(lái)說(shuō):用戶想玩游戲的時(shí)候可以點(diǎn)擊開(kāi)始游戲以進(jìn)行一場(chǎng)新的游戲,如果中途不想繼續(xù)游戲了,也可以點(diǎn)擊暫停游戲,讓游戲先暫停,休息過(guò)后可以點(diǎn)擊繼續(xù)游戲來(lái)開(kāi)始游戲。用戶如果對(duì)當(dāng)前的棋子排列不滿意,也可以點(diǎn)擊重新排列一達(dá)到棋子換盤的目的,也可以進(jìn)行游戲設(shè)置以及游戲幫助[15]。4.2系統(tǒng)結(jié)構(gòu)設(shè)計(jì)系統(tǒng)在概要設(shè)計(jì)中一般采用結(jié)構(gòu)化設(shè)計(jì)。其以需求分析階段生成的數(shù)據(jù)流圖為基礎(chǔ),按一定步驟進(jìn)行映射,形成軟件結(jié)構(gòu)。然后,進(jìn)一步細(xì)分模塊,添加細(xì)節(jié)功能與實(shí)現(xiàn)。本文所設(shè)計(jì)的連連看游戲主流程圖如圖4-2所示。圖4-2主流程圖首先,游戲開(kāi)始時(shí)先是游戲界面初始化,頁(yè)面初始化會(huì)顯示主菜單、難度選擇等。初始化完成之后,系統(tǒng)就開(kāi)始進(jìn)行隨機(jī)地成對(duì)的分發(fā)棋子,讓整個(gè)游戲區(qū)域布滿棋子,這些棋子每個(gè)都可以找到與之匹配的一個(gè),即都可以進(jìn)行消除,不會(huì)落單。這一步就是游戲地圖的完成。接著用戶第一次用鼠標(biāo)選擇一個(gè)棋子,系統(tǒng)記錄在案,用戶在開(kāi)始第二次棋子選擇。如果連續(xù)兩次所選擇的棋子是一樣的,而且兩個(gè)棋子之間沒(méi)有其他多余的障礙物,則可以進(jìn)行兩個(gè)相同棋子的消除。如果兩次所選擇的棋子圖案不一樣,就返回上一步,再次進(jìn)行兩次圖片的選擇。每次進(jìn)行一次圖片消除后就判斷一次所有的棋子是否消除完畢,若所有的棋子都消除完畢了,則游戲結(jié)束,如果沒(méi)有消除完畢,則繼續(xù)進(jìn)行棋子選擇和棋子消除步驟。4.3詳細(xì)設(shè)計(jì)4.3.1功能模塊的算法設(shè)計(jì)在連連看游戲中,要實(shí)現(xiàn)游戲的各個(gè)功能,大致可以分為以下幾個(gè)模塊,其算法展示如下:時(shí)間限制模塊如圖4-3所示,消除提示模塊如圖4-4所示,鼠標(biāo)交互功能如圖4-5所示,游戲升級(jí)模塊如圖4-6所示:時(shí)間限制模塊的算法設(shè)計(jì):圖4-3時(shí)間限制模塊(1)在比賽開(kāi)始時(shí),將時(shí)間設(shè)置為60秒;(2)設(shè)置時(shí)間間隔為1000ms的定時(shí)器Timer1;(3)每次間隔到達(dá)時(shí),當(dāng)前限制時(shí)間縮短1s;(4)游戲中淘汰一對(duì)棋子的,將限制時(shí)間增加3次;例如,當(dāng)前限制時(shí)間為50秒。如果移除棋子,限制時(shí)間為53秒。(5)如果限制時(shí)間為0s,則游戲結(jié)束,游戲結(jié)束對(duì)話框?qū)棾?。如果?dāng)前游戲級(jí)別超過(guò)記錄級(jí)別,英雄列表對(duì)話框?qū)棾?。消除提示模塊的算法設(shè)計(jì):圖4-4消除提示模塊(1)判斷提示次數(shù)變量的值,如果提示次數(shù)等于0,則彈出游戲結(jié)束對(duì)話框,結(jié)束游戲并退出游戲;(2)如果提示次數(shù)的值不為0,則遍歷查找當(dāng)前棋盤中剩余的還沒(méi)有消除的其他的相同的棋子;(3)在那些還沒(méi)有消除的相同的棋子中,查找可以消除的棋子,即擁有相同圖案的棋子;(4)找到圖案相同的棋子后,在可以消除的棋子上給出提示連線,然后將提示次數(shù)變量減少1,直到提示次數(shù)變?yōu)?。消除相同棋子模塊的算法設(shè)計(jì)(鼠標(biāo)交互功能):圖4-5鼠標(biāo)交互功能(1)當(dāng)用戶首次單擊棋子時(shí),將第一次棋子的坐標(biāo)和類型保存到“第一選擇變量”;(2)用戶鼠標(biāo)第二次點(diǎn)擊棋子,獲取第二次鼠標(biāo)選擇的棋子的坐標(biāo)和類型;(3)比較用戶第一次和第二次棋子的坐標(biāo)和類型。如果點(diǎn)擊的兩次的棋子類型相同,請(qǐng)轉(zhuǎn)到步驟(4);如果沒(méi)有,去步驟(5);(4)在用戶點(diǎn)擊兩次的棋子上畫一條連接線,消除一對(duì)棋子,退出并等待下一個(gè)鼠標(biāo)選擇;(5)將用戶第二次選擇的棋子的坐標(biāo)和類型分配給“第一選擇變量”。游戲升級(jí)模塊的算法設(shè)計(jì):圖4-6游戲升級(jí)模塊(1)在用戶完成一局游戲后,保存當(dāng)前游戲等級(jí)和限制時(shí)間初始值;(2)判斷當(dāng)前游戲中的所有棋子是否已被淘汰。如果當(dāng)前游戲區(qū)域的所有棋子都已消除,則將當(dāng)前游戲級(jí)別提高一個(gè)級(jí)別,并將有限時(shí)間的初始值降低"5s";(3)如果本場(chǎng)游戲的棋子沒(méi)有被淘汰,將保存當(dāng)前游戲級(jí)別和有限時(shí)間,繼續(xù)當(dāng)前游戲;(4)如果游戲等級(jí)增加了一級(jí),就重新開(kāi)始游戲。消除提示模塊的算法設(shè)計(jì):(1)判斷提示次數(shù)變量的值,如果提示次數(shù)變量的值等于0,則游戲提示次數(shù)完畢,游戲結(jié)束;(2)如果提示時(shí)間變量值大于0,將搜索當(dāng)前棋盤中具有相同圖案的棋子;(3)找到圖案相同的棋子后,在相同棋子中,查找兩個(gè)棋子中間沒(méi)有其他多余障礙物的,可以消除的棋子;(4)找到可以消除的棋子后,在可以消除的兩個(gè)棋子上面給出提示連線,則提示次數(shù)變量減少1。棋子換盤模塊的算法設(shè)計(jì):(1)首先,將當(dāng)前棋盤陣列中的數(shù)據(jù)保存到臨時(shí)數(shù)組;(2)從臨時(shí)數(shù)組中回收,隨機(jī)取出數(shù)據(jù)并保存到棋盤陣列中。英雄榜模塊的算法設(shè)計(jì):(1)讀取配置文件(setup.ini),得到并顯示當(dāng)前最高等級(jí)及姓名;(2)在游戲結(jié)束時(shí),將當(dāng)前用戶級(jí)別與最高水平進(jìn)行比較。如果它高于配置文件中的最高水平,"英雄列表"對(duì)話框?qū)棾?,要求您輸入一個(gè)名稱并將其保存到配置文件以及用戶級(jí)別。音樂(lè)播放模塊的算法設(shè)計(jì):(1)在工程文件中,添加靜態(tài)庫(kù)文件及頭文件;(2)實(shí)現(xiàn)CLlkDlg類中的PlayBackMusic()成員函數(shù)。4.3.2游戲地圖設(shè)計(jì)宏觀觀察整個(gè)游戲區(qū)域,可以把整個(gè)游戲區(qū)想象成一個(gè)由若干個(gè)空方塊組成的地圖,然后用不同的圖案填滿每個(gè)空塊,可以稱為一個(gè)小圖片,即游戲的棋子。這些小塊根據(jù)某些規(guī)則隨機(jī)分布在游戲區(qū)域的不同位置,每個(gè)小塊必須有另一個(gè)小塊與其完全相同,以確保所有棋子可以消除和終止游戲。如圖4-7所示。圖4-7游戲地圖設(shè)計(jì)圖如圖4-7所示,平面上散落著幾個(gè)棋子,這些棋子成對(duì)出現(xiàn)。在描述和分析之后,整個(gè)游戲區(qū)域地圖可以由一個(gè)數(shù)組來(lái)表示。此陣列設(shè)計(jì)為動(dòng)態(tài)分配的int型二維陣列,以表示地圖中的行數(shù)。成員變量中定義了整型指針變量,用于記錄動(dòng)態(tài)分配的一維數(shù)組映射空間的第一個(gè)地址。對(duì)于游戲區(qū)域中的某個(gè)小塊類型,可以使用重新塑造的整型ID來(lái)識(shí)別它。在這里,添加行變量x和列變量y以識(shí)別地圖的行和列位置。完成地圖數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)后,初始化游戲。因?yàn)樾K需要成對(duì)出現(xiàn),當(dāng)?shù)貓D被初始化時(shí),它不僅需要采取簡(jiǎn)單的隨機(jī)數(shù)字的圖像類型,然后把隨機(jī)選擇的填充地圖放入游戲區(qū)域,而且還要選擇成對(duì)的填充地圖,也就是說(shuō),地圖中的小塊必須是雙數(shù)的。將地圖陣列設(shè)置為動(dòng)態(tài)分配模式的目的是使數(shù)據(jù)空間根據(jù)行數(shù)和列數(shù)動(dòng)態(tài)獲取。如果設(shè)計(jì)了大小不同的地圖,則可以提前定義有關(guān)行數(shù)和列數(shù)的幾個(gè)宏組。在創(chuàng)建時(shí),根據(jù)不同的宏分配不同大小的地圖空間,然后可以初始化地圖數(shù)據(jù)。在執(zhí)行連連看類對(duì)象時(shí),定義了地圖中行數(shù)和列數(shù)的幾大宏。由于地圖數(shù)據(jù)由堆棧區(qū)域中的new動(dòng)態(tài)創(chuàng)建,因此在銷毀對(duì)象時(shí)需要釋放內(nèi)存空間,并且在對(duì)象的破壞器中反復(fù)調(diào)用delete以從新對(duì)象中釋放所有空間。4.3.3棋子類的設(shè)計(jì)棋子類的設(shè)計(jì),包含如下幾個(gè)功能函數(shù):游戲游戲勝負(fù)判斷處理(1)等待用戶的鼠標(biāo)輸入信息;(2)在定時(shí)器中,每次扣除游戲的限制時(shí)間一秒;(3)當(dāng)游戲時(shí)間為零秒時(shí),彈出游戲失敗結(jié)束提示,并根據(jù)用戶選擇重新開(kāi)始游戲或者結(jié)束游戲;(4)在用戶消除一對(duì)棋子后,就對(duì)當(dāng)前棋盤數(shù)組進(jìn)行遍歷。如果是空,如果是空,說(shuō)明用戶已經(jīng)全部消除完畢。調(diào)用升級(jí)處理。如果不是空,則返回步驟(1)。戲升級(jí)處理:(1)當(dāng)游戲中的棋子全部被消除完畢后,彈出升級(jí)提示對(duì)話框;(2)當(dāng)用戶選擇繼續(xù)游戲時(shí),就調(diào)用主對(duì)話框類的重新開(kāi)始游戲接口函數(shù)。但是要把當(dāng)前游戲等級(jí)增加一級(jí);(3)當(dāng)用戶選擇不繼續(xù)時(shí),直接調(diào)用退出函數(shù)。查找處理:(1)遍歷整個(gè)棋盤數(shù)組;(2)查找一根直線可以連接的一對(duì)棋子,如果沒(méi)有則轉(zhuǎn)下一步;如果有則轉(zhuǎn)步驟(6);(3)查找一個(gè)有拐角,即兩根直線可以連接的一對(duì)棋子。如果沒(méi)有則轉(zhuǎn)下一步,如果有則轉(zhuǎn)步驟(6);(4)查找有兩個(gè)拐角的,即三根直線可以連接的一對(duì)棋子。如果沒(méi)有則轉(zhuǎn)下一步,如果有則轉(zhuǎn)步驟(6);(5)如果返回假,表示查找失??;(6)如果返回真,表示查找成功,并把棋子的位置在輸出參數(shù)中返回。提示處理:提示處理是通過(guò)調(diào)用查找函數(shù),把其中可以連接的一對(duì)棋子的位置通過(guò)輸入?yún)?shù)返回給上層調(diào)用者。由調(diào)用者設(shè)置相關(guān)棋子為選中狀態(tài)。棋子類的實(shí)現(xiàn),分為以下幾步:(1)首先聲明棋子類CChessMan,其中包含兩個(gè)構(gòu)造函數(shù)、查找接口函數(shù)、判斷棋子為空函數(shù)及鼠標(biāo)左鍵響應(yīng)函數(shù)。(2)添加棋子類的實(shí)現(xiàn),其中包含基本的構(gòu)造函數(shù)、析構(gòu)函數(shù)、鼠標(biāo)左鍵響應(yīng)函數(shù)等。(3)實(shí)現(xiàn)棋子類的查找接口、棋盤判空功能函數(shù)。要注意,其中查找函數(shù)有兩種:一種是輸入兩個(gè)棋子坐標(biāo)查找有無(wú)連接線;另一種是在前一種基礎(chǔ)上,如果棋子間有連接就要把棋子的拐角位置輸出。(4)實(shí)現(xiàn)棋子類的配對(duì)接口函數(shù)分為兩種:一種是判斷當(dāng)前棋盤上有無(wú)配對(duì)棋子;另一種是在前一種的基礎(chǔ)上添加輸出配對(duì)棋子坐標(biāo)的功能。(5)實(shí)現(xiàn)各種不同的查找函數(shù)。包含查找一根直線連接函數(shù)、查找一個(gè)拐角連接函數(shù)和查找兩個(gè)拐角連接函數(shù)。4.3.4棋子的連接判斷對(duì)于選中的兩個(gè)方塊的處理,必須符合如下3個(gè)條件:選中的兩個(gè)小圖塊的填充圖案一致;兩個(gè)選定的小塊可以通過(guò)與X或Y軸平行的幾個(gè)直線連接,并且彼此垂直,沒(méi)有障礙物;連接它們的這些直線段不超過(guò)兩個(gè)拐點(diǎn)(連接線由x軸和y軸的平行線組成)。現(xiàn)在針對(duì)條件2和條件3進(jìn)行分析,如圖4-8所示。依圖4-8所示可知,相同圖案的連接方式可以分成以下3種:直接方式;有一個(gè)折點(diǎn)的垂直線段連接;有兩個(gè)折點(diǎn)的垂直線段連接。(1)直接連接方式在直接連接模式下,所選的兩個(gè)棋子必須位于同一水平線上(x方向或Y方向),并且兩個(gè)正方形之間沒(méi)有其他圖案正方形。(2)單個(gè)拐點(diǎn)連接方式如果選定的兩個(gè)棋子通過(guò)折點(diǎn)連接,則對(duì)于折點(diǎn),每個(gè)折點(diǎn)必須具有且至少一個(gè)坐標(biāo)(x或y)與目標(biāo)點(diǎn)之一相同,即折點(diǎn)必須在位于兩個(gè)目標(biāo)點(diǎn)所在的X或Y方向的行上。此外,對(duì)于折點(diǎn)連接的情況,應(yīng)通過(guò)第一個(gè)選定方塊的橫向線或縱向線的交叉點(diǎn)和第二個(gè)選定方塊的縱線和橫向線的交叉獲得折點(diǎn)。(3)兩個(gè)折點(diǎn)的連接方式這樣,由兩個(gè)折點(diǎn)連成的直線和兩個(gè)對(duì)象之間的直線可以形成平行線。因此,根據(jù)此規(guī)則,水平線可以在游戲區(qū)域允許的條件下上下移動(dòng),然后通過(guò)判斷整條帶垂直折線點(diǎn)的曲線之間有無(wú)障礙物方式來(lái)確定是否可以連同。經(jīng)過(guò)上述詳細(xì)分析,能否對(duì)選定的兩個(gè)塊進(jìn)行消除,可以采用這種方式進(jìn)行設(shè)計(jì)。先判斷簡(jiǎn)單的直接連接,看看它是否符合條件。如果不能,再加深一個(gè)級(jí)別的復(fù)雜性,判斷折點(diǎn)的情況,依次類推,如下圖4-8所示。圖4-8連線規(guī)則圖連線流程圖如圖4-9所示。圖4-9連線流程圖(1)首先判斷直連方式是否成功,直連方式判斷成功后就可以進(jìn)行棋子的消除了;(2)如果直連方式判斷為失敗,則開(kāi)始判斷單個(gè)拐點(diǎn)方式是否成功,單個(gè)拐點(diǎn)方式判斷成功后,則進(jìn)行棋子的消除;(3)如果單個(gè)拐點(diǎn)方式判斷為失敗,則開(kāi)始判斷兩個(gè)拐點(diǎn)方式是否成功,判斷兩個(gè)拐點(diǎn)方式為成功后,則進(jìn)行棋子的消除,如果判斷為失敗,則不進(jìn)行消除。這里把直接連接方式分為直通,左通,右通3種情況,如4-10圖所示。圖4-10連接方式圖下面簡(jiǎn)單介紹直通、左通這兩種情況(右通與左通類似)(1)直通:直通就是選定的兩個(gè)圖塊連線中,沒(méi)有任何阻礙。(2)左通:左通即選定的兩個(gè)圖塊間的連線間有阻礙,但通過(guò)其左側(cè)可以將它們無(wú)阻連通。直連中的此種情況跟之前分析的兩個(gè)折點(diǎn)連接方式中的其中一點(diǎn)類似,如4-11圖所示。圖4-11兩折通道圖同理,有上通和下通,其情況類似于左通和右通。通過(guò)行判斷是否通(并返回能通過(guò)的行)。4.3.5鼠標(biāo)交互功能的實(shí)現(xiàn)(1)首先,每個(gè)小塊的寬度和高度,以鼠標(biāo)的當(dāng)前坐標(biāo)位置點(diǎn)為模型,來(lái)獲取當(dāng)前鼠標(biāo)著陸點(diǎn)所在的游戲區(qū)域中行和列的具體位置:(2)判斷行數(shù)和列數(shù)是否符合條件。確保計(jì)算的行和列數(shù)在預(yù)先定義區(qū)域中行和列的最大數(shù)量范圍內(nèi),并且單擊的區(qū)域的狀態(tài)不是空白的方形區(qū)域。(3)要判斷此鼠標(biāo)事件的選擇是否與第一個(gè)選取的相同,我們只需要檢查用于記錄第一個(gè)選定的小塊的行和列數(shù)的成員變量是否有效。(4)對(duì)于所選小塊是第一個(gè)框,加一個(gè)紅色外邊框,用以提示用戶。(5)對(duì)選定的塊做出一些判斷,以獲得更高效的處理。判斷所選塊是否與前一個(gè)塊相同,然后跳到下一步,檢查兩個(gè)選定的塊是否可以被抵消。(6)調(diào)用函數(shù)isLink,判斷選中的兩個(gè)棋子是不是可以相互抵消。(7)如果可以抵消,應(yīng)適當(dāng)修改內(nèi)部核心地圖中兩個(gè)選定塊的數(shù)據(jù)狀態(tài),并將其狀態(tài)記錄為已銷毀的空塊狀態(tài)。(8)第二個(gè)圖塊選擇和相關(guān)功能操作完成后,應(yīng)清理工程中所記錄的第一個(gè)圖塊的位置,以便選擇下一個(gè)新的塊組。(9)最后,判斷鼠標(biāo)操作是否已成功完成,如果成功,給用戶一個(gè)提示,然后重新開(kāi)始新的關(guān)卡。為了實(shí)現(xiàn)游戲和用戶互動(dòng),選擇鼠標(biāo)交互模式。以下是鼠標(biāo)交互功能的簡(jiǎn)要描述。程序自動(dòng)確定鼠標(biāo)選中的兩個(gè)棋子是否可以消除。可以的話,則進(jìn)行消除,反之則不消除。上述判斷和操作會(huì)不斷重復(fù),直到游戲在棋子全部淘汰后結(jié)束,或游戲在指定時(shí)間之前失敗。鼠標(biāo)處理工作如圖4-12所示的流程圖。圖4-12鼠標(biāo)交互流程圖依據(jù)預(yù)先設(shè)計(jì)的鼠標(biāo)交互處理流程,上面已經(jīng)將其轉(zhuǎn)換成實(shí)現(xiàn)流程圖。下面則按照流程的子功能模塊分配方式,對(duì)整個(gè)功能模塊的實(shí)現(xiàn)過(guò)程進(jìn)行簡(jiǎn)單描述。(1)每個(gè)棋子的寬度和高度都先記錄下來(lái),以獲取游戲區(qū)域當(dāng)前鼠標(biāo)落點(diǎn)的特定行和列坐標(biāo)(x,y)。(2)判斷行和列的數(shù)量是否符合最大條件。確保計(jì)算獲得的行和列坐標(biāo)(x,y)在預(yù)定區(qū)域中行和列的最大數(shù)量范圍內(nèi),并且點(diǎn)擊的區(qū)域的狀態(tài)不是已消除的空白塊。(3)要判斷鼠標(biāo)選擇是否與選擇第一個(gè)塊相同,我們只需要判斷記錄第一個(gè)選定塊的行和列數(shù)的成員變量是否有效。(4)如果是第一個(gè)選定的方塊,請(qǐng)先記錄當(dāng)前選定的方塊的坐標(biāo),再在棋子周圍添加一個(gè)紅色的外邊框,以提醒用戶所選的第一個(gè)棋子的坐標(biāo)。(5)在這一處理中,對(duì)選定圖塊作一些判斷,便以更高效地處理。判斷選中的圖塊與前一圖塊是否為同一圖塊,并且只有在此次選擇不與上次選定的圖塊為同一圖塊時(shí),才跳到下一步對(duì)兩個(gè)選定的圖塊是否可以消除的判定流程中去。(6)最后,判斷此關(guān)所有鼠標(biāo)操作是否已全部結(jié)束,如果是則給予用戶順利通關(guān)或不幸失敗提示,然后等待玩家重新開(kāi)始新一關(guān)的指令。4.3.6游戲勝利的判斷在游戲程序中,游戲結(jié)束的判斷往往是非常重要的,它表示著進(jìn)行一次游戲的最終結(jié)果。對(duì)于本連連看游戲程序?qū)τ螒蚪Y(jié)束的判斷,自然是先檢查游戲區(qū)域中的小方塊是否都消除,由于某個(gè)位置是否由小方塊采用不同的數(shù)值進(jìn)行記錄,所以只需判斷各個(gè)小方塊位置的狀態(tài)就可以了。其次,由于本游戲程序的設(shè)計(jì)是按照連貫性進(jìn)行設(shè)計(jì)的,如果在游戲中,當(dāng)?shù)貓D中的所有部分都被淘汰時(shí),則應(yīng)自動(dòng)執(zhí)行下一個(gè)級(jí)別。在這里,我們可以通過(guò)if和else抉擇。當(dāng)游戲沒(méi)有完成,時(shí)間已經(jīng)被使用完畢或者當(dāng)沒(méi)有生命值,為一個(gè)死局,即沒(méi)有一組棋子可以被消除,則游戲依然結(jié)束彈出游戲結(jié)束對(duì)話框。此外,應(yīng)把游戲結(jié)束的原因顯示在屏幕上,并應(yīng)將相應(yīng)的值添加到計(jì)數(shù)器進(jìn)行跟蹤,當(dāng)計(jì)數(shù)器值為0時(shí),觸發(fā)模式用于在游戲功能結(jié)束時(shí)終止游戲。圖4-13判斷游戲勝利如圖4-13所示,要判斷游戲的勝利,實(shí)現(xiàn)起來(lái)較為簡(jiǎn)單,只需對(duì)地圖中的所有區(qū)域的狀態(tài)進(jìn)行檢測(cè)即可判定。如果檢測(cè)到地圖中至少有兩個(gè)棋子還沒(méi)有被消除,則證明游戲沒(méi)有勝利。繼續(xù)檢查所有游戲區(qū)域,知道檢測(cè)出游戲區(qū)域內(nèi)的所有棋子都被消除了,這才說(shuō)明游戲勝利,即游戲結(jié)束。還有另一種情況,即整個(gè)游戲區(qū)域內(nèi)的棋子還沒(méi)有消除完畢,但是游戲時(shí)間到了,那么,也同樣彈出游戲結(jié)束對(duì)話框。(1)等待用戶的鼠標(biāo)輸入信息;(2)在定時(shí)器中,每次扣除游戲的限制時(shí)間一秒。(3)當(dāng)游戲時(shí)間為零秒時(shí),彈出游戲失敗結(jié)束提示,并根據(jù)用戶選擇重新開(kāi)始游戲或者結(jié)束游戲。(4)在用戶消除一對(duì)棋子后,就對(duì)當(dāng)前棋盤數(shù)組進(jìn)行遍歷。如果是空,如果是空,說(shuō)明用戶已經(jīng)全部消除完畢。調(diào)用升級(jí)處理。如果不是空,則返回步驟(1)。(5)當(dāng)整個(gè)游戲區(qū)域內(nèi)所有的棋子都被消除后,則游戲勝利。系統(tǒng)調(diào)試與測(cè)試5.1程序調(diào)試在編程過(guò)程中,不可避免地會(huì)出現(xiàn)一些錯(cuò)誤。對(duì)于有錯(cuò)誤語(yǔ)句的程序來(lái)說(shuō),編譯器將在編譯程序時(shí)自動(dòng)提示并要求立即更正。所以,此類錯(cuò)誤很容易找到并及時(shí)改正。但另一種錯(cuò)誤是由于程序運(yùn)行時(shí)的操作不正確或邏輯錯(cuò)誤。這種錯(cuò)誤是非常隱蔽的,有時(shí)出現(xiàn),有時(shí)不出現(xiàn),因此,研究這種動(dòng)態(tài)錯(cuò)誤是非常耗時(shí)和費(fèi)力的。5.2程序的測(cè)試測(cè)試的主要內(nèi)容:主菜單和界面顯示功能的測(cè)試測(cè)試主菜單和界面顯示是否成功。測(cè)試步驟如下:一是運(yùn)行連連看程序并開(kāi)始調(diào)試:其次,程序啟動(dòng)后,將顯示如圖5-1所示的樣子。圖5-1主菜單和界面顯示功能測(cè)試游戲地圖的測(cè)試游戲地圖的測(cè)試則是要在整個(gè)游戲區(qū)域內(nèi)看到一個(gè)由若干個(gè)空方塊構(gòu)成的地圖,如圖5-2所示,而且每個(gè)空塊包含不同的棋子圖案。這些具有不同圖案的方塊根據(jù)某些規(guī)則分布在整個(gè)游戲區(qū)域的不同位置,每個(gè)小塊都有與其相對(duì)應(yīng)的相同小塊。圖5-2地圖測(cè)試圖案方塊的連接測(cè)試:用鼠標(biāo)選擇兩個(gè)小圖塊,若它們之間沒(méi)有障礙物,且又在同一條直線上,那么就可以用一條直線消除;若是不在同一條直線上,但是中間也沒(méi)有其他的障礙物,則可以利用折線進(jìn)行消除如圖5-3所示。如果以上兩種情況都沒(méi)有出現(xiàn),則返回重新尋找可以消除的棋子即小圖塊。圖5-3連接測(cè)試鼠標(biāo)交互功能實(shí)現(xiàn)的測(cè)試游戲開(kāi)始后,在用戶用鼠標(biāo)進(jìn)行了兩次選擇之后,我們要看到程序自己給出的判斷,兩次選舉中的圖案能消除或者不能消除,若能消除則要進(jìn)行消除。如圖5-4所示,用戶如果選擇的是兩個(gè)相同的棋子,就進(jìn)行消除,如果不能消除的話要重新進(jìn)行選擇。圖5-4交互功能測(cè)試游戲勝利的測(cè)試在整個(gè)游戲區(qū)域內(nèi),如果發(fā)現(xiàn)沒(méi)有可供選擇的棋子了,也就是整個(gè)游戲區(qū)域內(nèi)的棋子被全部消除,則立即彈出游戲勝利對(duì)話框,用戶可以選擇再來(lái)一局,也可以選擇退出游戲。如圖5-5和5-6所示,如果還有兩個(gè)及以上的棋子,則游戲還沒(méi)有結(jié)束,用戶可以繼續(xù)玩這局游戲直到游戲勝利。圖5-5游戲勝利的測(cè)試1圖5-6游戲勝利的測(cè)試2總結(jié)與展望6.1總結(jié)此次畢業(yè)設(shè)計(jì)是采用C++來(lái)設(shè)計(jì)并實(shí)現(xiàn)連連看游戲的功能,對(duì)該程序的設(shè)計(jì)思路,算

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論