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