基于Qt的打磚塊游戲開發(fā)_第1頁
基于Qt的打磚塊游戲開發(fā)_第2頁
基于Qt的打磚塊游戲開發(fā)_第3頁
基于Qt的打磚塊游戲開發(fā)_第4頁
基于Qt的打磚塊游戲開發(fā)_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基于Qt的黑白棋游戲開發(fā)PAGEPAGEI基于Qt的打磚塊游戲開發(fā)摘要本程序使用的是面向?qū)ο蟮腝T庫的C++語言開發(fā),在ubuntu系統(tǒng)中的QTCreator軟件中實現(xiàn)構(gòu)建和運行。游戲包含三種模式,初級,中級,高級。游戲是小球的彈射,把所有的磚塊打完勝利。

本論文首先指出了打磚塊游戲、Linux桌面環(huán)境、QT開發(fā)環(huán)境的發(fā)展現(xiàn)狀,然后重點介紹了QT開發(fā)工具的使用、打磚塊游戲的玩兒法、打磚塊程序的界面設(shè)計、規(guī)則設(shè)計、輸贏判斷、以及作為一款游戲的其他必須功能,最后介紹了Linux桌面環(huán)境和QT的發(fā)展。

本設(shè)計通過一個休閑類游戲的開發(fā),闡述了休閑類游戲的開發(fā)過程,包括軟件開發(fā)的邏輯分析,程序設(shè)計,軟件實現(xiàn)和軟件測試幾個步驟。關(guān)鍵詞:打磚塊;ubuntu系統(tǒng);QT開發(fā)環(huán)境PAGEPAGEIIBrickbatdevelopmentbasedonQtAbstractThisprocedureistheuseofobject-orientedQTlibraryC++languagedevelopment,theQTsystemintheCreatorUbuntusoftwaretoachieveconstructionandoperation.Thegamecontainsthreemodes,primary,intermediate,advanced.Thegameistheejectionoftheball,allthebricksonthevictory.Thispaperfirstpointsoutthearkanoidgame,Linuxdesktopenvironment,Qtdevelopmentenvironmentdevelopmentpresentsituation,andthenfocusesontheQtdevelopmenttoolsused,arkanoidgameplayingmethod,playingbricksprograminterfacedesign,designrules,todeterminethewinnersandlosers,andasagametheothermustfunction.Atlast,thepaperintroducesthedevelopmentofLinuxdesktopenvironmentandQT.Thisdesignthroughaleisureclassgamedevelopment,elaboratedtheleisureclassgamedevelopmentprocess,includingthesoftwaredevelopmentlogicanalysis,theprogramming,thesoftwarerealizationandthesoftwaretestseveralsteps.Keywords:blockbreaker;Ubuntusystem;QTdevelopmentenvironmentPAGEPAGEIV目錄1背景 11.1系統(tǒng)開發(fā)背景 11.2打磚塊簡介 21.2.1打磚塊游戲規(guī)則 21.2.2打磚塊游戲簡介 21.2.3娛樂身心 31.3相關(guān)實現(xiàn)環(huán)境 31.4主要實現(xiàn)內(nèi)容 31.5系統(tǒng)開發(fā)的現(xiàn)實意義 32開發(fā)工具 52.1QT簡介 52.1.1信號與槽 52.2ubuntu系統(tǒng)的簡介 72.2.1ubuntu歷史和發(fā)展 82.2.2ubuntu系統(tǒng)的特色 92.3vmware虛擬機(jī)的介紹 102.3.1vmware的主要功能 102.4開發(fā)環(huán)境的配置 102.4.1vmware虛擬機(jī)的安裝 112.4.2ubuntu系統(tǒng)的安裝 112.4.3qtcreator軟件的安裝 112.5小結(jié) 113打磚塊需求分析 123.1打磚塊游戲程序界面的需求 123.2打磚塊游戲規(guī)則的需求 123.3打磚塊游戲的對象的需求 124打磚塊總體設(shè)計 144.1主要模塊簡介 144.2程序功能設(shè)計 145程序?qū)崿F(xiàn) 165.1界面實現(xiàn) 165.2功能的實現(xiàn) 165.2.1小球類Ball 175.2.2磚塊類Brick 195.2.3劃槳類Paddle 205.2.4Game

游戲窗格 235.2.5Gamewindow游戲主窗口 335.2.6main函數(shù) 376程序測試 396.1程序啟動 396.2游戲運行碰撞 396.3游戲判斷輸贏 406.4程序測試結(jié)果 417程序開發(fā)的意義和展望 42結(jié)論 43參考文獻(xiàn) 44致謝 45外文原文 46外文翻譯 53PAGEPAGE561背景1.1系統(tǒng)開發(fā)背景隨著網(wǎng)絡(luò)技術(shù)的日新月異和計算機(jī)的普及,當(dāng)今的計算機(jī)技術(shù)也走上了平民化和娛樂化的時代,計算機(jī)技術(shù)再也不是只能由少數(shù)人掌握的深不可測的學(xué)問;同時個人電腦也由原來單純的數(shù)值計算和工業(yè)應(yīng)用逐漸轉(zhuǎn)變成像電視機(jī)一樣的家庭娛樂中心,隨著科技的飛速發(fā)展計算機(jī)軟件的發(fā)展也走向了娛樂化。

尤其是游戲產(chǎn)業(yè)的發(fā)展已經(jīng)成為信息產(chǎn)業(yè)中發(fā)展勢頭最猛烈最具前景的一個分支,而游戲廳也漸漸被網(wǎng)吧擠出了正常的營業(yè)市場,游戲除了單純的個人娛樂功能之外,也逐漸向互動的方向發(fā)展。游戲的功能不斷按照玩家的需求和愛好擴(kuò)展延伸進(jìn)化,如今運行在各種平臺上不同名稱,不同內(nèi)容,不同形式的游戲不僅僅為廣大游戲愛好者提供了豐富的選擇,而且為游戲開發(fā)商帶來了豐厚的回報,游戲產(chǎn)業(yè)吸引著許多程序員去開發(fā)更多更新的游戲。

基于游戲發(fā)展的歷史和前景,本文中決定用C++語言開發(fā)一款小游戲,游戲內(nèi)容來自網(wǎng)絡(luò)上日漸流行的一種休閑類游戲打磚塊。本文中想把這種游戲,變成一種簡單的,可以在linux系統(tǒng)上玩兒的游戲,以便供廣大玩家玩兒。打磚塊游戲從兒時開始,也是隨著時代的發(fā)展而發(fā)展,衍生出了很多的各種各樣的類似的游戲,還是很受大部分游戲玩家的喜愛。由于游戲簡單,容易上手,很多的小孩子都可以玩兒。而且這個游戲主要的是聯(lián)系玩兒家的反應(yīng)力。說起游戲軟件,大部分的人會覺得很神秘,通過一些代碼的操作,就可以實現(xiàn)一款游戲,而且讓人們玩兒的很開心。其實游戲開發(fā),已經(jīng)越來越被人們接受了,越來越多的人們加入到游戲開發(fā)的行業(yè)中。作為最最古老的游戲之一的打磚塊游戲,各類版本是不計其數(shù)。但是,復(fù)雜的算法和設(shè)計難度,讓游戲初學(xué)者望而卻步。本文是在qt來實現(xiàn)這個游戲的制作,對于一些初學(xué)者是一個很好的例子,而且可以了解這款軟件的詳細(xì)開發(fā)過程。1.2打磚塊簡介打磚塊游戲是一種動作電子游戲的名稱。玩家操作一個可以水平移動的劃槳,讓一顆不斷彈來彈去的“球”在來回撞擊磚塊途中不會落到游戲界面的外面。球碰到磚塊、棒子與底下以外的三邊會反彈,落到底下會失去一顆球,把磚塊全部消去就可以破關(guān)。始祖是史蒂夫·喬布斯與他的好友沃茲(蘋果公司的另一位創(chuàng)始人)于1975年的夏末,花了四天時間設(shè)計完成的游戲《乒乓》。同時,美國英寶格公司(en:AtariGames,ja:アタリ(ゲーム))于1976年推出的街機(jī)游戲“Breakout”,由該公司在1972年發(fā)行的“PONG”(en:PONG,ja:ポン(ゲーム),世界上第一款電子游戲,類似臺球)改良而來。相較于其前作,一個人就可以玩與變化豐富這兩項特點讓Breakout相當(dāng)賣座,使各家公司競相模仿。因為規(guī)則簡單與游戲性,現(xiàn)在許多移動電話都有內(nèi)建打磚塊游戲,也有許多因特網(wǎng)小游戲版本。打磚塊游戲一般不大,甚至用軟盤即可容下。1.2.1打磚塊游戲規(guī)則用一根棒子,把落下的小球反彈回去,把上方所有的長方形磚塊全部打落下來,就可以通關(guān)。磚塊的擺放形狀,和堅硬程度,小球的速度快慢,還有短棒的長短都是可以變化的。1.2.2打磚塊游戲簡介打磚塊游戲相必都不回陌生,從小時候的小霸王游戲機(jī)上就有的一款很經(jīng)典的游戲,風(fēng)靡一時,打磚塊游戲容易上手,游戲的變化性,可玩兒性都非常高,而且隨著社會的發(fā)照,打磚塊游戲適應(yīng)與各個平臺,界面做得也是越來越好,所以,現(xiàn)在的打磚塊游戲頁非?;?。那什么是打磚塊游戲呢,就是一款游戲界面的下方有一個劃槳,用來接球,然后又一個小球可以在游戲界面里碰到阻礙物就反彈,然后不讓小球落地,把游戲界面上放的磚塊全部打完。游戲就過關(guān)了。1.2.3娛樂身心游戲是否能夠讓玩家娛樂身心,取決于它的可玩兒性,是否有挑戰(zhàn)性,這是一款游戲的關(guān)鍵所在。很多人玩兒游戲就是為了過關(guān),特別是單機(jī)游戲,過不了關(guān)就會一直玩兒下去,直到過關(guān)為止。1.3相關(guān)實現(xiàn)環(huán)境本程序采用QT庫及其開發(fā)環(huán)境,使用C++語言開發(fā)運行于Linux的ubuntu系統(tǒng)中的qtcreatot軟件的打磚塊游戲。經(jīng)過實際檢測,QT強(qiáng)大的跨平臺性,已經(jīng)保證了同樣的代碼在WindowsXP下、LinuxGNOME下、LinuxKDE下,幾乎不用修改就能正常運行。本程序使用的軟件是Qtcreator5.4,運行在Vmware虛擬機(jī)上ubuntu系統(tǒng)64位14.04.1版本。1.4主要實現(xiàn)內(nèi)容1,可以簡便的開始游戲,游戲中的功能與日常我們所熟悉的游戲的功能一致,直到磚塊全部打光過關(guān)和在磚塊打光之前機(jī)會用完游戲結(jié)束功能。2,當(dāng)游戲結(jié)束時會彈出消息框提示游戲是否勝利等。3,游戲的開發(fā)環(huán)境是qtcreator5.4.4,游戲開始的時候,小球會停在擋板中間,而且此時的小球可以隨著擋板左右移動,當(dāng)按下開始鍵的時候小球彈出,并在程序設(shè)定的區(qū)域中不停的碰撞反彈。5,當(dāng)小球碰撞到墻壁,擋板和磚塊的時候,均以相同的速度反彈,并且磚塊被碰撞后會消失。6,劃槳左右移動接住落下的小球,如果沒有接住,游戲就結(jié)束,是失敗者,當(dāng)磚塊全部打光時出現(xiàn)勝利,是一個勝利者。1.5系統(tǒng)開發(fā)的現(xiàn)實意義根據(jù)平時的所學(xué)知識,在畢設(shè)的時候能夠熟悉C++語言的多變性,鍛煉在項目上的實踐能力,學(xué)會熟練的使用qt開發(fā)框架,這樣既回味了兒時的一款經(jīng)典游戲,而且做這個游戲,對也是一個挑戰(zhàn),也是能力提升的好機(jī)會。在設(shè)計中,本文中先試調(diào)查了這個游戲,翻閱相關(guān)的文檔資料,然后寫需求文檔,根據(jù)文檔的步驟一步一步的把這個設(shè)計完成。給了很多的啟發(fā),對細(xì)心,耐心也是一個考驗。同時對專業(yè)知識也是一個重大的考驗,完善了自己很多方面的知識。

綜上所述,通過打磚塊游戲的開發(fā),可以深入了解c++編程方法、加深了解算法,對邏輯思維和細(xì)心耐心是一種鍛煉。2開發(fā)工具2.1QT簡介Qt是一個多功能型的,一種對于c++語言的一種程序設(shè)計開發(fā)框架,是挪威公司設(shè)計開發(fā)上線的一款產(chǎn)品,現(xiàn)在的開發(fā)平臺的很多,比如windows系統(tǒng),unix系統(tǒng),和linux系統(tǒng),都可以適用,還有mac系統(tǒng),還有winnt/win2k和win95/98平臺。由這個公司開發(fā)的產(chǎn)品還有qtdesigner快速開發(fā)工具,基于framebuffer的qtembedded,國際化的qtlinguist等。Qt為c++用戶提供了可供觀察的圖形界面,讓c++開發(fā)人員更佳直觀的能看到自己多的項目,同時,增加了,項目的美觀性,還可以份文件編程,飾代碼的可讀性提高,還有ui,可以不通過編寫代碼,進(jìn)行一些簡單的操作。這對于c++開發(fā)人員面對無聊枯燥的代碼,是一個很大的幫助。面向?qū)ο螅?/p>

Qt擁有良好的封裝性,通過在qtapp中進(jìn)行新建文件,可以進(jìn)行多文件的封裝,可以把一個項目,通過同學(xué)合作的方式,一部分一部分實現(xiàn),把一個繁瑣的項目,分成一個一個的小項目,對于發(fā)開來說,簡單了很多,每個人只需要完成自己的部分,然后把代碼拷貝到一起,就可以運行。

豐富的API:

Qt有200多個類,可以滿足程序開發(fā)人員在開發(fā)過程中的各種要求,類的重寫,重載,方式多種多樣,對于程序員是很大的福利。不需要每個類都一個字一個字去敲。2.1.1信號與槽QT開發(fā)框架不同于別的開發(fā)框架,最大的特點,就是信號與槽。信號和槽用于對象間的聯(lián)系,進(jìn)行通信的手段。信號和槽機(jī)制是Qt開發(fā)框架的最大的特征,并且也是Qt開發(fā)框架與其它的開發(fā)框架最不相同的部分,連接如圖2-1所示:

圖2-1信號和槽連接的摘要圖在有圖形界面的代碼編程過程中,我們經(jīng)常非常希望自己所寫的一個窗口部件的一個變化,通過一定的方式被另一個自己所寫的窗口部件所接受到信息。更加通俗的說,我們希望所有自己定義的對象可以和任何一個對象進(jìn)行信息傳遞。例如,如果我們正在解析一個XML文件,當(dāng)我們遇到一個新的標(biāo)簽時,我們也許希望通知列表視圖我們正在用來表達(dá)XML文件的結(jié)構(gòu)。在Qt發(fā)開框架中有一種可以替代jsp中回調(diào)函數(shù)的技術(shù)。我們使用信號和槽的這種機(jī)制,進(jìn)行信息的傳遞。當(dāng)一個事件發(fā)生的時候,會生成一個信號,這個信號立馬被發(fā)射。然后還有一個槽進(jìn)行接受自己發(fā)送的信號。qt開發(fā)框架有非常多的自己定義的信號,比如,點擊,事件信號等等。但是我們在開發(fā)的過程中,總是希望通過繼承和多態(tài)來加入我們自己定義的信號。槽是一個特別重要的,一個可以被用來接收自己定義,或者是Qr自己定義的信號。Qt也有很多自己定義的槽,比如關(guān)閉,打開,點擊等,但是通常的習(xí)慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號。

信號和槽的機(jī)制是類型安全的:信號簽名必須和自己接收的槽簽名進(jìn)行一一對應(yīng),就是保持一致。(實際上一個槽的簽名可以比它接收的信號的簽名少,因為它可以忽略額外的簽名。)因為信號和槽的簽名是一致的,所以編譯器就可以在我們編寫代碼的時候幫助我們檢測類型到底匹配還是不匹配。信號和槽是寬松地聯(lián)系在一起的:一個發(fā)射信號的類它只管自己在特定的條件去發(fā)送這個信號就好了,不用知道也不用注意哪個槽要接收這個信號。Qt的信號和槽的這種安全機(jī)制可以保證如果你把一個信號和一個槽函數(shù)連接起來的話,槽函數(shù)會在特定的時間,也就是事件發(fā)生的時候使用信號的參數(shù)而順利的被調(diào)用。信號和槽函數(shù)在信息通信的過程中可以使用不同數(shù)量、不同任何類型的參數(shù)。信號和槽是完全類型絕對安全的,不會出現(xiàn)核心已轉(zhuǎn)儲的錯誤。信號與槽機(jī)制是一個函數(shù),原型如圖2-2所示:圖2-2信號和槽函數(shù)原型圖

QObject::connect(&a,SIGNAL(funtionA()),&b,SLOT(funtionB()))

這一行在兩個Qt對象(直接或間接繼承QObject對象的對象)中建立了一種單向的連接。每一個Qt對象都有signals(發(fā)送消息)和slots(接收消息)。所有窗口部件都是Qt對象。它們繼承QWidget,而QWidget繼承QObject。該函數(shù)意思是a部件發(fā)出funtionA()消息,b部件執(zhí)行funtionB()函數(shù)。2.2ubuntu系統(tǒng)的簡介烏版圖(ubuntu)系統(tǒng)是一個linux系統(tǒng),而且它提供給用戶一個圖形界面,它的名字是來自于非洲的一個部落,用他們那兒的語言說烏版圖,其實是人性的意思,也就是說因為大家的存在這個系統(tǒng)才存在,這也是非洲人命的一種觀念,類似于中國社會里面仁愛,愛人的意思。ubuntu是根據(jù)debian的使用發(fā)行版和gnome的桌面,兩者相結(jié)合。但是從11.04版本開始,ubuntu不用gnome的桌面,改用unity。Ubuntu系統(tǒng)的目標(biāo)是為用戶提供一種可供用戶開發(fā)的一個全新的,穩(wěn)定的圖形界面開發(fā)環(huán)境,從而可以隨意的進(jìn)行軟件的構(gòu)成。Ubuntu有龐大的用戶量,有很多的社區(qū)力量,可以得到用戶和社區(qū)的幫助。2.2.1ubuntu歷史和發(fā)展ubuntu系統(tǒng)的創(chuàng)始人是馬克·舍特爾沃斯,第一個版本是4.10,是在北京時間2004年10月20日發(fā)布的,而且,ubuntu每6月就會發(fā)布新版本,為了人民的獲取和使用新的軟件。Ubuntu系統(tǒng)的發(fā)開的初衷是為了讓電腦端更加的簡單,同時也有商業(yè)版本。Ubuntu會包含最新的gnome的桌面在每一個新發(fā)布的版本中,通常gnome發(fā)布一個月后緊接著就會發(fā)布。Ubuntu大多數(shù)使用的是自由,開源的軟件,別的發(fā)布版本往往會帶有非常多的閉源軟件。由于ubuntu是建于debian的分支,通常是軟件的格式和軟件的管理和安裝。Ubuntu的開發(fā)者和使用者可以把軟件中的修改意見實時反饋給社區(qū),而不是等新的版本快要發(fā)布的時候才去宣布修改意見。Ubuntu系統(tǒng)的運作最主要的是依靠canonical公司的支持,同時也有社區(qū)人們的大力相助,用戶的大力支持。ubuntu的開發(fā)者稱馬克為sabdfl,也就是自封終生開源之父。在北京時間2005年7月8日,馬克和canonical公司正式宣布成立基金會,為ubuntu,并且投資了一千萬美金作為啟動資金。這個基金會的成立的目的是為了讓ubuntu系統(tǒng)能夠從此一直開發(fā)下去。但是一直到2006年的時候,這部分資金依然沒有投入到運作當(dāng)中。馬克說,這筆資金會在canonical公司財務(wù)出現(xiàn)危機(jī)的時候作為緊急資金進(jìn)行運作。一開始的時候,用戶會得到免費獲得系統(tǒng)光盤的服務(wù)。這種服務(wù)一直延續(xù)到ubuntu6.10之前,但是從6.10之后這種服務(wù)就被終止了,用戶只可以在網(wǎng)上下載鏡像文件進(jìn)行安裝。然后再7.04半杯更新的時候,這種服務(wù)被再次啟動,然后好景不長,在11.04版本推出的時候,這種服務(wù)又被停止了。ubuntu是發(fā)展史如圖2-3所示:圖2-3Ubuntu歷史發(fā)展圖2.2.2ubuntu系統(tǒng)的特色Ubuntu的最大的特色就是與系統(tǒng)所有相關(guān)的命令任務(wù)都得使用sudo這個指令,這種管理的方式就奠定了這種系統(tǒng)的安全性是非常高的比起傳統(tǒng)的用管理員的賬號密碼進(jìn)行管理的系統(tǒng),這也是linux系統(tǒng)的最基本的思維之一了。windows系統(tǒng)在發(fā)布的較新的一個版本中也用了一種類似UAC的機(jī)制,但是用戶量也不是很多,同時,ubuntu也非常的注重易用性,也就是說,當(dāng)用戶完成了ubuntu系統(tǒng)的安裝以后,所有的瀏覽器,辦公軟件,各種驅(qū)動都不需要再安裝,就可以進(jìn)行使用了。由于ubuntu的發(fā)開和社區(qū)保持著緊密的關(guān)系,所以左右的發(fā)布版本都用的是最新的gnome的版本。ubuntu系統(tǒng)與debian使用的是相同的deb包的格式,所以很多的由debian編譯的軟件包,都可以兼容而且使用,當(dāng)然,也不是完全的兼容。2.3vmware虛擬機(jī)的介紹Vmware是一個軟件,它的作用是為用戶提供一個虛擬機(jī),vmware是全世界桌面到數(shù)據(jù)虛擬化的龍頭,是領(lǐng)導(dǎo)者。全世界各種各樣的用戶都依靠著vmware虛擬機(jī)軟件降低開發(fā)成本和費用,同時確保業(yè)務(wù)的持續(xù)進(jìn)行和安全。2008年的時候vmware一年的總收入是19億美金,擁有了十五萬的用戶量和接近兩萬兩千家公司合作,是當(dāng)時增長最快的已經(jīng)上市的軟件公司之一。vmware公司的總部駐扎在加利福尼亞州的PaloAlto市。Vmware公司在云計算基礎(chǔ)架構(gòu)領(lǐng)域和虛擬化領(lǐng)域是全球的領(lǐng)先者,給用戶提供的一系列解決方案通過敏捷的交付服務(wù),降低復(fù)雜度,提高靈活性。vmware采用云計算模式可以解決企業(yè)獨有的業(yè)務(wù)難題。vmware提供的解決問題的方案可以在加快向云計算的過度的同時保留現(xiàn)有的投入資金并且提高安全性和控制力?,F(xiàn)如今,vmware有四十萬的客戶量和五萬五千家合作伙伴。2.3.1vmware的主要功能Vmware產(chǎn)品的主要功能有以下幾點:1.在現(xiàn)有的操作系統(tǒng)中,使用別的操作系統(tǒng),不需要進(jìn)行分區(qū)。2.和原有的操作系統(tǒng)文件隔離,擁有自己的運行環(huán)境文件環(huán)境。3.不同的系統(tǒng)之間可以互動,進(jìn)行一些復(fù)制粘貼,公用網(wǎng)絡(luò)等等。4.有備份,可以進(jìn)行復(fù)原功能。5.能夠在用戶的需求中進(jìn)行更改操作系統(tǒng)的操作環(huán)境。6.可用性高,并且熱遷移。2.4開發(fā)環(huán)境的配置程序的運行環(huán)境是在vmware虛擬機(jī)中安裝ubuntu系統(tǒng),然后在ubuntu系統(tǒng)中安裝qrcreator進(jìn)行開發(fā)。2.4.1vmware虛擬機(jī)的安裝Vmware虛擬機(jī)從官方網(wǎng)站上直接進(jìn)行下載,下載最新的,或者最完善的版本就可以,然后運行安裝程序,一步一步進(jìn)行安裝就好了。2.4.2ubuntu系統(tǒng)的安裝Ubuntu系統(tǒng)的安裝就需要進(jìn)行配置了,當(dāng)然,首先得下載ubuntu系統(tǒng)的鏡像文件,然后點開vmware虛擬機(jī)的添加新系統(tǒng),然后把ubuntu的鏡像文件拖入其中,然后按照個人喜好,分出一定的空間,然后一步一步進(jìn)行安裝就好。2.4.3qtcreator軟件的安裝同樣,因為ubuntu系統(tǒng)安裝完畢是可以聯(lián)網(wǎng)的,然后,ubuntu系統(tǒng)中有自己的軟件商店,所以只需要把需要下載的軟件輸入查找,就可以找到qtcreator這個開發(fā)框架的軟件了。2.5小結(jié)前四個小結(jié)介紹了,qt開發(fā)框架,ubuntu系統(tǒng),和vmware虛擬機(jī)的一些信息,由來,還有歷史,等等信息,然后還介紹了開發(fā)環(huán)境的搭建,包括虛擬機(jī)的安裝,ubuntu系統(tǒng)的安裝和設(shè)置,還有qt的安裝和設(shè)置,所以接下來完事具備,就要開始進(jìn)行程序的需求分析了,還有程序的總體設(shè)計章節(jié)了。3打磚塊需求分析為了開發(fā)出真正滿足用戶需求的程序,尤其是游戲程序,首先必須知道用戶的需求。把用戶需求作為前提條件,來指導(dǎo)程序的開發(fā)。3.1打磚塊游戲程序界面的需求當(dāng)在網(wǎng)上看到的一系列打磚塊程序的對比分析,現(xiàn)在一個基于界面上的用戶需求已經(jīng)基本確立。該需求包含以下幾點:

1.作為按鈕出現(xiàn)在主界面上的:先選擇初級中級高級。然后開始游戲,可以開始新游。

2.能夠直觀顯示在游戲界面上的:游戲進(jìn)行的分?jǐn)?shù)。3.2打磚塊游戲規(guī)則的需求在上面我們已經(jīng)介紹了,打磚塊游戲的游戲規(guī)則。用一個左右移動的劃槳,把落下的小球反彈回去,把上方所有的長方形磚塊全部打落下來,就可以通關(guān)。磚塊的擺放形狀,和堅硬程度也可以設(shè)計,小球的速度快慢也可是設(shè)定,還有劃槳的長短可以做的事可以變化的。3.3打磚塊游戲的對象的需求小球類,小球的屬性有x坐標(biāo)和y坐標(biāo),顏色,速度,和小球的邊界,xy坐標(biāo)可以知道小球的位置,小球的速度可以設(shè)置游戲的難度,小球的邊界用來判斷是否發(fā)生了碰撞。如圖3-1所示:圖3-1ball類劃槳類有移動時候的大小,和顏色,還有圖形邊界,劃槳需要接球,所以需要移動,移動的快慢得設(shè)置,還有圖形邊界也得設(shè)置,當(dāng)小球發(fā)生碰撞的時候檢測。如圖3-2所示:圖3-2paddle類磚塊類只有顏色和圖形邊界,顏色用于初始化,讓界面美觀,圖形邊界用于碰撞檢測,和消失條件。如圖3-3所示:圖3-3brich類4打磚塊總體設(shè)計本章節(jié)建立在第三章需求分析基礎(chǔ)之上,把用戶的需求轉(zhuǎn)換為程序的藍(lán)圖,作為后面編碼過程中的依據(jù)。4.1主要模塊簡介程序由自定義的5個類構(gòu)成:

?Ball類代表小球,包含小球所在矩形于窗格(frame)中的位置,另外,小球還包含變量來表示小球的顏色、運動速度等屬性。

?Brick類代表磚塊,磚塊同樣包含尺寸、方位、顏色這些信息。

?Paddle類代表劃漿,劃漿包含移動步長、方位、顏色這些信息。

?Game類代表游戲窗格,用來直接控制小球的運行,劃漿的移動,及磚塊的繪制。?GameWindow類代表程序的主窗口,通過菜單和工具欄的動作來間接控制游戲的運行與停止、小球的運行速度等。各個模塊的功能如圖4-1所示:圖4-1各模塊功能圖4.2程序功能設(shè)計程序的主要流程,類與類之間的關(guān)系是這樣的。其中,劃槳類,小球類,和磚塊類是一種類,里面都自己的屬性和方法,但是這幾個類之間沒有什么關(guān)系,他們是通過game類來產(chǎn)生一些聯(lián)系的。gamewindow類就是產(chǎn)生一個可以供玩家看的圖形界面,游戲中的一系列可以觀察到的東西,都是通過這個類實現(xiàn)的,這個類中有很多按鈕,可以對游戲的難度和初始化進(jìn)行控制,還有暫停游戲和繼續(xù)游戲的功能。而game類,通過獲取劃槳,小球,磚塊三個類的信息和方法,對這三個對象進(jìn)行初始化,還有小球的自由移動,劃槳的控制移動,碰撞檢測,和輸贏的判斷。如圖4-2所示:圖4-2流程圖5程序?qū)崿F(xiàn)通過第3章和第4章的描述,黑白棋設(shè)計思路已經(jīng)確定,現(xiàn)在要做的就是把設(shè)計結(jié)果翻譯成專用的程序設(shè)計語言所書寫的程序。編碼是對設(shè)計的進(jìn)一步具體化,本部分的質(zhì)量取決于前期設(shè)計的質(zhì)量,但是,所選設(shè)計語言的特點及編碼風(fēng)格也會對程序的可靠性、可讀性、可測試性和可維護(hù)性產(chǎn)生影響。5.1界面實現(xiàn)為了讓界面看著更加的簡潔簡單,我索性就把游戲界面當(dāng)作開始界面,把開始游戲和選擇游戲難度也放到菜單欄。為了讓游戲界面不是很單調(diào),所以我把所有的磚塊和小球,還有短棒都隨記的顯示一種顏色。讓界面看起來好看一點。菜單欄含下拉菜單。讓界面看起來更加的簡潔。界面如圖5-1所示:圖5-1打磚塊主界面5.2功能的實現(xiàn)程序由自定義的5個類構(gòu)成:Ball類代表小球,包含小球所在矩形于窗格(frame)中的位置,另外,小球還包含變量來表示小球的顏色、運動速度等屬性。

Brick類代表磚塊,磚塊同樣包含尺寸、方位、顏色這些信息。Paddle類代表劃漿,劃漿包含移動步長、方位、顏色這些信息。Game類代表游戲窗格,用來直接控制小球的運行,劃漿的移動,及磚塊的繪制。GameWindow類代表程序的主窗口,通過菜單和工具欄的動作來間接控制游戲的運行與停止、小球的運行速度等。5.2.1小球類Ballball.h#ifndef_BALL_H_#define_BALL_H_#include<QRect>#include<QColor>classBall{public:Ball(qreal,qreal,qreal,QColor=Qt::green);~Ball();voidmove();QRectFrect()const;voidsetShape(constQRectF&);voidsetColor(constQColor&);voidsetDirX(qreal);voidsetDirY(qreal);voidsetSpeed(qreal);QRectFgetShape()const;QColorgetColor()const;qrealgetDirX()const;qrealgetDirY()const;qrealgetSpeed()const;private:QRectF*shape;QColorcolor;qrealdirX;qrealdirY;qrealspeed;};#endifshape用來指向包含小球位置和尺寸信息的QRectF對象,這里使用QRectF而不是QRect,是因為QRectF中使用qreal變量來保存矩形的位置和尺寸信息,而QRect使用int類型變量來保存信息,因此,使用QRectF能跟精確地保存小球的位置和尺寸信息,尤其是當(dāng)對程序窗口進(jìn)行縮放時,這種效果更明顯,其中,qreal類型相當(dāng)于double類型。

color變量用來包含小球的顏色。此外,使用qreal類型dirX和dirY變量來分別表示小球在水平方向和垂直方向的運動方向。setShape函數(shù)用來對shape變量進(jìn)行新的設(shè)置,而getShape函數(shù)用來返回QRectF對象,包含shape變量的副本。當(dāng)窗口需要進(jìn)行繪制時,這時窗口就需要使用

getShape函數(shù)來得知小球的大小和方位,這樣才能正確繪制小球。

setDirX和setDirY函數(shù)用來設(shè)置小球的移動方向,特別時當(dāng)小球與窗口邊緣、劃漿、磚塊進(jìn)行碰撞時,就需要改變小球的移動方向。ball.cpp#include"ball.h"Ball::Ball(qrealx,qrealy,qrealradius,QColorballColor){dirX=1.0;dirY=-1.0;speed=1.0;shape=newQRectF(x,y,radius,radius);color=ballColor;}voidBall::move(){shape->setLeft(shape->left()+dirX);shape->setRight(shape->right()+dirX);shape->setTop(shape->top()+dirY);shape->setBottom(shape->bottom()+dirY);}voidBall::setSpeed(qrealnewSpeed){speed=newSpeed;setDirX(speed);setDirY(-speed);}在這兒得注意一點,就是小球坐標(biāo)的設(shè)置,我是按照常規(guī)的坐標(biāo)系進(jìn)行的設(shè)置,所有,我小球的初始化信息是1,-1這樣子。setSpeed()函數(shù)用來設(shè)置小球的移動速度,move()函數(shù)則用來使小球移動,需要注意的是,調(diào)用QRectF

函數(shù)的setLeft()函數(shù)設(shè)置小球的左邊緣時,小球的寬度也會隨著改變,為防止小球的尺寸發(fā)生改變,需要使用setRight()函數(shù)進(jìn)行同樣的設(shè)置,這樣才能保持小球的寬度不變。5.2.2磚塊類Brickbrick.h#ifndef_BRICK_H_#define_BRICK_H_#include<QRect>#include<QColor>classBrick{private:QRectF*shape;QColorcolor;};#endif這個類主要是進(jìn)行磚塊的屬性設(shè)置,比如磚塊的信息,包括顏色信息和磚塊的邊界信息。還有定義一些要用的方法,比如初始化磚塊顏色和邊界,還有拿到磚塊顏色和邊界。brick.cpp#include"brick.h"Brick::Brick(qrealx,qrealy,qrealwidth,qrealheight,QColorbrickColor){shape=newQRectF(x,y,width,height);color=brickColor;}voidBrick::setShape(constQRectF&newShape){shape->setRect(newShape.left(),newShape.top(),newShape.width(),newShape.height());}QRectFBrick::getShape()const{returnQRectF(shape->left(),shape->top(),shape->width(),shape->height());}具體的告訴,磚塊的顏色是qcolor類,圖形邊界是Qrectf類進(jìn)行實例化。而通過width()和height()可以拿到磚塊的長和高。5.2.3劃槳類Paddlepaddle.h#ifndef_PADDLE_H_#define_PADDLE_H_#include<QRect>#include<QColor>classPaddle{public:Paddle(qreal,qreal,qreal,qreal,QColor=Qt::blue);~Paddle();QRectFgetShape()const;QColorgetColor()const;qrealgetLeft()const;qrealgetRight()const;qrealgetStep()const;voidsetShape(constQRectF&);voidsetColor(constQColor&);voidsetLeft(qreal);voidsetRight(qreal);voidsetStep(qreal);voidmoveLeft();voidmoveRight();private:QRectF*shape;QColorcolor;qrealstep;};#endif與Ball相同的是他們都有shape()和color(),都需要有顏色屬性和邊界的屬性。與Ball不同的是,Paddle中含有setStep函數(shù),用來設(shè)置劃漿移動的步長,特別是當(dāng)程序的窗口進(jìn)行縮放時,劃漿每次移動的距離也應(yīng)相應(yīng)地發(fā)生改變.還有向左移,向右移,操作的控制,首先是先進(jìn)行向左向右移的操作,再得到信息,然后進(jìn)行圖形界面的變動。paddle.cpp#include"paddle.h"#include<QColor>#include<QPoint>Paddle::Paddle(qrealx,qrealy,qrealwidth,qrealheight,QColorpaddleColor){shape=newQRectF(x,y,width,height);color=paddleColor;step=10.0;}voidPaddle::setShape(constQRectF&newShape){shape->setRect(newShape.left(),newShape.top(),newShape.width(),newShape.height());}voidPaddle::moveLeft(){shape->setLeft(shape->left()-step);shape->setRight(shape->right()-step);}voidPaddle::moveRight(){shape->setLeft(shape->left()+step);shape->setRight(shape->right()+step);}voidPaddle::setStep(qrealnewStep){step=newStep;}qrealPaddle::getStep()const{returnstep;}moveLeft和moveRight函數(shù)來提供了控制劃漿移動的接口,每次移動的距離由移動步長變量step來控制。初始化劃槳的時候也是通過初始化劃槳的坐標(biāo),長,寬來設(shè)定劃槳的邊界。5.2.4Game

游戲窗格game.h#ifndef_GAME_H_#define_GAME_H_#include"ball.h"#include"paddle.h"#include"brick.h"#include<QWidget>把小球,劃槳和磚塊的定義文件都添加進(jìn)來供使用,在這個文件中可以用到上面三個類中的各種各樣的方法。classQTimer;classGame:publicQWidget{Q_OBJECTpublic:Game(QWidget*=0);~Game();voidsetBallSpeed(qreal);voidsetBricksNumbers(int,int);voidsetPaddleStep(qreal);設(shè)置了小球的初始移動速度,磚塊的布局,數(shù)量,還有劃槳的移動時候的快慢。signals:voidfinished();voidscoreChanged(int);publicslots:voidmoveBall();voidchangeColor();voidmovePaddleLeft();voidmovePaddleRight();voidstartGame();voidstopGame();這部分就是一些信號和槽,通過一些自己定義的信號和系統(tǒng)里面自己帶的信號,就可以觸發(fā)對應(yīng)的槽函數(shù),來做對應(yīng)的操作。protected:voidpaintEvent(QPaintEvent*);voidresizeEvent(QResizeEvent*);這是兩個事件處理函數(shù),意思是只要有事件的滿足條件發(fā)生,這個函數(shù)就會產(chǎn)生作用,開始被使用。這是qt中的一個很好的方法。private:voidcreateBricks();voidcreatePaddle();voidcreateBall();QRectFadjustShape(QRectF,qreal,qreal);QColorrandomColor();intrandomInt(int);Ball*ball;Paddle*paddle;QList<Brick*>bricks;QTimer*timer;introws;intcolumns;intscore;boolisWin;boolisFailure;doubleframeWidth;doubleframeHeight;};#endif這一部分就是對小球,劃槳和磚塊的具體的聲明,還有定時器,還有一些在實現(xiàn)文件中要用到的一些變量,比如分?jǐn)?shù)等。當(dāng)然還有游戲的邊框設(shè)置等等。game.cpp#include"game.h"#include<QPainter>#include<QTimer>#include<QDebug> QDebug可以輸出一些東西。QTime是一個定時器類。#include<cstdlib>#include<ctime>Game::Game(QWidget*parent):QWidget(parent){isWin=false;isFailure=false;frameWidth=800;frameHeight=500;score=0;rows=5;columns=10;createBricks();createPaddle();createBall();timer=newQTimer(this);timer->setInterval(10);connect(timer,SIGNAL(timeout()),this,SLOT(moveBall()));changeColor();}

bool類型變量isWin和isFailure用來記錄程序程序結(jié)束時的勝利或失敗的情況。frameWidth和frameHeight用來保存每一時刻的窗格的大小,注意,初始化值寬度800和高度500并不代表窗格的實際大小,這里只是提供了一個理想的值,因為小球、劃漿、磚塊的大小的設(shè)定都需要窗格的大小來設(shè)定。

構(gòu)造函數(shù)中調(diào)用createBrick()、createPaddle()、createBall()函數(shù),用來對磚塊、劃漿、和小球進(jìn)行初始化。之后,設(shè)定定時器,每個10毫秒將調(diào)用一次moveBall函數(shù)。最后,調(diào)用changeColor函數(shù)用來改變小球、磚塊、劃漿的顏色,函數(shù)random-Color將返回一個隨機(jī)顏色。voidGame::changeColor(){srand((int)time(NULL));foreach(Brick*brick,bricks)brick->setColor(randomColor());ball->setColor(randomColor());paddle->setColor(randomColor());}QColorGame::randomColor(){returnQColor(randomInt(255),randomInt(255),randomInt(255));}intGame::randomInt(inthigh){doubled=(double)rand()/((double)RAND_MAX+1);intk=(int)(d*(high+1));returnk;}調(diào)用randomInt(255)語句,將得到一個0至255的隨機(jī)顏色,因此,randomColor函數(shù)能夠產(chǎn)生隨機(jī)顏色。voidGame::createBricks(){qrealgap=5.0;qrealbrickWidth=frameWidth/(columns+1)-gap;qrealbrickHeight=frameHeight/4/(rows+1)-gap;for(intr=0;r<rows;++r)for(intc=0;c<columns;++c){Brick*brick=newBrick(brickWidth/2+c*(brickWidth+gap),brickHeight/2+r*(brickHeight+gap),brickWidth,brickHeight);bricks.append(brick);}}voidGame::createPaddle(){qrealpaddleWidth=frameWidth/10;qrealpaddleHeight=paddleWidth/5;paddle=newPaddle(frameWidth/2-paddleWidth/2,frameHeight-paddleHeight*2,paddleWidth,paddleHeight);}voidGame::createBall(){qrealballSide=paddle->getShape().height();ball=newBall(frameWidth/2-ballSide/2,paddle->getShape().top()-ballSide,ballSide);}createBricks中的變量gap表示磚塊之間的距離,只有這個變量是不隨著窗口的縮放而改變的??梢宰⒁獾?磚塊、劃漿、小球的大小都是根據(jù)預(yù)設(shè)的窗格的大小來確定的。其中,用QList<Brick*>類型的變量bricks來保存Brick對象,總共有5行10列即50個Brick對象。在createBall函數(shù)中,將小球的直徑設(shè)定成劃漿的高度。voidGame::createBall(){qrealballSide=paddle->getShape().height();ball=newBall(frameWidth/2-ballSide/2,paddle->getShape().top()-ballSide,ballSide);}voidGame::resizeEvent(QResizeEvent*){qrealscaleWidth=rect().width()/frameWidth;qrealscaleHeight=rect().height()/frameHeight;foreach(Brick*brick,bricks){QRectFshape=brick->getShape();brick->setShape(adjustShape(shape,scaleWidth,scaleHeight));}QRectFballShape=ball->getShape();ball->setShape(adjustShape(ballShape,scaleWidth,scaleHeight));ball->setSpeed(ball->getSpeed()*scaleWidth);QRectFpaddleShape=paddle->getShape();paddle->setShape(adjustShape(paddleShape,scaleWidth,scaleHeight));paddle->setStep(paddle->getStep()*scaleWidth);frameWidth=rect().width();frameHeight=rect().height();}QRectFGame::adjustShape(QRectFshape,qrealscaleWidth,qrealscaleHeight){QRectFnewShape(shape.left()*scaleWidth,shape.top()*scaleHeight,shape.width()*scaleWidth,shape.height()*scaleHeight);returnnewShape;}

當(dāng)窗格大小發(fā)生變化時,程序?qū){(diào)用resizeEvent函數(shù),這時rect().width()和rect().height()將會分別返回當(dāng)前窗格的寬度和高度,因此,scaleWidth變量表示寬度的縮放因子,而scaleHeight表示高度的縮放因子,adjustShape函數(shù)能根據(jù)這些縮放因子對其接受的參數(shù)shape進(jìn)行相應(yīng)的縮放,并返回一個經(jīng)縮放之后的新矩形。

當(dāng)窗口發(fā)生變化時,也應(yīng)相應(yīng)地增大或縮小小球的移動速度和劃漿的水平移動距離,由于劃漿的移動步長窗格水平寬度相關(guān),小球的移動速度又與劃漿的移動步長相關(guān),因此,這里使用scaleWidth作為縮放因子。

最后,需要將當(dāng)前窗格的高度和寬度進(jìn)行保存。Game::~Game(){deleteball;deletepaddle;while(!bricks.isEmpty())deletebricks.takeFirst();}析構(gòu)函數(shù)用來刪除變量,QList的takeFirst函數(shù)能將第一個對象指針從進(jìn)行QList中移除并返回這個指針,因此,可以通過delete一個Brick指針來刪除一個Brick對象。voidGame::paintEvent(QPaintEvent*){QPainterpainter(this);if(isWin||isFailure){QFontfont("Courier",20,QFont::DemiBold);QFontMetricsfm(font);painter.setFont(font);painter.translate(QPoint(width()/2,height()/2));if(isWin){inttextWidth=fm.width("Youarewinner!");painter.setPen(Qt::blue);painter.drawText(-textWidth/2,0,tr("Youarethewinner!"));}else{inttextWidth=fm.width("Youareloser!");painter.setPen(Qt::red);painter.drawText(-textWidth/2,0,tr("Youaretheloser!"));}timer->stop();emitfinished();return;}painter.setPen(Qt::NoPen);painter.setBrush(ball->getColor());painter.drawEllipse(ball->getShape());painter.fillRect(paddle->getShape(),paddle->getColor());foreach(Brick*brick,bricks)painter.fillRect(brick->getShape(),brick->getColor());}paintEvent函數(shù)由程序自動調(diào)用,用來對窗格進(jìn)行繪制。每次繪制之前,都需要對isWin和isFailure變量進(jìn)行確認(rèn),當(dāng)二者之一為true時,說明程序運行結(jié)束,這時,將在窗格中繪制相應(yīng)的文本,再將定時器暫停,發(fā)送一個finished信號,并調(diào)用return語句進(jìn)行返回。當(dāng)游戲在進(jìn)行時,則需要對窗格進(jìn)行繪制,這時,調(diào)用painter.setPen(Qt::NoPen);語句能設(shè)置在繪制時使用畫刷而不使用畫筆。voidGame::movePaddleLeft(){if(paddle->getLeft()>rect().left()){paddle->moveLeft();update();}}voidGame::movePaddleRight(){if(paddle->getRight()<rect().right()){paddle->moveRight();update();}}voidGame::startGame(){timer->start();}voidGame::stopGame(){timer->stop();}

以上4個槽函數(shù)為Game提供了外部接口,用來為其它widget提供控制劃漿移動、開始游戲、停止游戲的接口。例如,當(dāng)Game對象作為QMainWindow的中央部件時,通過連接相應(yīng)的信號和槽,就能通過鍵盤按鍵或程序菜單來控制游戲的暫停和開始,或控制劃漿的左右移動。voidGame::moveBall(){ball->move();QRectFballShape=ball->getShape();QRectFpaddleShape=paddle->getShape();qrealballLeft=ballShape.left();qrealballRight=ballShape.right();qrealballBottom=ballShape.bottom();qrealballTop=ballShape.top();qrealballCenterX=(ballShape.left()+ballShape.right())/2;qrealpaddleCenterX=(paddleShape.left()+paddleShape.right())/2;if(ballLeft<rect().left()||ballRight>rect().right())ball->setDirX(-ball->getDirX());if(ballBottom>paddleShape.top()){if(paddleSersects(ballShape))//if(1==1){if(ballCenterX<paddleCenterX)ball->setDirX(ball->getDirX());ball->setDirY(-ball->getDirY());}else{isFailure=true;update();return;}}if(ballTop<rect().top())ball->setDirY(-ball->getDirY());else{for(inti=0;i<bricks.size();++i){Brick*brick=bricks.at(i);QRectFbrickShape=brick->getShape();if(brickSersects(ball->getShape())){ball->setDirY(-ball->getDirY());Brick*temp=bricks.takeAt(i);deletetemp;score+=100;emitscoreChanged(score);}}if(bricks.size()==0)isWin=true;}update();}

moveBall()槽函數(shù)在定時器的作用下,每隔固定時間都會被調(diào)用。ballLeft()和ballRight()局部變量用來保存小球左右兩側(cè)的橫坐標(biāo),當(dāng)小球撞擊到窗格的左右兩邊時,設(shè)置其水平運動方向與原來相反,以此來實現(xiàn)小球反彈。當(dāng)小球的底部到達(dá)劃漿的頂部所在的水平線時,需要判斷小球與劃漿是否有重合部分來判斷其是否發(fā)生撞擊。調(diào)用QRectF的intersectd()函數(shù)來判斷兩個QRect對象是否發(fā)生重合,若有重合部分,則返回true。5.2.5Gamewindow游戲主窗口gamewidow.h#ifndef_GAMEWINDOW_H_#define_GAMEWINDOW_H_#include"game.h"#include<QMainWindow>classQAction;classQKeyEvent;classQLabel;classGameWindow:publicQMainWindow{Q_OBJECTprivate:voidcreateMenu();voidcreateToolBar();voidupdateActions();voidcreateNewGame(int);QAction*newGame;QAction*aboutAction;QAction*startGame;QAction*stopGame;QAction*exitGame;QAction*changeColor;QAction*gameOne;QAction*gameTwo;QAction*gameThree;QLabel*gameLabel;QLabel*scoreLabel;Game*game;boolisRunning;};#endif首先是先聲明一些屬性和方法,因為這是一個游戲的圖形界面,所以,需要必要的一些操作,供用戶來使用。其中,設(shè)置的屬性需要有下拉菜單和工具欄這些,其次就是把上面所寫好game.h類添加進(jìn)來,然后初始化一系列需要的QAction,比如新游戲,開始游戲,暫停游戲,游戲難度,分?jǐn)?shù),等等。createMenu()和createToolBar()函數(shù)用來創(chuàng)建菜單以及工具欄,并將創(chuàng)建的動作與相應(yīng)的槽相連接。當(dāng)游戲結(jié)束時,Game對象將會發(fā)出finished信號,在on_finished()槽中,將相應(yīng)的動作設(shè)置為不可用。在createNewGame()函數(shù)中,將原先game所指向的對象刪除,并創(chuàng)建新的Game對象,需要注意的是,創(chuàng)建了新的Game對象,則表示由原先game所指向?qū)ο蠼⒌男盘柡筒鄣年P(guān)系將失效,因此,需要重新連接相應(yīng)的信號和槽。調(diào)用createNewGame()函數(shù)時,傳入的參數(shù)能用來設(shè)置小球的速度,以此來增加游戲的難度。on_startGame()和on_stopGame()函數(shù)用來設(shè)置游戲的啟動和暫停。on_gameone(),one_gametwo(),on_gamethree(),是用來設(shè)置游戲難度的,通過向createNewGame()函數(shù)傳遞參數(shù)。gamewindow.cpp#include"gamewidow.h"#include<QAction>#include<QMenuBar>#include<QToolBar>#include<QMessageBox>#include<QKeyEvent>#include<QLabel>GameWindow::GameWindow(){isRunning=false;game=newGame(this);setCentralWidget(game);createMenu();//這兒就是按鈕的一些初始化還有布局排版,還有進(jìn)行信號和槽的鏈接等操作了。createToolBar();//同理這兒是工具欄的那些初始化操作和信號槽函數(shù)的鏈接了。connect(game,SIGNAL(finished()),this,SLOT(on_finished()));connect(game,SIGNAL(scoreChanged(int)),this,SLOT(on_changeScore(int)));resize(600,480);//設(shè)置游戲的窗口大小。setWindowTitle(tr("TheGame"));//游戲的標(biāo)題。}voidGameWindow::on_finished(){stopGame->setEnabled(false);startGame->setEnabled(false);changeColor->setEnabled(false);}當(dāng)游戲結(jié)束的時候,游戲中的所有的按鈕都會設(shè)置為不可用,然后等條件信息成立的時候,這些按鈕會通過別的函數(shù)進(jìn)行初始化,而可以重新使用。voidGameWindow::on_changeScore(intscore){scoreLabel->setText(tr("<h3><fontcolor=blue>Score:%1</font></h3>").arg(score));}On_changescore()函數(shù)是用來進(jìn)行積分的,是要打中磚塊,分?jǐn)?shù)就會上漲。voidGameWindow::createNewGame(intgameNum){if(gameNum==1)gameLabel->setText(tr("<h3><fontcolor=blue>GameOne</font></h3>"));elseif(gameNum==2)gameLabel->setText(tr("<h3><fontcolor=blue>GameTwo</font></h3>"));elseif(gameNum==3)gameLabel->setText(tr("<h3><fontcolor=blue>GameThree</font></h3>"));on_changeScore(0);game->deleteLater();game=newGame(this);setCentralWidget(game);game->setBallSpeed(gameNum);game->setPaddleStep(gameNum*10.0);connect(game,SIGNAL(finished()),this,SLOT(on_finished()));connect(game,SIGNAL(scoreChanged(int)),this,SLOT(on_changeScore(int)));isRunning=false;changeColor->setEnabled(true);updateActions();}游戲的初始化,首先是進(jìn)行小球速度的設(shè)置,然后是分?jǐn)?shù)的初始化為0,然后實例化小球,劃槳和方塊,并且進(jìn)行顏色的隨機(jī)染色,然后準(zhǔn)備就緒,點擊開始按鈕游戲就開始運行了。voidGameWindow::on_about(){QMessageBox::about(this,tr("About"),tr("ThisisasmallgamedevelopedbySenLin."

溫馨提示

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

最新文檔

評論

0/150

提交評論