基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第1頁
基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第2頁
基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第3頁
基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第4頁
基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)畢業(yè)設(shè)計論文_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

武漢理工大學(xué)武漢理工大學(xué)基于Qt的貪吃蛇游戲設(shè)計與實現(xiàn)摘要隨著社會的發(fā)展,人們生活的步調(diào)日益加快,越來越多的人加入了全球化的世界。人們不再拘泥于一小塊天地,加班、出差成為現(xiàn)代人不可避免的公務(wù)。而此時一款可以隨時隨地娛樂的游戲成了必需品。貪吃蛇簡單易行、操作方便、娛樂性極強,很好地滿足了玩家的需求。本系統(tǒng)開發(fā)平臺為Windows7,應(yīng)用基于Qt跨平臺的圖形用戶界面應(yīng)用程序框架,程序設(shè)計語言采用C++。在系統(tǒng)設(shè)計過程中,使用了面向?qū)ο蟮姆治?、設(shè)計方法。完全采用軟件工程的方法進行需求分析、總體設(shè)計、總體實現(xiàn)和測試。在程序設(shè)計中,探討了用圖形框架的方法解決問題,對設(shè)計其他圖形用戶界面具有重要的實際意義。本設(shè)計實現(xiàn)了一個簡單的貪吃蛇小游戲,該游戲不僅實現(xiàn)了簡單的游戲操作功能,還實現(xiàn)了靈活的運作功能,而且具有簡潔大方的圖文外觀。此系統(tǒng)具有良好的界面和必要的交互信息,使操作人員能快捷簡單的進行操作,給玩家一個有趣的游戲。關(guān)鍵詞Qt;程序設(shè)計語言C++;貪吃蛇SnakegamedesignandimplementationbasedonQtAbstractWiththedevelopmentofthesociety,thequickeningpaceoflife,peoplemoreandmorepeoplejoinedtheglobalizationoftheworld.Peoplearenolongerlimitedtoasmallpieceofheavenandearth,overtime,travelinevitablyamodernbusiness.Atatimewhenaanywhereentertainmentgamebecameanecessity.Snakeissimple,easytooperate,entertainmentisextremelystrong,wellmeettherequirementsoftheplayer.ApplicationdevelopmentplatformforWindows7,thissystemisbasedonQtcross-platformGUIapplicationframework,usingc++programminglanguage.Intheprocessofsystemdesign,usingtheobject-orientedanalysisanddesignmethod.Completelyusingthemethodofsoftwareengineeringneedsanalysis,overalldesign,implementationandtestingasawhole.Inprogramming,discussesthemethodofusinggraphicalframeworktosolvetheproblem,thedesignofothergraphicaluserinterface(GUI)hasimportantpracticalsignificance.Thisdesignimplementsasimplesnakegame,thegameisnotonlyrealizethefunctionofsimpleoperation,andrealizethefunctionofflexibleoperation,andhasaconciseandeasybyappearance.Thissystemhasagoodinterfaceandtheinteractionofthenecessaryinformation,allowtheoperatortoquickandeasytooperate,togivetheplayersafungame.KeywordsQt;C++programminglanguage;snake武漢理工大學(xué)武漢理工大學(xué)目錄摘要 iAbstract ii緒論 11嵌入式系統(tǒng) 21.1嵌入式系統(tǒng) 21.2組成 21.2.1硬件層 21.2.2中間層 31.3特點 31.3.1可裁剪性 31.3.2強實時性 41.3.3統(tǒng)一的接口 41.3.4方便 41.3.5強穩(wěn)定性,弱交互性 41.3.6固化代碼 41.3.7適應(yīng)性 42開發(fā)環(huán)境及關(guān)鍵技術(shù) 52.1Qt 52.2信號和槽機制 52.2.1信號 62.2.2槽函數(shù) 62.3布局管理 62.4程序啟動畫面QSplashScreen類 72.5QTimer類 82.6二維圖形的繪制方法 82.7右鍵菜單 93可行性分析 103.1研究目的 103.2開發(fā)的可行性 103.2.1操作可行性 103.2.2技術(shù)可行性 103.2.3經(jīng)濟可行性 103.3專業(yè)術(shù)語 113.4條件基礎(chǔ) 113.5實現(xiàn)目標 113.6可行性研究方法 113.7結(jié)論意見 114需求分析 124.1研究目的 124.2開發(fā)背景 124.3任務(wù)概述 134.3.1目標 134.3.2用戶特點 134.4需求規(guī)定 134.4.1對功能的規(guī)定 134.4.2對性能的規(guī)定 134.5要解決的問題 134.6提出的要求 144.7可以實現(xiàn)的要求 144.8關(guān)鍵點 144.9嵌入式特性 145貪吃蛇分析 155.1貪吃蛇要求 155.2貪食蛇設(shè)計思想 155.3貪吃蛇游戲功能 156貪吃蛇設(shè)計 166.1系統(tǒng)的輸入輸出 166.1.1輸入 166.1.2輸出 166.1.3蛇的移動 166.2設(shè)計基礎(chǔ) 166.3數(shù)據(jù)字典 166.4處理流程 176.5系統(tǒng)的邏輯模型 186.6功能與程序的關(guān)系 186.7運行設(shè)計 196.7.1運行控制 196.7.2運行時間 197貪吃蛇實現(xiàn) 207.1程序系統(tǒng)的組織結(jié)構(gòu) 207.1.1每個模塊的名稱、標識符 207.1.2模塊之間的關(guān)系 217.2程序描述 217.2.1目的和意義 217.2.2特點說明 217.3程序詳解 217.3.1構(gòu)造函數(shù)Snake(QWidget*parent) 217.3.2初始化界面函數(shù)iniWidget() 227.3.3連接信號函數(shù)iniConnect() 247.3.4初始化游戲函數(shù)iniGame() 257.3.5貪吃蛇移動函數(shù)doMoveSnake() 257.3.6設(shè)置是否可以穿墻函數(shù)setEnableGoThroughWall() 267.3.7更新得分函數(shù)changeScore() 267.3.8更新等級函數(shù)changeLevel() 277.3.9判斷貪吃蛇是否吃到食物函數(shù)isEating() 277.3.10判斷游戲是否結(jié)束函數(shù)isGameOver() 277.3.11繪圖事件處理函數(shù)paintEvent(QPaintEvent*event) 287.3.12鍵盤事件處理函數(shù)keyPressEvent(QKeyEvent*event) 297.3.13獲取隨機顏色函數(shù)getColor() 307.3.14時間處理函數(shù) 307.3.15右鍵菜單處理函數(shù) 317.3.16獲取右鍵菜單槽函數(shù) 317.3.17點擊右鍵菜單中Info的槽函數(shù) 327.3.18點擊右鍵菜單中About的槽函數(shù) 327.3.19程序主函數(shù) 328軟件測試 348.1測試的意義 348.2測試過程 348.3測試計劃 348.4預(yù)期的結(jié)果 348.5測試結(jié)果 35結(jié)論 40參考文獻 41致謝 42外文原文 43外文翻譯 54武漢理工大學(xué)武漢理工大學(xué)緒論貪吃蛇是世界知名的益智類小游戲,選擇這個題目一方面的原因是為了將我們的所學(xué)知識加以運用;另一方面,雖然很小就接觸這個游戲,但是它的制作方法對我們而言還是很神秘的。我們希望通過自己的所學(xué)知識把它剖析開來,通過自己的動手實踐,真正的了解它的本質(zhì)和精髓。希望通過這次實踐,我們能從中提高自己的編程能力,并從中學(xué)會從零開始分析設(shè)計程序。本游戲的開發(fā)是基于Qt跨平臺的圖形用戶界面應(yīng)用程序框架,用的是C++開發(fā)語言。C++語言簡潔靈活,運算符的數(shù)據(jù)結(jié)構(gòu)豐富、具有結(jié)構(gòu)化控制語句、程序執(zhí)行效率高,而且同時具有高級語言與匯編語言的優(yōu)點,與其它語言相比,C語言具有可以直接訪問物理地址的優(yōu)點,與匯編語言相比又具有良好的可讀性的可移植性??偟脕碚f,C++語言的主要特點表現(xiàn)在兩個方面,一是盡量兼容C,二是支持面向?qū)ο蟮姆椒āK俪至薈的簡潔、高效的接近匯編語言等特點,對C的類型系統(tǒng)進行了改革的擴充,因此C++比C更安全,C++的編譯系統(tǒng)能檢查出更多的類型錯誤。另外,由于C語言的廣泛使用,因而極大的促進了C++的普及和推廣。C++語言最有意義的方面是支持面向?qū)ο蟮奶卣鳌km然與C的兼容使得C++具有雙重特點,但他在概念上完全與C不同,更具面向?qū)ο蟮奶卣?。?shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。1嵌入式系統(tǒng)1.1嵌入式系統(tǒng)嵌入式系統(tǒng)是一種專用的計算機系統(tǒng),作為裝置或設(shè)備的一部分。嵌入式系統(tǒng)是一個控制程序存儲在ROM中的嵌入式處理器控制板。事實上,所有帶有數(shù)字接口的設(shè)備,如手表、微波爐、錄像機、汽車等,都使用嵌入式系統(tǒng),有些嵌入式系統(tǒng)還包含操作系統(tǒng),但大多數(shù)嵌入式系統(tǒng)都是由單個程序?qū)崿F(xiàn)整個控制邏輯。從應(yīng)用對象上加以定義,嵌入式系統(tǒng)是軟件和硬件的綜合體,還可以涵蓋機械等附屬裝置。國內(nèi)普遍認同的嵌入式系統(tǒng)定義為:以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統(tǒng)。1.2組成一個嵌入式系統(tǒng)裝置一般都由嵌入式計算機系統(tǒng)和執(zhí)行裝置組成,嵌入式計算機系統(tǒng)是整個嵌入式系統(tǒng)的核心,由硬件層、中間層、系統(tǒng)軟件層和應(yīng)用軟件層組成。執(zhí)行裝置也稱為被控對象,它可以接受嵌入式計算機系統(tǒng)發(fā)出的控制命令,執(zhí)行所規(guī)定的操作或任務(wù)。執(zhí)行裝置可以很簡單,如手機上的一個微小型的電機,當(dāng)手機處于震動接收狀態(tài)時打開;也可以很復(fù)雜,如SONY智能機器狗,上面集成了多個微小型控制電機和多種傳感器,從而可以執(zhí)行各種復(fù)雜的動作和感受各種狀態(tài)信息。1.2.1硬件層硬件層中包含嵌入式微處理器、存儲器(SDRAM、ROM、Flash等)、通用設(shè)備接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式處理器基礎(chǔ)上添加電源電路、時鐘電路和存儲器電路,就構(gòu)成了一個嵌入式核心控制模塊。其中操作系統(tǒng)和應(yīng)用程序都可以固化在ROM中。1.嵌入式微處理器嵌入式系統(tǒng)硬件層的核心是嵌入式微處理器,嵌入式微處理器與通用CPU最大的不同在于嵌入式微處理器大多工作在為特定用戶群所專用設(shè)計的系統(tǒng)中,它將通用CPU許多由板卡完成的任務(wù)集成在芯片內(nèi)部,從而有利于嵌入式系統(tǒng)在設(shè)計時趨于小型化,同時還具有很高的效率和可靠性。2.存儲器嵌入式系統(tǒng)需要存儲器來存放和執(zhí)行代碼。嵌入式系統(tǒng)的存儲器包含Cache、主存和輔助存儲器。(1)CacheCache是一種容量小、速度快的存儲器陣列它位于主存和嵌入式微處理器內(nèi)核之間,存放的是最近一段時間微處理器使用最多的程序代碼和數(shù)據(jù)。Cache的主要目標就是:減小存儲器(如主存和輔助存儲器)給微處理器內(nèi)核造成的存儲器訪問瓶頸,使處理速度更快,實時性更強。(2)主存主存是嵌入式微處理器能直接訪問的寄存器,用來存放系統(tǒng)和用戶的程序及數(shù)據(jù)。(3)輔助存儲器輔助存儲器用來存放大數(shù)據(jù)量的程序代碼或信息,它的容量大、但讀取速度與主存相比就慢的很多,用來長期保存用戶的信息。3.通用設(shè)備接口和I/O接口嵌入式系統(tǒng)和外界交互需要一定形式的通用設(shè)備接口,如A/D、D/A、I/O等,外設(shè)通過和片外其他設(shè)備的或傳感器的連接來實現(xiàn)微處理器的輸入/輸出功能。每個外設(shè)通常都只有單一的功能,它可以在芯片外也可以內(nèi)置芯片中。外設(shè)的種類很多,可從一個簡單的串行通信設(shè)備到非常復(fù)雜的802.11無線設(shè)備。目前嵌入式系統(tǒng)中常用的通用設(shè)備接口有A/D(模/數(shù)轉(zhuǎn)換接口)、D/A(數(shù)/模轉(zhuǎn)換接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太網(wǎng)接口)、USB(通用串行總線接口)、音頻接口、VGA視頻輸出接口、I2C(現(xiàn)場總線)、SPI(串行外圍設(shè)備接口)和IrDA(紅外線接口)等。1.2.2中間層硬件層與軟件層之間為中間層,也稱為硬件抽象層(HardwareAbstractLayer,HAL)或板級支持包(BoardSupportPackage,BSP),它將系統(tǒng)上層軟件與底層硬件分離開來,使系統(tǒng)的底層驅(qū)動程序與硬件無關(guān),上層軟件開發(fā)人員無需關(guān)心底層硬件的具體情況,根據(jù)BSP層提供的接口即可進行開發(fā)。該層一般包含相關(guān)底層硬件的初始化、數(shù)據(jù)的輸入/輸出操作和硬件設(shè)備的配置功能。BSP具有以下兩個特點。硬件相關(guān)性:因為嵌入式實時系統(tǒng)的硬件環(huán)境具有應(yīng)用相關(guān)性,而作為上層軟件與硬件平臺之間的接口,BSP需要為操作系統(tǒng)提供操作和控制具體硬件的方法。操作系統(tǒng)相關(guān)性:不同的操作系統(tǒng)具有各自的軟件層次結(jié)構(gòu),因此,不同的操作系統(tǒng)具有特定的硬件接口形式。實際上,BSP是一個介于操作系統(tǒng)和底層硬件之間的軟件層次,包括了系統(tǒng)中大部分與硬件聯(lián)系緊密的軟件模塊。設(shè)計一個完整的BSP需要完成兩部分工作:嵌入式系統(tǒng)的硬件初始化以及BSP功能,設(shè)計硬件相關(guān)的設(shè)備驅(qū)動。1.3特點1.3.1可裁剪性支持開放性和可伸縮性的體系結(jié)構(gòu)。1.3.2強實時性EOS實時性一般較強,可用于各種設(shè)備控制中。1.3.3統(tǒng)一的接口提供設(shè)備統(tǒng)一的驅(qū)動接口。1.3.4方便操作方便、簡單、提供友好的圖形GUI和圖形界面,追求易學(xué)易用。提供強大的網(wǎng)絡(luò)功能,支持TCP/IP協(xié)議及其他協(xié)議,提供TCP/UDP/IP/PPP協(xié)議支持及統(tǒng)一的MAC訪問層接口,為各種移動計算設(shè)備預(yù)留接口。1.3.5強穩(wěn)定性,弱交互性嵌入式系統(tǒng)一旦開始運行就不需要用戶過多的干預(yù)、這就要負責(zé)系統(tǒng)管理的EOS具有較強的穩(wěn)定性。嵌入式操作系統(tǒng)的用戶接口一般不提供操作命令,它通過系統(tǒng)的調(diào)用命令向用戶程序提供服務(wù)。1.3.6固化代碼在嵌入式系統(tǒng)中,嵌入式操作系統(tǒng)和應(yīng)用軟件被固化在嵌入式系統(tǒng)計算機的ROM中。1.3.7適應(yīng)性更好的硬件適應(yīng)性,也就是良好的移植性。2開發(fā)環(huán)境及關(guān)鍵技術(shù)2.1QtQt是諾基亞開發(fā)的一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。它既可以開發(fā)GUI程式,也可用于開發(fā)非GUI程式,比如控制臺工具和服務(wù)器。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮?,很容易擴展,并且允許真正地組件編程。它具有:(1)優(yōu)良的跨平臺特性(2)面向?qū)ο螅?)豐富的API(4)大量的開發(fā)文檔(5)XML支持(6)Webkit引擎的集成,可以實現(xiàn)本地界面與Web內(nèi)容的無縫集成(7)用戶自定義控件(8)方便性(9)國際化(10)高性能的工具(11)優(yōu)越的繪畫功能(12)繪制2D/3D圖形功能2.2信號和槽機制信號和槽作為QT的核心機制在QT編程中有著廣泛的應(yīng)用,要精通QT編程就必須對信號和槽有所了解。信號和槽是一種高級接口,應(yīng)用于對象之間的通信,他是QT的核心特性,也是QT差別于其他工具包的重要地方。信號和槽是QT自行定義的一種通信機制,他獨立于標準的C/C++語言,因此要正確的處理信號和槽,必須借助一個稱為moc(MetaObjectCompiler的QT工具,該工具是個C++預(yù)處理程式,他為高層次的事件處理自動生成所需要的附加代碼。在我們所熟知的非常多GUI工具包中,窗口小部件(widget都有一個回調(diào)函數(shù)用于響應(yīng)他們能觸發(fā)的每個動作,這個回調(diào)函數(shù)通常是個指向某個函數(shù)的指針。不過,在QT中信號和槽取代了這些凌亂的函數(shù)指針,使得我們編寫這些通信程式更為簡潔明了。信號和槽能攜帶任意數(shù)量和任意類型的參數(shù),他們是類型完全安全的,不會像回調(diào)函數(shù)那樣產(chǎn)生coredumps所有從QObject或其子類(例如QWidget)派生的類都能夠包含信號和槽。當(dāng)對象改動其狀態(tài)時,信號就由該對象發(fā)射(emit)出去,這就是對象所要做的全部事情,他不知道另一端是誰在接收這個信號。這就是真正的消息封裝,他確保對象被當(dāng)作一個真正的軟件組件來使用。槽用于接收信號,但他們是普通的對象成員函數(shù)。一個槽并不知道是否有所有信號和自己相連接。而且,對象并不了解具體的通信機制。你能將非常多信號和單個的槽進行連接,也能將單個的信號和非常多的槽進行連接,甚至于將一個信號和另外一個信號相連接也是可能的,這時無論第一個信號什么時候發(fā)射系統(tǒng)都將即時發(fā)射第二個信號??傊盘柡筒蹣?gòu)造了一個強大的部件編程機制。2.2.1信號當(dāng)某個信號對其客戶或所有者發(fā)生的內(nèi)部狀態(tài)發(fā)生改動,信號被一個對象發(fā)射。只有定義過這個信號的類及其派生類能夠發(fā)射這個信號。當(dāng)一個信號被發(fā)射時,和其相關(guān)聯(lián)的槽將被即時執(zhí)行,就象一個正常的函數(shù)調(diào)用相同。信號-槽機制完全獨立于所有GUI事件循環(huán)。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)(emit)才返回。如果存在多個槽和某個信號相關(guān)聯(lián),那么,當(dāng)這個信號被發(fā)射時,這些槽將會一個接一個地執(zhí)行,不過他們執(zhí)行的順序?qū)请S機的、不確定的,我們不能人為地指定哪個先執(zhí)行、哪個后執(zhí)行。2.2.2槽函數(shù)槽是普通的C++成員函數(shù),能被正常調(diào)用,他們唯一的特別性就是非常多信號能和其相關(guān)聯(lián)。當(dāng)和其關(guān)聯(lián)的信號被發(fā)射時,這個槽就會被調(diào)用。槽能有參數(shù),但槽的參數(shù)不能有缺省值。既然槽是普通的成員函數(shù),因此和其他的函數(shù)相同,他們也有存取權(quán)限。槽的存取權(quán)限決定了誰能夠和其相關(guān)聯(lián)。同普通的C++成員函數(shù)相同,槽函數(shù)也分為三種類型,即publicslots、privateslots和protectedslots。publicslots:在這個區(qū)內(nèi)聲明的槽意味著所有對象都可將信號和之相連接。這對于組件編程非常有用,你能創(chuàng)建彼此互不了解的對象,將他們的信號和槽進行連接以便信息能夠正確的傳遞。protectedslots:在這個區(qū)內(nèi)聲明的槽意味著當(dāng)前類及其子類能將信號和之相連接。這適用于那些槽,他們是類實現(xiàn)的一部分,不過其界面接口卻面向外部。privateslots:在這個區(qū)內(nèi)聲明的槽意味著只有類自己能將信號和之相連接。這適用于聯(lián)系非常緊密的類。2.3布局管理窗體上的所有的控件必須有一個合適的尺寸和位置。Qt提供了一些類負責(zé)排列窗體上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。他們之間的繼承關(guān)系如圖2-1所示。圖2-1布局管理繼承關(guān)系圖Qt中有三種方式對窗體上的控件進行布局管理:絕對位置定位(absolutepositioning),手工布局(manuallayout),布局管理器(layoutmanagers)。在QT中,Layout和Widget是相對獨立的類,但是Layout本身單獨存在并沒有意義,需要和Widget配合使用。而Widget本身不負責(zé)子控件的布局管理。你可以認為,Layout類其實只是一組預(yù)先撰寫好的代碼,在父控件尺寸變化時,根據(jù)預(yù)設(shè)參數(shù)和子控件的各種Geometryhint,管理控件的位置和尺寸。Layout首先是要通過QWidget::setLayout函數(shù),將一個QLayout類設(shè)置為控件的布局管理器。這一步實際也將這個控件設(shè)置為QLayout類的父控件。而后,通常通過QLayout::addWidget()等函數(shù),將widget添加到Layout類的布局管理體系中。但是,Layout本身并不是Widget的父控件,因為QWidget類的父控件只能是QWidget類,所以Layout將其管理的子控件的父控件重定向為自己的父控件。另外,因為QWidget類本身并不是一個QLayoutItem,而Qlayout的管理又是以QLayoutItem為單位。所以,在addWidget的操作中,QLayout還會創(chuàng)建一個QLayoutItem的子類QWidgetItem類來對應(yīng)的包裝代理添加進來的子控件。QWidgetItem對象最終會將QLayout布局管理體系中的布局參數(shù)信息裝換、設(shè)置到它所代理的QWidget對象上在QT下進行界面設(shè)計,可以使用水平、垂直和Grid布局管理器來進行。水平布局管理器可以把它所管理的部件以水平的順序依次排開。垂直管理器類似,它可以把它所管理的部件以垂直的順序依次排開。Grid布局管理器可以以網(wǎng)格的形式,將它所管理的部件以一定的矩陣形式排列。在QT下做界面設(shè)計的時候,其實無非就是利用上面三種布局管理器來將部件進行分類和排列。2.4程序啟動畫面QSplashScreen類當(dāng)程序的初始化工作比較多,程序可能啟動較長時間后,窗口才會顯示出來,用戶沒準會抱怨程序響應(yīng)的慢。為了改善用戶體驗,最好在程序初始化這段時間顯示logo,或者其他信息提示用戶程序已啟動。QT提供了QSplashScreen類,其使用方法比較簡單,下面的例子就是,當(dāng)程序運行到splash.show();時,logo.gif就會顯示出來,當(dāng)dialog的初始化完成,運行到splash.finish(&dialog);時,主窗口顯示出來,并且啟動畫面隱藏。當(dāng)程序啟動慢的時候,該畫面就會停留一會,也可以在圖片上顯示一下程序啟動的加載信息,、但是如果程序啟動很快的話,啟動圖片就會一閃而過,其實啟動畫面也出現(xiàn)了的,只是出現(xiàn)的時間比較短,如果想讓程序啟動之前畫面多停留一下,可以添加一個延時器。2.5QTimer類QTimer類提供了定時器信號和單觸發(fā)定時器。它在內(nèi)部使用定時器事件來提供更通用的定時器。QTimer很容易使用:創(chuàng)建QTimer,使用start()來開始并且把它的timeout()連接到適當(dāng)?shù)牟?。?dāng)這段時間過去了,它將會發(fā)射timeout()信號。注意當(dāng)QTimer的父對象被銷毀時,它也會被自動銷毀。你也可以使用靜態(tài)的singleShot()函數(shù)來創(chuàng)建單觸發(fā)定時器。作為一個特殊情況,一旦窗口系統(tǒng)事件隊列中的所有事件都已經(jīng)被處理完,一個定時為0的QTimer就會到時間了。這也可以用來當(dāng)提供迅速的用戶界面時來做比較繁重的工作。2.6二維圖形的繪制方法Qt的二維圖形引擎是基于QPainter類的,QPainter既可以繪制幾何圖形,也可以繪制像素映射、圖像和文字。此外,QPainter也支持一些高級特性,例如反走樣(針對文字和圖形邊緣)、像素混合、漸變填充和矢量路徑等,QPainter也支持線性變換,例如平移、旋轉(zhuǎn)、錯切和縮放。QPainter可以畫在“繪圖設(shè)備”上,例如:QWidget、QPixmap、QIamge或者QSvgGenerator。QPainter也可以與QPrinter一起使用來打印文件盒創(chuàng)建PDF文檔。這意味著通??梢杂孟嗤拇a在屏幕上顯示數(shù)據(jù),也可以生成打印形式的報告。如果要在繪圖設(shè)備(一般為窗口部件)上繪圖,只需創(chuàng)建一個QPainter,再將指針傳到該設(shè)備中。使用QPainter的draw...()函數(shù),可以繪制各種各樣的形狀。繪制效果取決于QPainter的設(shè)置,一些是從設(shè)備中取得的,然而有些被初始化成默認值。三個主要設(shè)置是畫筆、畫刷、字體:畫筆:用來畫線和邊緣。它包含顏色、寬度、線性、拐點風(fēng)格以及連線風(fēng)格。畫刷:用來填充幾何圖形的圖案。它一般由顏色和風(fēng)格組成,但同時也可以是紋理(一個不斷重復(fù)的圖像)或者是一個漸變。字體:用來繪制文字。字體有很多屬性,包括字體族和磅值大小??梢噪S時調(diào)用QPen、QBrush或者QFont對象的setPen()、setBrush()和setFont()來修改這些設(shè)置。draw...,見明知義。繪制點drawPoint()、繪制直線drawLine()、繪制折線drawPolyLine()、繪制多點drawPoints()、繪制多直線drawLines()、繪制矩形區(qū)域drawRect()、繪制圓角區(qū)域drawRoundRect()、繪制橢圓drawEllipse()、繪制背景圖片drawPixmap()等!2.7右鍵菜單QWidget及其子類都可有右鍵菜單,因為QWidget有以下兩個與右鍵菜單有關(guān)的函數(shù):Qt::ContextMenuPolicycontextMenuPolicy()constvoidsetContextMenuPolicy(Qt::ContextMenuPolicypolicy)使用方式如下:1)默認是Qt::DefaultContextMenu。它是利用右鍵菜單事件contextMenuEvent()來處理(whichmeansthecontextMenuEvent()handleriscalled)。就是要重寫contextMenuEvent(QContextMenuEvent*event)函數(shù)。2)使用Qt::CustomContextMenu。它是發(fā)出QWidget::customContextMenuRequested信號,注意僅僅只是發(fā)信號,意味著要自己寫顯示右鍵菜單的slot。這個信號是QWidget唯一與右鍵菜單有關(guān)的信號(也是自有的唯一信號),同時也是很容易被忽略的signal:voidcustomContextMenuRequested(constQPoint&pos)該信號的發(fā)出條件是:用戶請求contextMenu(常規(guī)就是鼠標右擊啦)且同時被擊的widget其contextMenuPolicy又是Qt::CustomContextMenu。注意:pos是該widget接收右鍵菜單事件的位置,一般是在該部件的坐標系中。但是對于QAbstratScrollArea及其子類例外,是對應(yīng)著其視口viewport()的坐標系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子類。3)使用Qt::ActionsContextMenu。把部件的所有action即QWidget::actions()作為contextmenu顯示出來。使用Qt::ActionsContextMenu比較簡潔,但是如果需要根據(jù)當(dāng)前菜單彈出的位置來定義不同菜單,或者像上個例子,在表格(QTableView類型)表頭顯示右鍵菜單時,我需要知道是哪一列表頭被點擊,從而在后來調(diào)用sort_ascend()排序函數(shù)時能夠根據(jù)不同列進行不同排序策略,那么Qt::ActionsContextMenu就做不到了。這種需要捕捉彈出位置的情況只好用Qt::ActionsContextMenu了,customContextMenuRequested(constQPoint&pos)信號返回點擊位置pos(在表頭視口坐標系中位置),然后表頭即可調(diào)用logicalIndexAt(pos)函數(shù)得到被點擊section對應(yīng)的index即被點擊部分的列號,然后存下來可供后面action激活的排序槽使用。3可行性分析3.1研究目的可行性研究的目的是為了對問題進行研究,以最小的代價在最短的時間內(nèi)確定問題是否可解。該階段通過對系統(tǒng)目標的初步調(diào)研和分析,提出可行性方案并進行論證。我們在這里主要從操作可行性、技術(shù)可行性和經(jīng)濟可行性等方面進行分析。3.2開發(fā)的可行性目前,以計算機技術(shù)和網(wǎng)絡(luò)技術(shù)為核心的現(xiàn)代網(wǎng)絡(luò)技術(shù)已在現(xiàn)實生活和生產(chǎn)中得以廣泛的使用,休閑類網(wǎng)絡(luò)游戲集趣味性,娛樂性,互動性和益智性于一體,已經(jīng)成為多數(shù)人群的休閑方式。電腦游戲經(jīng)過短短30年的發(fā)展,已經(jīng)成為影響公眾生活,改變公眾娛樂方式的重要產(chǎn)業(yè)。過去,人們主要是借助電影、電視、音樂等方式來娛樂。而今天,以游戲為代表的電子娛樂正在成為主流娛樂方式。游戲也正在迅速成長為一個龐大的產(chǎn)業(yè)。貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學(xué)知識加以運用,二是一直以來貪吃蛇這個游戲就深深地吸引著我,它的制作方法對于以前的我而言都是很神秘的。我希望通過自己的所學(xué)知識把它剖析開來,真真正正的了解它的本質(zhì)和精髓。雖然我的編程能力不是很強,但是我有信心,在這次學(xué)習(xí)中我將從實踐和實際的項目中提高自己的編程能力。因此我選定了這個題目。3.2.1操作可行性貪食蛇是一個簡單、容易和休閑的小游戲,其操作簡單,在很多的平臺都可以使用,例如:Win7,WindowXP等。用戶使用此游戲也很簡單,游戲主要使用上下左右控制貪食蛇吞食界面上出現(xiàn)的食物,簡單容易上手,同時能鍛煉用戶的操作及靈敏。3.2.2技術(shù)可行性貪食蛇游戲是基于QT平臺的一款小游戲,透過QT平臺編寫從而實現(xiàn),使用的語言主要以C++為主,在技術(shù)方面沒問題。3.2.3經(jīng)濟可行性貪食蛇主要是通過QT軟件編寫,在自己電腦上即可編寫實現(xiàn)。可以說在經(jīng)濟方面不需要投入很多,甚至可以說是零投資,而隨著社會的進步,這樣的小游戲?qū)占埃覀冎恍枰度胼^小的成本,就可以得到很多的回報。3.3專業(yè)術(shù)語Qt:是一個跨平臺的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所有功能。Qt很容易擴展,并且允許真正地組件編程。QtCreator:一個用于Qt開發(fā)的輕量級跨平臺集成開發(fā)環(huán)境。QtCreator可帶來兩大關(guān)鍵益處:提供首個專為支持跨平臺開發(fā)而設(shè)計的集成開發(fā)環(huán)境(IDE),并確保首次接觸Qt框架的開發(fā)人員能迅速上手和操作。即使不開發(fā)Qt應(yīng)用程序,QtCreator也是一個簡單易用且功能強大的IDE。C++:是在C語言的基礎(chǔ)上開發(fā)的一種集面向?qū)ο缶幊?、泛型編程和過程化編程于一體的編程語言??s寫詞:GUI:圖形用戶界面3.4條件基礎(chǔ)硬件條件:HP6450b運行環(huán)境:qt-creator-win-opensource-2.4.1qt-win-opensource-4.8.1-mingw投入運行時間:待定3.5實現(xiàn)目標軟件實現(xiàn)后可以讓廣大用戶在休息時享受輕松愉快的游戲時間,提高生活質(zhì)量,讓用戶勞逸結(jié)合,提升工作和學(xué)習(xí)的效率,對生活報以積極地心態(tài)。3.6可行性研究方法通過對周邊的企業(yè)職員和大學(xué)生進行問卷調(diào)查,發(fā)現(xiàn)大家在閑暇時間大都會選擇玩游戲來打發(fā)時間,而且偏向簡單靈活的小游戲。3.7結(jié)論意見由于投資效益比遠大于100%,技術(shù)、經(jīng)濟、操作都有可行性,可以進行開發(fā)。4需求分析4.1研究目的需求分析是系統(tǒng)開發(fā)必要環(huán)節(jié),也是重中之重。作為該過程的結(jié)果,需求規(guī)格說明書是對系統(tǒng)的功能和行為完整的描述。系統(tǒng)設(shè)計將來自于需求分析的抽象規(guī)格說明轉(zhuǎn)變?yōu)槊嫦蛘鎸嵤澜绲脑O(shè)計。一旦構(gòu)建完成,該系統(tǒng)就會投入使用,同時會不可避免地產(chǎn)生更多的新需求。同時,需求過程與分析活動之間有相當(dāng)程度的重疊,分析建模對于設(shè)定工作的范圍和其他一些事來說是必要的,所以我們利用分析模型來描述需求過程,隨著開發(fā)工作的繼續(xù),分析活動在工作中占的比例將變得越來越大,直到所有需求都已知。本貪吃蛇游戲軟件在可行性研究的基礎(chǔ)上,是為了進一步明確貪吃蛇游戲的軟件需求,以便安排項目規(guī)劃與進度,組織軟件開發(fā)與測試,撰寫本文檔。此需求分析說明書對貪吃蛇游戲軟件做了全面細致的用戶需求分析,明確所要開發(fā)的游戲軟件應(yīng)該具有的功能,并在此基礎(chǔ)上進一步提出概要設(shè)計說明書和完成后續(xù)和開發(fā)工作。4.2開發(fā)背景隨著科技的發(fā)展,現(xiàn)在電腦功能已不僅僅是簡單地工作、學(xué)習(xí)了,更多的電腦用戶希望在工作學(xué)習(xí)之余通過方便小型的游戲休閑娛樂。因此,為了迎合眾多用戶的需求并適應(yīng)現(xiàn)在電腦的系統(tǒng),我們開發(fā)出一套適合各階層人士的具有很強娛樂性和交互性的貪吃蛇小游戲。雖然現(xiàn)在市面上存在著各種各樣的游戲版本,可是貪吃蛇其市場還是相當(dāng)大的。因為它的特殊在于它能吸引人更深入,愛不釋手。隨著游戲速度的不斷加快,其刺激性也更強??梢哉f該游戲的優(yōu)勢在于它的簡單易行,可以很快很順利的運行。對于在外忙碌的人,不可能花費大量時間在娛樂上,而在工作閑暇之余隨手就能打開的貪吃蛇小游戲正好迎合了他們的需求。貪吃蛇是家喻戶曉的益智類小游戲,選擇這個題目一是為了將自己的所學(xué)知識加以運用,二是一直以來貪吃蛇這個游戲就深深地吸引著我,它的制作方法對于以前的我而言都是很神秘的。我希望通過自己的所學(xué)知識把它剖析開來,真真正正的了解它的本質(zhì)和精髓。雖然我的編程能力不是很強,但是我有信心,在這次學(xué)習(xí)中我將從實踐和實際的項目中提高自己的編程能力。因此我選定了這個題目。4.3任務(wù)概述4.3.1目標在如今社會,人們的工作學(xué)習(xí)壓力逐漸增大,生活節(jié)奏逐漸加快,大多數(shù)人沒有足夠的時間去休閑娛樂,放松自己。這款小型的貪吃蛇游戲,可以讓我們隨時隨地的享受游戲給我們帶來的快樂與放松,讓我們從繁重的日常生活中解脫出來。游戲的主界面應(yīng)該力求簡明美觀,賞心悅目,以提高玩家對游戲的興趣。游戲的控制應(yīng)該做到易懂、易操作,以給玩家一個很好的游戲環(huán)境。4.3.2用戶特點由于本程序簡單易操作,交互性好,對用戶沒有什么特別要求。一般用戶經(jīng)過幾分鐘練習(xí)就可以熟練掌握本游戲的規(guī)則。4.4需求規(guī)定4.4.1對功能的規(guī)定本設(shè)計所開發(fā)的是基于C++的一個貪吃蛇游戲軟件,主要實現(xiàn)游戲的開始、暫停、退出功能,分為:游戲主界面模塊、游戲控制模塊兩個模塊。游戲主界面模塊:主要包括游戲圖形區(qū)域界面、難度設(shè)置按鈕、游戲時間顯示、分數(shù)顯示、難度提升、右鍵菜單等功能。游戲控制模塊:主要完成游戲的開始、暫停、方向控制等功能。4.4.2對性能的規(guī)定本游戲在設(shè)計方面本著方便、實用及娛樂性高的宗旨,在對界面進行設(shè)計的過程中,始終堅持清晰明了,在性能方面能夠?qū)崿F(xiàn)效率高,不易出錯等優(yōu)點。游戲主界面應(yīng)該力求美觀,賞心悅目。游戲控制模塊應(yīng)做到易懂、易操作,而且準確率高,不易出錯。4.5要解決的問題(1)可以用上、下、左、右鍵游戲控制蛇的運動方向,使之向著有食物的方向運動,并吞吃食物使身體增長,如果蛇在移動過程中,撞到墻壁或身體交叉蛇頭撞到自己的身體游戲結(jié)束。根據(jù)貪吃蛇的進食數(shù)量調(diào)節(jié)蛇的運動速度,提升難度。(2)當(dāng)游戲剛開始的時候,先應(yīng)該產(chǎn)生一條蛇和隨機產(chǎn)生一個食物。當(dāng)按鍵的時候,蛇就開始移動,按照按鍵的方向運動。(3)蛇可以運動,隨著難易程度的不同,蛇的速度也不同;在界面里可以隨機產(chǎn)生一個食物,但應(yīng)該注意不能和蛇身體一致,然后當(dāng)蛇移動并吃掉這個食物(覆蓋),蛇的身體應(yīng)該相應(yīng)地增加,同時界面中顯示分數(shù)一欄應(yīng)該相應(yīng)地增加分值;當(dāng)蛇在移動的過程中頭部碰到墻壁,游戲結(jié)束。4.6提出的要求(1)按鍵的時候可以控制蛇身按照設(shè)置的方向移動(2)當(dāng)選擇游戲的等級程度提升時,蛇的運動速度應(yīng)該也是加快的(3)當(dāng)游戲開始時候,應(yīng)該有一個初始化,設(shè)置蛇身,食物等(4)當(dāng)游戲結(jié)束時,會有相應(yīng)的處理,比如提示4.7可以實現(xiàn)的要求(1)簡單友好的界面:基本界面,蛇,食物(2)蛇的移動和控制:通過上下左右控制蛇的行進方向(3)對蛇的狀態(tài)的監(jiān)聽,及顯示吃到食物蛇的長度會增加(4)蛇的狀態(tài)的變化4.8關(guān)鍵點(1)蛇的運動算法實現(xiàn)過程(2)在監(jiān)聽蛇的狀態(tài)的方法實現(xiàn)并處理4.9嵌入式特性為了實現(xiàn)此軟件的廣泛使用,設(shè)計貪吃蛇游戲軟件可以嵌入在硬件中使用,既可以嵌入在電腦中,也可以嵌入在移動設(shè)備中,讓用戶不論處于何地都可以方便的使用。特此說明,此軟件也可放在Ubuntu環(huán)境下運行。5貪吃蛇分析5.1貪吃蛇要求貪食蛇游戲軟件在windowXP和win7系統(tǒng)上為玩家提供貪吃蛇游戲的基本功能。玩家可以通過鍵盤上下左右控制游戲區(qū)中貪吃蛇的行動,當(dāng)蛇頭碰到食物(和食物接觸)后增加蛇身的長度,當(dāng)蛇碰到自己的身體或碰到墻壁時游戲結(jié)束。5.2貪食蛇設(shè)計思想紅色背景區(qū)域為蛇的運動區(qū)域,邊框表示圍墻,藍色矩形代表蛇,變色小方塊代表食物,程序關(guān)鍵在于表示蛇的圖形及蛇的移動。用一個小矩形塊表示蛇的一節(jié)身體,身體每長一節(jié),在身體最后增加一個矩形塊。移動時必須從蛇頭開始,所以蛇不能向相反的方向移動,如果不按任意鍵,蛇自行在當(dāng)前方向上前移,但按下有效方向鍵后,蛇頭朝著該方向移動,一步移動一節(jié)身體,所以按下有效方向鍵后,先確定蛇頭的位置,而后蛇的身體隨蛇頭移動,圖形的實現(xiàn)是從蛇尾新位置開始畫出蛇,長度為保存蛇每個節(jié)點信息的數(shù)組的長度。食物的出現(xiàn)是先確定一組隨機數(shù),再填充方格,食物的消失是由于使用了更新函數(shù),當(dāng)吃掉食物后就不再重畫本次食物,而是生成一組新的隨機數(shù),畫新的食物。當(dāng)設(shè)置游戲難度為不可穿墻時,蛇頭的位置坐標和墻的坐標或者自己身體的某個節(jié)點的坐標相同時,蛇就死掉了,游戲結(jié)束。當(dāng)設(shè)置游戲難度為可以穿墻時,蛇頭的位置坐標和自己身體的某個節(jié)點的坐標相同時,蛇就死掉了,游戲結(jié)束。5.3貪吃蛇游戲功能游戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設(shè)置了一個游戲的標題畫面。標題畫面以后,還要為游戲的運行部分作初始化,包括繪制游戲運行時的背景,對游戲某些重要變量的初始化。貪吃蛇的要求為:一條蛇在封密的圍墻內(nèi),在圍墻內(nèi)隨機出現(xiàn)一個食物。通過按鍵盤上的四個光標控鍵控制蛇向上下左右四個方向移動,蛇頭撞到食物,則表示食物被蛇吃掉,這時蛇的身體長一節(jié),同時計10分,接著又出現(xiàn)食物,等待被蛇吃掉。如果蛇在移動過程中,撞到墻壁或蛇頭撞到自己身體游戲結(jié)束。這個程序的關(guān)鍵點是表示蛇的圖形以及蛇的移動??梢杂靡粋€小矩形表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊,蛇頭用一節(jié)表示。移動時必須從蛇頭開始,所以蛇不能向相反移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當(dāng)前方向上前移,當(dāng)游戲者按了有效的方向鍵后,蛇頭朝指定的方向移動,一步移動一節(jié)身體,所以當(dāng)按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現(xiàn)是從蛇頭的新位置開始畫出蛇。這時,由于沒有清屏的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來蛇會多一節(jié)身體,應(yīng)將蛇的最后一節(jié)用背景覆蓋。食物的出現(xiàn)和消失也可以用畫矩形塊和覆蓋矩形塊方法實現(xiàn)。6貪吃蛇設(shè)計6.1系統(tǒng)的輸入輸出6.1.1輸入在該程序設(shè)計中幾乎沒有什么從鍵盤你輸入的數(shù)據(jù),所有的程序所運用的數(shù)據(jù)都是有程序本身提供的,由用戶來選擇,程序?qū)⒏鶕?jù)用戶的選擇來處理相應(yīng)的數(shù)據(jù),如在玩家改變游戲設(shè)置的時候,程序會根據(jù)玩家選擇的設(shè)置來改變圍墻的可穿性。6.1.2輸出在該程序中,輸出的數(shù)據(jù)有玩家單局游戲的總時間,升到的等級,蛇吃到食物的個數(shù),以及目前的得分,玩家可以通過點擊右鍵打開菜單,了解一些相關(guān)信息,當(dāng)玩家控制的蛇死亡后要輸出一個消息GAMEOVER表示蛇的死亡。6.1.3蛇的移動蛇的移動主要通過改變蛇的坐標位置,然后通過重繪蛇的位置,這樣就實現(xiàn)了蛇的移動,具體的為:從構(gòu)成蛇身的所有節(jié)點的最后一點開始,依次將前一個節(jié)點的坐標賦值為后一個節(jié)點,這樣就實現(xiàn)了蛇身的移動。接下來是蛇頭的移動,蛇頭的移動要根據(jù)蛇的運動方向來做出相應(yīng)的移動。6.2設(shè)計基礎(chǔ)在設(shè)計中用到了節(jié)、數(shù)組、坐標系來定義一些重要內(nèi)容,以便于程序的編寫。以下進行簡述(1)節(jié)一條蛇可以看成由許多正方形的“小格子”拼湊成,稱作節(jié)。節(jié)是蛇身上最小的單位。(2)數(shù)組用來保存每一段的狀態(tài),數(shù)組的元素單位是節(jié)。且鏈表的第一個元素表示蛇的尾部。(3)坐標系以左上角那點為(0,0),向右則x遞增,向下則y遞增。6.3數(shù)據(jù)字典設(shè)計中用到的數(shù)據(jù)的名稱、類型、含義如表6-1所示。表6-1數(shù)據(jù)的類型及含義名稱類型含義SnakeBody[Max][2]int蛇頭在數(shù)組中的位置header_Indexchar蛇的身體坐標信息tail_Indexint蛇尾在數(shù)組中的位置eat_Xint出現(xiàn)食物的位置的橫坐標eat_Yint出現(xiàn)食物的位置的縱坐標levelint游戲的等級speedint蛇的運行速度scoreint出現(xiàn)食物的位置的橫坐標eatNumint貪吃蛇吃到食物的數(shù)量map_rowint貪吃蛇運動范圍的長度map_colint貪吃蛇運動范圍的寬度Dirint當(dāng)前貪吃蛇移動的方向stepint貪吃蛇移動的步長tempxint蛇頭下一個臨時存放位置的橫坐標tempyint蛇頭下一個臨時存放位置的縱坐標CanGoThroughWallbool判斷貪吃蛇是否能夠穿墻hasMovedbool用于避免兩次方向鍵之間間隔太小造成的錯誤6.4處理流程圖6-1處理流程圖根據(jù)要求的貪吃蛇結(jié)構(gòu)設(shè)計出相應(yīng)的貪吃蛇處理流程圖(如圖6-1所示)。處理流程圖基本概述了整個游戲的流程,首先打開游戲,彈出游戲的標題畫面,等待游戲的加載,之后進入游戲運行界面,在此界面點擊右鍵會出現(xiàn)游戲幫助菜單、游戲關(guān)于菜單。在主界面上有設(shè)置游戲難度按鈕,可以更改游戲難度,游戲開始后,可以通過方向鍵控制貪吃蛇的運動方向,也可以選擇P鍵使游戲暫停。當(dāng)你控制的貪吃蛇接觸到蛇的自身身體時或墻壁時,游戲結(jié)束。流程圖的主要作用是可以很直觀的了解到游戲的功能,同時,在繪制好流程圖后,在后面的編寫代碼時也比較明確。6.5系統(tǒng)的邏輯模型系統(tǒng)的邏輯模型如圖6-2所示圖6-2系統(tǒng)邏輯模型6.6功能與程序的關(guān)系1.游戲界面主框架主要包括貪吃蛇運動界面,信息顯示界面。1)貪吃蛇運動界面主要包括:食物的隨機出現(xiàn)位置,蛇的移動2)信息顯示界面包括:得分顯示,等級顯示,難度顯示,游戲難度設(shè)置,游戲說明,退出2.與程序的關(guān)系貪吃蛇運動界面貪吃蛇的移動及吃到食物的發(fā)生,向信息顯示界面發(fā)出信號,刷新得分,并在達到一定限額提升等級。信息顯示界面中的按鈕點擊事件,發(fā)出信號,設(shè)置貪吃蛇運動界面的限制性條件。6.7運行設(shè)計6.7.1運行控制由用戶選擇游戲控制類別:開始、暫停、繼續(xù)、游戲設(shè)置、退出,不可以手動控制游戲級別,只能在達到一定界限,自動增加難度,這樣有助于循序漸進。6.7.2運行時間蛇移動方法及食物的顏色變化長期占用資源,改變方向、吃到食物、產(chǎn)生新食物都是瞬發(fā)動作,只是瞬間占用系統(tǒng)資源。7貪吃蛇實現(xiàn)7.1程序系統(tǒng)的組織結(jié)構(gòu)7.1.1每個模塊的名稱、標識符explicitSnake(QWidget*parent=0);ClassSnake的構(gòu)造函數(shù),設(shè)置QWidget的初始化信息,貪吃蛇運動區(qū)域的大小,調(diào)用其他初始化函數(shù)。~Snake();ClassSnake的析構(gòu)函數(shù),用于釋放一些空間。voidiniWidget();用于添加各類控件,并設(shè)置控件的屬性。voidiniConnect();用于連接信號,使能夠在收到信號時,轉(zhuǎn)到相應(yīng)的函數(shù)處理。boolisEating();判斷貪吃蛇是否吃到食物。boolisGameOver();通過之前的設(shè)置信息,判斷游戲是否結(jié)束。voidiniGame();用于初始化游戲,設(shè)置初始速度、等級、已吃食物數(shù)量及定時器等,并隨機得到貪吃蛇和食物的初始坐標。voidchangeScore();更新并顯示得分。voidchangeLevel();更新并顯示等級,每增加10個食物,升一級,并提高速度。QColorgetColor();獲取隨機顏色。voidpaintEvent(QPaintEvent*);繪圖事件,繪制貪吃蛇、食物。voidkeyPressEvent(QKeyEvent*event);鍵盤處理事件,捕獲按鍵信號,并作出相應(yīng)的處理。voiddoMoveSnake();實現(xiàn)蛇在當(dāng)前方向下向前移動一步,并調(diào)用判斷是否吃到食物函數(shù)、判斷是否死亡函數(shù)。voidsetEnableGoThroughWall();設(shè)置是否可穿墻函數(shù),將結(jié)果顯示在信息顯示界面。voidtimerEvent(QTimerEvent*);時間處理函數(shù),用于實現(xiàn)顯示游戲的時間。voidInfoChange();操作信息顯示函數(shù),實現(xiàn)彈出對話框,提示操作說明。voidAboutChange();游戲相關(guān)信息顯示函數(shù),實現(xiàn)彈出對話框,提示游戲相關(guān)信息。7.1.2模塊之間的關(guān)系此程序中各個模塊之間的關(guān)系如圖7-1所示圖7-1模塊關(guān)系圖7.2程序描述7.2.1目的和意義該部分以窗體上的按鈕或鍵盤上的快捷鍵為用戶提供友好的控制手段。為工作量繁大的用戶提供一個簡單而有趣的小游戲。7.2.2特點說明程序交互性好,操作性強。易操作。簡單而有趣。功能全面,如:開始新游戲、暫停、繼續(xù)、設(shè)置難度、查看游戲幫助、退出游戲。7.3程序詳解7.3.1構(gòu)造函數(shù)Snake(QWidget*parent)Snake::Snake(QWidget*parent):QWidget(parent),ui(newUi::Snake),step(15) {ui->setupUi(this);setFocusPolicy(Qt::StrongFocus);//如何讓QWidgt接收鍵盤事件和點擊事件setFixedSize(630,340);//設(shè)置QWidgt大小qsrand(QTime(0,0,0).msecsTo(QTime::currentTime())); //取時間作為產(chǎn)生隨機數(shù)的種子map_row=Height/step;//設(shè)置貪吃蛇活動區(qū)域大小map_col=Width/step;CanGoThroughWall=false;//默認初始化難度設(shè)置為禁止穿墻//初始化時分秒為0sec=0;min=0;hour=0;iniWidget();iniConnect();iniGame();}通過這個函數(shù)實現(xiàn)了QWidget的簡單屬性設(shè)置,包括QWidget的聚焦及大小,初始化了貪吃蛇的運動范圍,默認設(shè)置游戲難度為禁止穿墻。取用時間作為產(chǎn)生隨機數(shù)的種子,用于之后貪吃蛇的蛇身初始化,食物的初始化。初始化游戲時間為00:00:00。通過調(diào)用iniWidget()函數(shù)初始化了Widget中的控件信息等,通過調(diào)用iniConnect()函數(shù)初始化了連接信號,通過調(diào)用iniGame()函數(shù)初始化了游戲的基本信息。7.3.2初始化界面函數(shù)iniWidget()voidSnake::iniWidget(){timeNumber=newQLabel("00:00:00");timeNumber->setFont(QFont("Times",15));timeLabel=newQLabel(this);timeLabel->setFont(QFont("Times",15));timeLabel->setText("Time:");scoreNumber=newQLCDNumber(5);//得分顯示器LCD數(shù)字顯示框scoreNumber->setSegmentStyle(QLCDNumber::Flat);//設(shè)置顯示方式scoreNumber->setParent(this);//scoreNumber->setGeometry(370,30,70,50);scoreLabel=newQLabel(this);//分數(shù)標簽scoreLabel->setFont(QFont("Times",15));//設(shè)置字體scoreLabel->setText("Score:");//設(shè)置顯示內(nèi)容//scoreLabel->setGeometry(320,40,30,30);//設(shè)置大小levelNumber=newQLCDNumber(5);//等級顯示器levelNumber->setSegmentStyle(QLCDNumber::Flat);levelNumber->setParent(this);//levelNumber->setGeometry(370,90,70,50);levelLabel=newQLabel(this);//等級標簽levelLabel->setFont(QFont("Times",15));levelLabel->setText("Level:");//levelLabel->setGeometry(320,100,30,30);setlabel=newQLabel(this);//難度顯示器setlabel->setFrameStyle(QFrame::Sunken|QFrame::Panel);//setlabel->setGeometry(325,150,115,90);setlabel->setAlignment(Qt::AlignCenter);//setlabel->setFont(QFont("Times",18,QFont::Black));setlabel->setFont(QFont("Times",15,QFont::Black));setlabel->setText(tr("游戲難度:禁止穿墻"));QPalettepe1;//顯示setlabel字體顏色為綠色

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論