連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、合肥學(xué)院2012 屆 畢 業(yè) 論 文(設(shè)計(jì))論文(設(shè)計(jì))題目連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)院系名稱計(jì)算機(jī)科學(xué)與技術(shù)系專業(yè)(班級(jí))計(jì)算機(jī)科學(xué)與技術(shù)2008級(jí)本科1班姓名(學(xué)號(hào)) (0804011042)指導(dǎo)教師高玲玲 系負(fù)責(zé)人袁 暋 完成時(shí)間2012-5-10 34連連看游戲的設(shè)計(jì)與實(shí)現(xiàn)中 文 摘 要 從2001年開始,游戲作為一種產(chǎn)業(yè)已經(jīng)漸漸地為中國(guó)大眾接受,它所帶來的經(jīng)濟(jì)效益和社會(huì)效益更是人們之前所沒有估計(jì)到的,當(dāng)游戲作為一種很重要的娛樂手段被大眾接受時(shí),游戲產(chǎn)業(yè)就已經(jīng)注定會(huì)帶來巨大的經(jīng)濟(jì)效益。 連連看游戲是一款經(jīng)典小游戲,操作簡(jiǎn)單,適合所有玩家。連連看游戲軟件在Linux環(huán)境下用QT框架設(shè)計(jì)開發(fā),

2、可以實(shí)現(xiàn)初始化界面,用戶使用鼠標(biāo)點(diǎn)擊兩張相同圖案的小方塊進(jìn)行消除,并有多種地圖樣式和道具選擇,豐富了游戲的娛樂性。此連連看游戲程序界面美觀,操作簡(jiǎn)單,具有一定的趣味性,是一款老少皆宜的休閑佳品。 本文通過需求分析與方案論證,首先對(duì)開發(fā)連連看游戲程序進(jìn)行初步的分析,然后通過總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)論述了系統(tǒng)的開發(fā)和實(shí)現(xiàn)過程。關(guān)鍵詞:連連看;單機(jī)游戲;游戲開發(fā)Design and Implementation of Lianliankan gameAbstractBeginning in 2001, the game as an industry has been gradually for the C

3、hinese public acceptance, economic and social benefits it brings, is not estimated in before the people to the game as a very important means of entertainment the publicaccepted, the game industry has been destined to bring huge economic benefits.    Lianliankan game is a classic

4、 game, simple operation, suitable for all players. Lianliankan game software design and development of the QT framework in the Linux environment, you can achieve the initialization interface, the user uses the mouse to click the small box with two identical patterns to eliminate, and a variety of ma

5、p styles and props select, rich game entertaining. Lianliankan games beautiful interface, easy operation, with some interesting, is a leisure ages to share.    This article through the demand analysis and the project concept demonstration, first to develops looked again and again

6、 the game procedure carries on the preliminary analysis, then elaborated system's performance history through the system design and the detailed design as well as realizes the process.KEY WORDS: lianliankan ;stand-alone game; game-developme目 錄中文摘要IAbstractII第一章 緒論11.1 課題背景11.2 課題意義11.3 國(guó)內(nèi)外發(fā)展情況11

7、.4 課題內(nèi)容及目標(biāo)2第二章 需求分析與方案論證32.1 可行性分析32.1.1 技術(shù)可行性分析32.1.2 經(jīng)濟(jì)可行性分析32.1.3 操作可行性分析42.1.4 分析結(jié)論42.2 需求分析4第三章 總體設(shè)計(jì)53.1 開發(fā)工具和運(yùn)行環(huán)境53.1.1 開發(fā)工具53.1.2 運(yùn)行環(huán)境53.2 功能模塊設(shè)計(jì)53.3 算法設(shè)計(jì)63.3.1 游戲地圖數(shù)據(jù)的設(shè)計(jì)63.3.2 圖案方塊連接判斷的設(shè)計(jì)73.3.3 游戲勝利判斷算法設(shè)計(jì)83.3.4 游戲道具算法設(shè)計(jì)83.4 相關(guān)技術(shù)與重點(diǎn)難點(diǎn)83.4.1 相關(guān)技術(shù)83.4.2 系統(tǒng)的重點(diǎn)難點(diǎn)9第四章 詳細(xì)設(shè)計(jì)104.1 功能模塊設(shè)計(jì)與實(shí)現(xiàn)104.1.1 游戲

8、模塊設(shè)計(jì)與實(shí)現(xiàn)104.1.2 選項(xiàng)模塊設(shè)計(jì)與實(shí)現(xiàn)104.1.3 游戲地圖數(shù)據(jù)的設(shè)計(jì)與實(shí)現(xiàn)134.1.4 圖案方塊的判斷連接的設(shè)計(jì)與實(shí)現(xiàn)164.1.5 游戲結(jié)束判斷功能的設(shè)計(jì)與實(shí)現(xiàn)214.1.6 鼠標(biāo)交互功能的設(shè)計(jì)與實(shí)現(xiàn)234.2 人機(jī)界面設(shè)計(jì)28第五章 系統(tǒng)調(diào)試與軟件測(cè)試295.1 系統(tǒng)調(diào)試295.2 軟件測(cè)試29結(jié) 論33參考文獻(xiàn)34致 謝35合肥學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系畢業(yè)論文第一章 緒論1.1 課題背景 連連看是一款風(fēng)靡很久的單機(jī)版游戲,對(duì)于玩家并不陌生,游戲規(guī)則非常簡(jiǎn)單,只要選擇一對(duì)相同圖案的卡片連接起來,連接路徑若避開其他圖片,且不超過兩次轉(zhuǎn)彎則消除此對(duì)卡片,容易上手。改造成網(wǎng)絡(luò)游戲增

9、強(qiáng)了該游戲的競(jìng)技性,把原先單人在規(guī)定時(shí)間內(nèi)完成游戲改變成了玩家間相互制約,相互競(jìng)爭(zhēng),可以多人組隊(duì)合作完成游戲,增強(qiáng)了游戲的技巧性、競(jìng)技性、合作性。 連連看來源于街機(jī)游戲,是給一堆圖案中的相同圖案進(jìn)行配對(duì)的簡(jiǎn)單游戲,一位叫做朱俊的網(wǎng)友將這種形式搬到了PC上,立刻成為辦公一族的新寵,并迅速傳遍了世界各地。飽受工作壓力的人們沒有太多的時(shí)間進(jìn)行復(fù)雜的游戲,而對(duì)于這種動(dòng)動(dòng)鼠標(biāo)就能過關(guān)的游戲情有獨(dú)鐘。1.2 課題意義 開發(fā)連連看游戲程序的目的是為了滿足人們休閑的需要,在緊張工作之余休閑類的小游戲能夠給人帶來最大程度的放松,也可以增進(jìn)人們之間的交流,溝通,通過游戲還可以認(rèn)識(shí)更多的朋友,也可以到達(dá)跨省、跨市,

10、甚至跨國(guó)間人們互相娛樂的目的,而且小游戲還不會(huì)浪費(fèi)計(jì)算機(jī)過多的資源,不像大型游戲占資源和牽扯精力,可謂工作娛樂兩不誤1。 通過此次課題的設(shè)計(jì),掌握如何制怍一個(gè)游戲軟件,以及制作游戲軟件的整個(gè)流程,制作游戲軟件的步驟,為以后的就業(yè)工作打下基礎(chǔ)。1.3 國(guó)內(nèi)外發(fā)展情況 電腦游戲在我國(guó)起步雖晚,發(fā)展卻并不為慢。作為后來者,國(guó)內(nèi)業(yè)界同行們的信心、勇氣和緊迫感曾經(jīng)著實(shí)令玩家們欣慰。讓我們記住這些在國(guó)產(chǎn)游戲事業(yè)上曾經(jīng)灑過汗水的年輕人,正是他們的創(chuàng)新精神和勇氣,才使得國(guó)產(chǎn)游戲在并不寬松的環(huán)境下蓬勃發(fā)展至今。與單機(jī)游戲日漸衰落正相反的是,網(wǎng)絡(luò)游戲方興未艾,遍地開花。但是,與此同時(shí),我們也看到了,在繁榮的背后,

11、潛在的危機(jī),一是來自國(guó)內(nèi)游戲制作者在游戲制作理念上的不足和困乏,另外就是資金問題,這兩方面與歐美游戲制作差距很大。 在美國(guó),集中了許多計(jì)算機(jī)軟件的設(shè)計(jì)人才,他們工作之余,時(shí)常喜愛編一種能與人斗智的“游戲”,以此來鍛煉編程的能力。這種“游戲”花樣繁多,但其特點(diǎn)都是利用計(jì)算機(jī)軟件事先設(shè)計(jì)好的“分析”、“判斷”能力反過來與人較量2。 連連看這款游戲來源于中國(guó),現(xiàn)在已風(fēng)靡全世界。連連看游戲從出現(xiàn)到現(xiàn)在已經(jīng)更新了好多版本,比較知名的有蔬果連連看、水晶連連看、阿達(dá)連連看和寵物連連看等不同版本,現(xiàn)在已經(jīng)有FLASH版本,游戲起來更加方便,無需安裝,打開網(wǎng)頁即可游戲,最近更是出現(xiàn)網(wǎng)絡(luò)版本,QQ連連看就是這樣一

12、款連連看游戲的網(wǎng)絡(luò)版本,可以通過網(wǎng)絡(luò)與其他玩家一起進(jìn)行游戲,而且地圖更為繁多,道具更為豐富,極大地增強(qiáng)了游戲的樂趣3。1.4 課題內(nèi)容及目標(biāo) 連連看游戲主要是鼠標(biāo)兩次蠃擊的圖片能否消去的問題。當(dāng)前,前提是點(diǎn)擊兩張相同的圖片,若點(diǎn)擊的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉(zhuǎn)彎點(diǎn)不多于兩個(gè)的路徑,就可以消去;如果沒有,則不予處理。此程序的課題內(nèi)容及目標(biāo)如下。 (l)有關(guān)卡的升級(jí),每關(guān)游戲勝利后自動(dòng)進(jìn)入下一關(guān)并且游戲時(shí)間減少20秒。 (2)隨機(jī)生成游戲界面。 (3)方塊選中后圖片要有突出顯示。 (4)選擇兩個(gè)圖案相同的方塊,并以不超過兩個(gè)轉(zhuǎn)彎的連

13、線將它們連接起來,便可以消除這對(duì)方塊,每一局里玩家需要在規(guī)定的時(shí)間內(nèi)消除所有的方塊,當(dāng)完成任務(wù)后,才能進(jìn)入下一關(guān)卡。 (5)當(dāng)沒有可以消除的圖案時(shí)可以使用重置功能,每次使用重置次數(shù)扣一點(diǎn),游戲時(shí)間為0時(shí)游戲結(jié)束。 (6)選擇提示功能時(shí),游戲自動(dòng)突出顯示兩個(gè)可以消除的方塊,并且提示點(diǎn)數(shù)扣掉一點(diǎn)。 (7)可以控制游戲背景音樂開關(guān),并且可以根據(jù)自己喜好更改背景音樂。 (8)游戲設(shè)置高手榜,破記錄時(shí)予以記載。 通過對(duì)以上功能的實(shí)現(xiàn),達(dá)到界面美觀,操作簡(jiǎn)單,增加游戲的娛樂性、趣味性,使玩家對(duì)此游戲產(chǎn)生興趣。第二章 需求分析與方案論證2.1 可行性分析可行性分析(feasibility study),世界

14、上普遍采用的一種研究工程項(xiàng)目是否可行的科學(xué)。它通過各種有效的方法,對(duì)工程項(xiàng)目進(jìn)行分析,從技術(shù)、經(jīng)濟(jì)、財(cái)務(wù)等方面加以評(píng)價(jià),最終給投資決策者提供是否選擇該項(xiàng)目進(jìn)行投資的依據(jù)??尚行苑治龅慕裹c(diǎn)是:要站在咨詢的立場(chǎng)上;站在中立客觀立場(chǎng)上得出結(jié)論4。2.1.1 技術(shù)可行性分析 設(shè)計(jì)連連看游戲程序需要通過菜單和鼠標(biāo)對(duì)游戲進(jìn)行操控,游戲的界面需要大量的繪圖機(jī)制,以達(dá)到操作簡(jiǎn)單、界面美觀的目的。 Qt是一個(gè)1991年由奇趣科技開發(fā)的跨平臺(tái)C+圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程式,也可用于開發(fā)非GUI程式,比如控制臺(tái)工具和服務(wù)器。Qt 的良好封裝機(jī)制使得 Qt 的模塊化程度非常高,可重用性較好,

15、對(duì)于用戶開發(fā)來說是非常 方便的。 Qt 提供了一種稱為 signals/slots 的安全類型來替代 callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。 Qt包括多達(dá) 250 個(gè)以上的 C+ 類,還提供基于模板的 collections, serialization, file, I/O device, directory management, date/time 類。甚至還包括正則表達(dá)式的處理 功能。作為 Qt 開發(fā)跨平臺(tái) IDE 的 Qt Creator包含了開發(fā)跨平臺(tái)應(yīng)用程序所需的全部功能。所以,可以通過Qt Creator實(shí)現(xiàn)菜單制作、鼠標(biāo)操控和繪圖功能鼠標(biāo)交互功能的實(shí)現(xiàn)可

16、以通過對(duì)鼠標(biāo)左鍵被按下時(shí)觸發(fā)的命令消息進(jìn)行攔截,并重新寫該消息的處理函數(shù)實(shí)現(xiàn)11。 綜上所述,對(duì)于在技術(shù)上使用QT4.7.4編寫連連看游戲是可行的。2.1.2 經(jīng)濟(jì)可行性分析 開發(fā)本程序首先需要計(jì)算機(jī)一臺(tái),奔騰3以上CPU,256MB以上內(nèi)存,40G以上硬盤即可以,大約五千元左右。軟件方面,QT4.7.4簡(jiǎn)體中文版可以從官方網(wǎng)站下載,正版操作系統(tǒng)Linux簡(jiǎn)體中文專業(yè)版價(jià)格大約在兩千元左右,購(gòu)買書籍二百元,開發(fā)此程序需要的時(shí)間大約需要三個(gè)月左右的時(shí)間,其中所消耗的人工費(fèi)每月一千元,共計(jì)三千元,所以開發(fā)此游戲程序的成本共計(jì)一萬元左右。 開發(fā)出的產(chǎn)品倘若在因特網(wǎng)下載,一個(gè)注冊(cè)碼費(fèi)用為十元,只需下載

17、一千次即可收回成本。在高速發(fā)展的信息時(shí)代,一千次的下載不成問題。所以,從經(jīng)濟(jì)角度來講,開發(fā)本程序是可行的。2.1.3 操作可行性分析連連看游戲,只要將相同圖案的兩張方塊用三根以內(nèi)的直線連在一起就可以消除,規(guī)則簡(jiǎn)單容易上手。游戲速度節(jié)奏快,畫面清晰可愛,適合不同年齡的玩家。豐富的道具加入,增強(qiáng)游戲的競(jìng)爭(zhēng)性。多樣式的地圖,使玩家在各個(gè)游戲水平都可以導(dǎo)找到挑戰(zhàn)的目標(biāo),長(zhǎng)期地保持游戲的新鮮感。并且有提示和重列次數(shù)的獎(jiǎng)勵(lì)。對(duì)于用戶交互方式,這里選擇鼠標(biāo)交互方式。下面簡(jiǎn)單描述一下通過實(shí)現(xiàn)的功能。鼠標(biāo)選取兩個(gè)圖案方塊后,程序?qū)⒆詣?dòng)判斷所選定的兩個(gè)方塊是否能進(jìn)行抵消操作,能進(jìn)行則抵消。在游戲過程中,我們不斷重

18、復(fù)上面描述的功能,直到游戲的勝利結(jié)束??梢哉f,對(duì)于玩家操作起來很容易上手,即使是年齡大的玩家,也會(huì)通過很短時(shí)間的適應(yīng)而熟悉連連看游戲的操作。所以,從操作可行性角度分析開發(fā)此程序是可行的。2.1.4 分析結(jié)論以上對(duì)于開發(fā)此程序分別從技術(shù)角度、經(jīng)濟(jì)角度和操作性角度進(jìn)行了全面的分析,技術(shù)上使用QT Creator進(jìn)行開發(fā),通過網(wǎng)絡(luò)下載回收成本,游戲畫面美觀、操作性強(qiáng),適合所有人不同年齡段的玩家進(jìn)行娛樂。 縱上所述,以QT Creator為工具開發(fā)連連看游戲的方案是可行的。2.2 需求分析 關(guān)于連連看的功能描述如下:運(yùn)行游戲并自動(dòng)進(jìn)行初始化工作,將游戲區(qū)域上方作為信息顯示區(qū)域,并且通過菜單功能進(jìn)行操控

19、,菜單功能包括開始新游戲,開關(guān)和更改背景音樂,提示和重列功能以及積分榜功能。游戲區(qū)域中心區(qū)域作為小方塊的地圖,由多種人物圖案組成分布在不同位置,界面設(shè)有關(guān)卡、提示次數(shù)、重列次數(shù)、剩余時(shí)間以及積分的顯示。玩家可以通過選取相同的兩個(gè)物件來對(duì)他們進(jìn)行消除操作,直到將游戲區(qū)域中的所有方塊對(duì)都被消除后為勝利,并且給予破記錄后的提示功能。 對(duì)于資源的需求,圖片資源必不可少,游戲中的小方塊是一組圖片資源,選用兩組圖案和排列完全相同但是背景色不同的兩組圖片作為小方塊的初始狀態(tài)和選定狀態(tài),每張圖片共20個(gè)人物。為了使游戲更具娛樂性,背景音樂及音效的添加也是必不可少的,所以此游戲程序也加入了的音樂文件資源。第三章

20、 總體設(shè)計(jì)3.1 開發(fā)工具和運(yùn)行環(huán)境3.1.1 開發(fā)工具 本程序采用QT Creator作為開發(fā)工具。 Qt Creator是跨平臺(tái)的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購(gòu)后推出的一款新的輕量級(jí)集成開發(fā)環(huán)境(IDE)。此 IDE 能夠跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根據(jù)官方描述,Qt Creator 的設(shè)計(jì)目標(biāo)是使開發(fā)人員能夠利用 Qt 這個(gè)應(yīng)用程序框架更加快速及輕易的完成開發(fā)任務(wù)。在功能方面,Qt Creator 包括項(xiàng)目生成向?qū)А⒏呒?jí)的 C+ 代碼編輯器、瀏覽文件及類的工具、集成了 Qt

21、 Designer、Qt Assistant、Qt Linguist、圖形化的 GDB 調(diào)試前端,集成 qmake 構(gòu)建工具等。集成了特定于 Qt 的功能,如信號(hào)與槽 (Signals & Slots)圖示調(diào)試器,對(duì) Qt 類結(jié)構(gòu)可一目了然集成了 Qt Designer 可視化布局和格式構(gòu)建器只需單擊一下就可生成和運(yùn)行 Qt 項(xiàng)目6。3.1.2 運(yùn)行環(huán)境運(yùn)行環(huán)境首先需要操作系統(tǒng)的支持,開發(fā)本程序使用虛擬Linux操作系統(tǒng),及在Windows下安裝虛擬機(jī),再裝上Ubuntu10.10系統(tǒng),對(duì)顯卡要求不高,都能滿足顯卡需求,還有音響用于播放音樂。保證了以上的配置,就能保證使用QT Crea

22、tor在虛擬的Ubuntu系統(tǒng)中開發(fā)連連看游戲程序環(huán)境的可行性。3.2 功能模塊設(shè)計(jì)本程序共分為兩個(gè)個(gè)模塊,即游戲模塊、圖形界面顯示模塊。 游戲模塊可分為新游戲子模塊、開關(guān)背景音樂子模塊、更改背景音樂子模塊。提示子模塊、重列子模塊、積分榜子模塊。提示子模塊和重列子模塊作為游戲的特殊功能,增加游戲的趣味性。音樂子模塊用以清晰的顯示音樂效果。積分榜子模塊用于記錄游戲的積分信息,并且對(duì)于破記錄給予提示。圖形界面顯示模塊包括棋子的顯示、菜單的顯示。棋子顯示子模塊用于布置整個(gè)游戲界面。菜單顯示子模塊能顯示游戲的基本操作功能和游戲剩余時(shí)間、剩余重置和提示次數(shù)、游戲級(jí)別、游戲分?jǐn)?shù)的顯示和英雄榜的顯示。改變背

23、景音樂功能連連看棋子操作功能播放音樂功能游戲升級(jí)功能主界面顯示功能英雄榜功能棋子顯示菜單顯示更新記錄棋子換盤棋子連接提示圖3-1 功能模塊圖3.3 算法設(shè)計(jì)3.3.1 游戲地圖數(shù)據(jù)的設(shè)計(jì) 對(duì)于整個(gè)游戲區(qū)域,可以把它看作一個(gè)是由信息顯示區(qū)域和圖案方塊游戲區(qū)域組成的地圖。圖案方塊游戲區(qū)域由圖案小方塊零散地分布在地圖的不同位置區(qū)域,并且每一個(gè)圖案小方塊都有與其對(duì)應(yīng)的完全一樣的另外一個(gè)小方塊。圖3-2 游戲地圖設(shè)計(jì)圖圖案方塊游戲區(qū)域被抽象成一個(gè)有坐標(biāo)位置屬性的平面,平面上零散的地分布著若干個(gè)小方塊,并且這些小方塊的人物圖案起碼是成對(duì)出現(xiàn)的,可以把游戲區(qū)域地圖用一個(gè)數(shù)組arr_mapij來表示,arr_

24、mapij是把地圖設(shè)計(jì)成一個(gè)動(dòng)態(tài)分配的int整型一維數(shù)組,對(duì)地圖中的行列數(shù)的表達(dá),用一個(gè)轉(zhuǎn)換法即可。 在游戲開始前,需要對(duì)游戲的地圖進(jìn)行初始化。設(shè)計(jì)一個(gè)初始化的類,信息的顯示直接調(diào)用窗口類即可。對(duì)于方塊地圖游戲區(qū)域的初始,設(shè)計(jì)為10x8大小的區(qū)域。人物的種類共計(jì)20個(gè)圖案,首先通過srand ()設(shè)定隨機(jī)數(shù)發(fā)生,然后通過rand()函數(shù)進(jìn)行圖片種類數(shù)量的選擇。至此,游戲地圖設(shè)計(jì)完畢。3.3.2 圖案方塊連接判斷的設(shè)計(jì) 對(duì)于選中的兩個(gè)方塊的銷毀,它們必須符合以下三個(gè)條件: (l)選中的兩個(gè)圖案相同。 (2)選中的兩個(gè)方塊之間在沒有障礙物的情況下,可以用若干垂直的直線線段連起來。 (3)這些將它們

25、連接起來的直線線段的折點(diǎn)不超過兩個(gè)。 同種物件的連接方式大致可以分成以下3種: (l)直連方式。在直連方式中,必須要求所選定的兩個(gè)方塊在同一水平直線上,并且兩個(gè)方塊之間沒有任何其它的圖案方塊。在3種連接方式中,直連方式是最簡(jiǎn)單的。 (2)有一個(gè)折點(diǎn)的垂直線段連接。所選定的兩個(gè)方塊如果通過折點(diǎn)的方式連接,那么對(duì)于折點(diǎn)來說,每個(gè)折點(diǎn)必定有且至少有一個(gè)坐標(biāo)是和其一個(gè)目標(biāo)點(diǎn)是相同的,即折點(diǎn)必定在兩個(gè)目標(biāo)點(diǎn)所在的X方向或Y方向的直線上。此外,對(duì)于一個(gè)折點(diǎn)連接的情況,折點(diǎn)應(yīng)該為第一個(gè)選中方塊的橫向現(xiàn)或縱向線與第二個(gè)選中方塊的縱向線或橫向線相交而得出。還需說明的是,是這些所有可能連接的交線經(jīng)過的每一個(gè)圖案方

26、塊區(qū)域,它們都不允許被障礙物所阻擋。 (3)有兩個(gè)折點(diǎn)的垂直線段連接。這種方式的兩個(gè)折點(diǎn)所連成的直線與兩物件的直接連線可以構(gòu)成平行線,因此可以根據(jù)這個(gè)規(guī)律,將達(dá)條水平線在游戲區(qū)域允許的條件上下移動(dòng),然后通過判斷整條帶垂直折點(diǎn)的曲線之間有無障礙物方式來確定是否可以聯(lián)通。 經(jīng)過上面較為詳細(xì)的分析后,對(duì)選定的方塊是否可以作抵消操作可以這樣去設(shè)計(jì),首先,對(duì)簡(jiǎn)單的直連情況進(jìn)行判斷,看其是否符合條件,假如不能,再加深一個(gè)級(jí)別的復(fù)雜度,對(duì)一個(gè)折點(diǎn)的情況進(jìn)行判斷,如果不符合條件,再對(duì)兩個(gè)折點(diǎn)的情況進(jìn)行判斷。3.3.3 游戲勝利判斷算法設(shè)計(jì) 與前面的兩個(gè)選定方塊能否抵消的判斷功能相比,它的實(shí)現(xiàn)顯得相當(dāng)簡(jiǎn)單,只需

27、對(duì)圖案方塊游戲區(qū)域所有方塊進(jìn)行判斷就可以了,只要檢測(cè)到地圖中還有一個(gè)圖案方塊還沒有被抵消,則證明游戲還沒有結(jié)束,完成判斷。如果時(shí)間耗盡,則終止游戲。如果地圖中的所有小方塊都被消除,則證明游戲已經(jīng)勝利,如果打破記錄,會(huì)彈出提示。3.3.4 游戲道具算法設(shè)計(jì) 在此游戲中的道具有重排和提示兩種,在游戲進(jìn)行的過程中,如果玩家暫時(shí)找不到可解的小方塊,就可以使用道具功能。重排功能是在原小方塊位置不變的情況下,重新排列圖案的順序,以找到可解的小方塊。提示功能用于提示玩家一組可解的小方塊,便于玩家可以繼續(xù)進(jìn)行游戲。 對(duì)于重排功能的實(shí)現(xiàn),首先將所有小方塊的位置編號(hào)暫時(shí)保存到內(nèi)存中,然后隨機(jī)地分布在有小方塊的位置

28、上,通過隨機(jī)函數(shù)實(shí)現(xiàn)此功能。 對(duì)于提示功能,首先編寫一個(gè)檢查連接的類,判斷選中的兩個(gè)小方塊是否可以進(jìn)行消除操作,這個(gè)類可以被提示功能函數(shù)調(diào)用,也可以在檢查是否有解時(shí)被調(diào)用。在提示功能中,首先調(diào)用檢查連接的類查找到一個(gè)可以連接的小方塊,并且標(biāo)記,然后更改其為選中狀態(tài),即改變顏色以達(dá)到醒目,用來提示玩家。3.4 相關(guān)技術(shù)與重點(diǎn)難點(diǎn)3.4.1 相關(guān)技術(shù) 信號(hào)與槽機(jī)制信號(hào)和槽機(jī)制是 QT 的核心機(jī)制,要精通 QT 編程就必須對(duì)信號(hào)和槽有所了解。信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是 QT 的核心特性,也是 QT 區(qū)別于其它工具包的重要地方。信號(hào)和槽是 QT 自行定義的一種通信機(jī)制,它獨(dú)立于

29、標(biāo)準(zhǔn)的 C/C+ 語言,因此要正確的處理信號(hào)和槽,必須借助一個(gè)稱為 moc(Meta Object Compiler)的 QT 工具,該工具是一個(gè) C+ 預(yù)處理程序,它為高層次的事件處理自動(dòng)生成所需要的附加代碼5。在我們所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一個(gè)回調(diào)函數(shù)用于響應(yīng)它們能觸發(fā)的每個(gè)動(dòng)作,這個(gè)回調(diào)函數(shù)通常是一個(gè)指向某個(gè)函數(shù)的指針。但是,在 QT 中信號(hào)和槽取代了這些凌亂的函數(shù)指針,使得我們編寫這些通信程序更為簡(jiǎn)潔明了。 信號(hào)和槽能攜帶任意數(shù)量和任意類型的參數(shù),他們是類型完全安全的,不會(huì)像回調(diào)函數(shù)那樣產(chǎn)生 core dumps。所有從 QObject 或其子

30、類 ( 例如 Qwidget) 派生的類都能夠包含信號(hào)和槽。當(dāng)對(duì)象改變其狀態(tài)時(shí),信號(hào)就由該對(duì)象發(fā)射 (emit) 出去,這就是對(duì)象所要做的全部事情,它不知道另一端是誰在接收這個(gè)信號(hào)。這就是真正的信息封裝,它確保對(duì)象被當(dāng)作一個(gè)真正的軟件組件來使用。槽用于接收信號(hào),但它們是普通的對(duì)象成員函數(shù)。一個(gè)槽并不知道是否有任何信號(hào)與自己相連接。而且,對(duì)象并不了解具體的通信機(jī)制。你可以將很多信號(hào)與單個(gè)的槽進(jìn)行連接,也可以將單個(gè)的信號(hào)與很多的槽進(jìn)行連接,甚至于將一個(gè)信號(hào)與另外一個(gè)信號(hào)相連接也是可能的,這時(shí)無論第一個(gè)信號(hào)什么時(shí)候發(fā)射系統(tǒng)都將立刻發(fā)射第二個(gè)信號(hào)??傊?,信號(hào)與槽構(gòu)造了一個(gè)強(qiáng)大的部件編程機(jī)制。3.4.2

31、 系統(tǒng)的重點(diǎn)難點(diǎn) 此程序的重點(diǎn)是鼠標(biāo)的交互功能。通過ClassWizard對(duì)鼠標(biāo)左鍵被按下時(shí)觸發(fā)的命令消息進(jìn)行攔截技術(shù)來實(shí)現(xiàn)。因?yàn)橛螒虻娜窟^程需要依靠鼠標(biāo)操作,所以鼠標(biāo)交互功能的設(shè)計(jì)是否人性化就成了此連連看游戲程序的重點(diǎn)。此程序的難點(diǎn)是連連看游戲程序的連接線功能。首先編寫一個(gè)創(chuàng)建路徑的類,通過這個(gè)類使游戲中消除小方塊時(shí)能夠找到一條可以連接的路徑進(jìn)行連線,然后通過一個(gè)畫線的類進(jìn)行連接。第四章 詳細(xì)設(shè)計(jì)4.1 功能模塊設(shè)計(jì)與實(shí)現(xiàn) 此連連看游戲程序根據(jù)模塊的性質(zhì)分為以下幾大類: 基本功能模塊,主要通過游戲的菜單顯示出來,分為游戲模塊、選項(xiàng)模塊。游戲繪圖模塊,包括小方塊圖案的載入以及游戲地圖背景的繪

32、制。游戲交互模塊,主要是快捷鍵和鼠標(biāo)交互功能的實(shí)現(xiàn)。游戲算法模塊,包括游戲的連接判斷算法以及游戲勝利判斷的算法。4.1.1 游戲模塊設(shè)計(jì)與實(shí)現(xiàn)游戲模塊中對(duì)于地圖,初級(jí)設(shè)為10x8的地圖,即橫向?yàn)槭畟€(gè)小方塊,縱向?yàn)榘藗€(gè)小方塊。由于地圖的大小為十行八列共80個(gè)小方塊,每個(gè)種類的人物設(shè)定出現(xiàn)4次為偶數(shù),這樣就可以實(shí)現(xiàn)成對(duì)的出現(xiàn)了,在游戲中可以完成配對(duì)。這樣以來,共80個(gè)小方塊且每個(gè)人物出現(xiàn)4次,也就是說,共有20個(gè)人物7。4.1.2 選項(xiàng)模塊設(shè)計(jì)與實(shí)現(xiàn) 選項(xiàng)模塊中分為提示子模塊、重列子模塊、音樂子模塊、更改背景音樂子模塊以及積分榜子模塊。對(duì)于提示子模塊和重列子模塊,作為道具可以隨時(shí)進(jìn)行調(diào)用,并且有次

33、數(shù)記錄,當(dāng)記錄次數(shù)到達(dá)零以下,立即給出提示。對(duì)于提示模塊,采用遍歷的方法進(jìn)行查找,首先遍歷同一種圖塊中出現(xiàn)在不同坐標(biāo)位置的圖案小方塊,以此模擬第一次點(diǎn)擊,然后遍歷同一種圖塊的剩余的不同坐標(biāo)圖案小方塊的出現(xiàn),以此模擬第二次點(diǎn)擊,判斷前后2次模擬點(diǎn)擊選中的不同位置的同種圖塊能否連通,能連通則高亮顯示這2個(gè)圖塊,提示完成;否則,繼續(xù)檢測(cè)連通情況直至找到為止。對(duì)于重列模塊,首先通過遍歷的方法,依次讀取各個(gè)位置的圖片,增加到臨時(shí)的圖片列表中,然后再隨機(jī)的循環(huán)依次在原來有圖片的地方添加圖片,從圖片列表中刪除用過的圖片,不刪除就會(huì)有可能重復(fù)了,最后進(jìn)行刷新即可。流程圖如圖4.1和圖4.2所示。開始讀取各個(gè)圖

34、片坐標(biāo)保存到臨時(shí)列表中在臨時(shí)列表讀取一個(gè)圖片在原有位置添加圖片臨時(shí)地圖是否讀取完畢重列次數(shù)減少一點(diǎn)結(jié)束是否圖4-1重列功能判斷流程圖開始找到一個(gè)圖案方塊模擬第一次點(diǎn)擊遍歷這種圖片剩余方塊模擬第二次點(diǎn)擊圖案是否能夠消除對(duì)方塊進(jìn)行消除對(duì)方塊進(jìn)行消除結(jié)束圖案是否遍歷完成無可提示的連接否是是否圖4-2提示功能判斷流程圖 背景音樂子模塊通過使用Phonon這個(gè)多媒體框架來提供一般影音多媒體檔案的播放。再通過調(diào)用MediaObject類進(jìn)行音樂的播放與暫停。void MainWindow:on_actionBackSound_toggled(bool arg1) if( arg1 ) mediaObjec

35、t->play(); /音樂開始 else mediaObject->pause(); /音樂暫停改變背景音樂子模塊通過調(diào)用QfileDialog類來提供一個(gè)可以用于選擇音樂文件的對(duì)話框。void MainWindow:on_actionChangeBackSound_triggered()QString fileName = QFileDialog:getOpenFileName(this, tr("Open File")"./",tr("Sounds (*.wav *.mp3)"); /打開文件夾 if( !fileN

36、ame.isEmpty() ) createSound(fileName); 對(duì)于積分榜子模塊,首先在游戲結(jié)束后彈出對(duì)話框提示輸入姓名,游戲的關(guān)卡數(shù)、積分自動(dòng)進(jìn)行統(tǒng)計(jì),然后保存到文檔中。對(duì)于記錄的提示問題,在一個(gè)游戲結(jié)束時(shí),會(huì)彈出對(duì)話框看得到的分?jǐn)?shù),這個(gè)對(duì)話框彈出來時(shí),從數(shù)據(jù)文件讀取出來,然后排序,比較一下當(dāng)前的分?jǐn)?shù),找到當(dāng)前分?jǐn)?shù)在鏈表中的位置然后進(jìn)行插入,但是在調(diào)出積分榜時(shí),首先要進(jìn)行一下排序,然后在表格中顯示出來。4.1.3 游戲地圖數(shù)據(jù)的設(shè)計(jì)與實(shí)現(xiàn) 整個(gè)游戲地圖分為信息顯示區(qū)域和游戲區(qū)域。信息顯示區(qū)域部分分布在整個(gè)地圖的上方,右側(cè)為關(guān)卡、重列剩余時(shí)間、分?jǐn)?shù)和提示信息,通過使用標(biāo)簽和各種控

37、件直接在ui圖形界面中畫出。對(duì)于游戲區(qū)域,被抽象成一個(gè)有坐標(biāo)位置屬性平面,平面上零散地分布著若干小方塊,在繪制地圖的類中添加地圖數(shù)據(jù)成員變量,用于記錄動(dòng)態(tài)分配出來的一維數(shù)組地圖空間的首地址,對(duì)于地圖中的某個(gè)小方塊的類型,可以用一個(gè)整型的ID來進(jìn)行識(shí)別。地圖的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)完畢。在游戲開始前,先要進(jìn)行初始化,為了保證小方塊能成對(duì)地出現(xiàn),不應(yīng)該僅僅對(duì)人物圖案做簡(jiǎn)單地隨機(jī)抽取,然后將隨機(jī)選取出來的小方塊放到地圖中去就了事,而是需要成對(duì)的選取人物小方塊,就是說地圖中的小方塊必須是偶數(shù)個(gè)才行。把地圖設(shè)置成動(dòng)態(tài)分配的方式,目的是讓其空間可以根據(jù)行列數(shù)的需求動(dòng)態(tài)地獲取,而對(duì)于實(shí)際大小不同的地圖空間即可。主要代

38、碼如下:/初始化地圖數(shù)據(jù)void llkgame:paintEvent(QPaintEvent *)QPainter p(this);/畫背景圖片 p.drawPixmap( 0, /圖片的頂點(diǎn)橫坐標(biāo) 0, /圖片的頂點(diǎn)縱坐標(biāo) LLKGAME_PHWIDTH*10, /圖片寬度 LLKGAME_PHHEIGHT*8, /圖片的高度 QPixmap(":/image/backgroup.png") ); /從資源庫調(diào)用圖片/畫連連看小圖片 for(int i=1 ; i<map_row-1 ; i+) for(int j=1 ; j<map_col-1 ; j+)

39、 if( LLKGAME_EMPTY != arr_mapij )/如果不是空方塊 p.drawPixmap( (j-1)*(LLKGAME_PHWIDTH), (i-1)*(LLKGAME_PHHEIGHT), LLKGAME_PHWIDTH, LLKGAME_PHHEIGHT, ph_list.at(arr_mapij) ); 對(duì)于圖案的布局,依舊是采用常用的機(jī)制,先用srand0函數(shù)對(duì)時(shí)間函數(shù)布下隨機(jī)種子,然后調(diào)用rand()函數(shù)對(duì)具體的圖案方塊的種類進(jìn)行隨機(jī)的獲取。對(duì)于圖片資源的,可以先在內(nèi)存創(chuàng)建兩個(gè)內(nèi)存位圖,并對(duì)它們的圖像進(jìn)行載入。在需要使用的時(shí)候,則可以從這些內(nèi)存位圖中直接去拷貝,

40、并繪制到游戲區(qū)域內(nèi)存位圖中去。首先,對(duì)方塊的兩種狀態(tài)所對(duì)應(yīng)的圖片分別創(chuàng)建相應(yīng)的設(shè)備環(huán)境,并且為它們分配關(guān)聯(lián)的內(nèi)存位圖變量。而對(duì)于游戲區(qū)域的繪制,則通過ui圖形界面進(jìn)行直接繪制。關(guān)鍵代碼如下:/構(gòu)造Pixmap 列表 for(int i=0 ; i<LLKGAME_SUMPH ; i+) QString phname = ":/image/"+QString:number(i,10)+".png" /調(diào)用圖片名稱 QPixmap pixmap(phname); ph_list.append(pixmap); for(int j=0 ; j<LL

41、KGAME_PERPH ; j+) tmplist.append(i); /隨機(jī)放置圖片 for(int i=1 ; i<map_row-1 ; i+) for(int j=1 ; j<map_col-1 ; j+) int dex = (int(rand()%tmplist.size(); arr_mapij = tmplist.at(dex); tmplist.removeAt(dex); update();4.1.4 圖案方塊的判斷連接的設(shè)計(jì)與實(shí)現(xiàn) 設(shè)計(jì)思路是:假設(shè)目標(biāo)點(diǎn)pl,p2,如果有兩個(gè)折點(diǎn)分別為z1,z2那么,所要進(jìn)行的是: (1)如果驗(yàn)證pl,p2直線連線,則連接成

42、立。 (2)對(duì)于一個(gè)折點(diǎn)和兩個(gè)折點(diǎn)的情況下。搜索以pl,p2的x,y方向四條直線(可能某兩條直線會(huì)重合)上的有限點(diǎn),每次取兩點(diǎn)作為z1,z2,驗(yàn)證pl到z1/zl到z2/z2到p2是否都能直線相連,是則連接成立,這是兩個(gè)折點(diǎn)的情況。對(duì)于一個(gè)折點(diǎn),即z1-z2,對(duì)判斷沒影響,每次取一點(diǎn)作為z1或z2,驗(yàn)證pl到zl/zl或z2/z2到p2是否都能直線相連,是則連接成立。直連一個(gè)折點(diǎn)兩個(gè)折點(diǎn)圖4-3三種連接方式開始一個(gè)折點(diǎn)連接方式判斷成功直連方式判斷成功兩個(gè)折點(diǎn)判斷成功消除所選的兩個(gè)圖案結(jié)束恢復(fù)所選圖案的原始狀態(tài)是是是否否否圖4-4連接判斷流程圖具體代碼如下:/直連bool llkgame:iLi

43、nk(int sx, int sy, int ex, int ey) /兩個(gè)點(diǎn)必須不是同一個(gè) if(sx = ex && sy = ey) return false; int max , min , i ; if( sx = ex ) /同一行 if( sy < ey ) /從左向右連接 min = sy ; max = ey ; else /從右向左連接 min = ey ; max = sy ; for( i = min+1 ; i < max ; i + ) if( arr_mapsxi != LLKGAME_EMPTY )/如果選中的兩個(gè)圖片之間不為空方塊返

44、回假 return false ; return true ; if( sy = ey ) / 同一列 if( sx < ex ) /從上向下連接 min = sx ; max = ex ; else /從下向上連接 min = ex ; max = sx ; for( i = min+1 ; i < max ; i + ) if( arr_mapisy != LLKGAME_EMPTY ) return false ; return true ; return false ;/一個(gè)拐點(diǎn)bool llkgame:lLink(int sx, int sy, int ex, int e

45、y) /如果是直連直接返回ture if(iLink(sx,sy,ex,ey) return true; int cx , cy , dx , dy ; cx = sx , cy = ey ; dx = ex , dy = sy ; /cx,cy為右上方折點(diǎn);dx,dy為左下方折點(diǎn) if( (arr_mapcxcy = LLKGAME_EMPTY && iLink(sx,sy,cx,cy) && iLink(cx,cy,ex,ey) ) |(arr_mapdxdy =LLKGAME_EMPTY && iLink(sx,sy,dx,dy)&

46、& iLink(dx,dy,ex,ey) ) )/如果折點(diǎn)位置為空并且與第一個(gè)選中和第二個(gè)選中的方塊都能直連返回真 return true; else return false;/兩個(gè)拐點(diǎn)bool llkgame:zLink(int sx, int sy, int ex, int ey) /如果是是直連或者一個(gè)拐點(diǎn)連接直接放回true if(iLink(sx,sy,ex,ey) return true; if(lLink(sx,sy,ex,ey) return true; for(int i=0 ; i<map_col;i+) int first_i_corner_x=sx; i

47、nt first_i_corner_y=i; if( iLink(sx,sy,first_i_corner_x,first_i_corner_y)&& LLKGAME_EMPTY = arr_mapfirst_i_corner_xfirst_i_corner_y && lLink(first_i_corner_x,first_i_corner_y,ex,ey) return true; /以第一個(gè)點(diǎn)擊的方塊的橫坐標(biāo)為基準(zhǔn)遍歷整行,看是否能找到一個(gè)空方塊,能和第一個(gè)點(diǎn)擊的方塊直連,和第二個(gè)點(diǎn)擊的方塊有一個(gè)折點(diǎn),如果找到則返回真 for(int i=0 ; i<

48、;map_row;i+) int first_i_corner_x=i; int first_i_corner_y=sy; if( iLink(sx,sy,first_i_corner_x,first_i_corner_y)&& LLKGAME_EMPTY = arr_mapfirst_i_corner_xfirst_i_corner_y && lLink(first_i_corner_x,first_i_corner_y,ex,ey) return true; return false;/以第一個(gè)點(diǎn)擊的方塊的縱坐標(biāo)為基準(zhǔn)遍歷整列,看是否能找到一個(gè)空方塊,能和第

49、一個(gè)點(diǎn)擊的方塊直連,和第二個(gè)點(diǎn)擊的方塊有一個(gè)折點(diǎn),如果找到則返回真4.1.5 游戲結(jié)束判斷功能的設(shè)計(jì)與實(shí)現(xiàn)在游戲程序中,游戲結(jié)束的判斷往往是非常重要的,它表示著進(jìn)行一次游戲的最終結(jié)果。對(duì)于本游戲程序?qū)τ螒蚪Y(jié)束的判斷,自然是先檢查游戲區(qū)域中的小方塊是否都消除,由于某個(gè)位置是否由小方塊采用不同的數(shù)值進(jìn)行記錄,所以只需判斷各個(gè)小方塊位置的狀態(tài)就可以了8。其次,由于本游戲程序的設(shè)計(jì)是按照連貫性進(jìn)行設(shè)計(jì)的,倘若在游戲時(shí)當(dāng)?shù)貓D中的小窮塊都被消除時(shí),應(yīng)自動(dòng)進(jìn)行下一級(jí),這里可以通過if和else進(jìn)行判斷,還有一種情況就是當(dāng)游戲沒有進(jìn)行完的情況,當(dāng)時(shí)間都消耗盡或者已無生命點(diǎn)數(shù)時(shí)出現(xiàn)死局時(shí),即游戲地圖中沒有一組可

50、以消除的方塊,則游戲結(jié)束,都應(yīng)給予提示游戲結(jié)束的原因,在計(jì)數(shù)器中添加相應(yīng)的數(shù)值進(jìn)行跟蹤,當(dāng)計(jì)數(shù)器為0時(shí),在游戲結(jié)束函數(shù)中采用觸發(fā)模式對(duì)游戲進(jìn)行終止。詳細(xì)代碼如下:void MainWindow:slot_timeOut() /如果時(shí)間為0時(shí)游戲結(jié)束 if( 0 = remainTime && true = gameRunning) gameRunning = false; QMessageBox msgBox(this); msgBox.setText(tr("game over"); msgBox.exec(); /如果分?jǐn)?shù)超過英雄榜最低分將被記錄在英雄榜上 int finalSCore=lbScores->text().toInt(); int tenScore=getScoreFromInfor().at(9); if(finalSCore>tenScore) InputNam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論