[精品論文]JAVA俄羅斯方塊畢業(yè)論文正文_第1頁(yè)
[精品論文]JAVA俄羅斯方塊畢業(yè)論文正文_第2頁(yè)
[精品論文]JAVA俄羅斯方塊畢業(yè)論文正文_第3頁(yè)
[精品論文]JAVA俄羅斯方塊畢業(yè)論文正文_第4頁(yè)
[精品論文]JAVA俄羅斯方塊畢業(yè)論文正文_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

畢業(yè)設(shè)計(jì)課程定做 QQ1714879127第1章 緒論1.1 游戲的歷史游戲是人類生活的重要組成部分,從第一個(gè)電子游戲開(kāi)發(fā)至今已經(jīng)有30多年,在這個(gè)短暫的時(shí)期里,隨著硬件水平的提高,游戲開(kāi)發(fā)新技術(shù)層出不窮,經(jīng)典游戲比比皆是。1.1.1 從頭談起真正的電子游戲機(jī)產(chǎn)生于20世紀(jì)70年代。1971年,麻省理工學(xué)院的學(xué)生Nolan Bushnell設(shè)計(jì)了世界上的第一個(gè)業(yè)務(wù)用游戲機(jī)(俗名街機(jī)),叫做電腦空間。這臺(tái)游戲機(jī)用一臺(tái)黑白電視機(jī)作為顯示屏,用一個(gè)控制柄作為操縱器,不過(guò)由于市場(chǎng)因素這款游戲以失敗告終。但是最后他在電子游戲的發(fā)展上取得了非凡的成就。上面介紹的是專用機(jī)游戲的歷史,而最早的電腦游戲可以追溯到1972年,一個(gè)叫Crowther的工程師用當(dāng)時(shí)最流行的主機(jī)DEC公司的PDP10編寫(xiě)一段簡(jiǎn)單的FORTRAN程序。在這個(gè)程序里,Crowther設(shè)計(jì)了一張地圖,地圖上不規(guī)則的分布著陷阱,游戲者必須尋找路徑避開(kāi)陷阱。這個(gè)程序被公認(rèn)為是最早的電腦游戲程序。1989年,BroderBund公司的設(shè)計(jì)師喬丹.麥克納根據(jù)阿拉伯民族的古老傳說(shuō)一千零一夜在Apple平臺(tái)上制作了一部動(dòng)作冒險(xiǎn)相結(jié)合的電腦游戲波斯王子。這個(gè)游戲獲得了第一作,它代表了當(dāng)時(shí)電腦技術(shù)的最高水平。1986年,任天堂公司發(fā)售了一款真正的游戲巨作超級(jí)馬里奧。20世紀(jì)80年代IBM PC兼容機(jī)的出現(xiàn)打破了Apple公司的壟斷地位。到了20世紀(jì)90年代,游戲業(yè)才真正成熟起來(lái),成為了一種產(chǎn)業(yè)。由于PC機(jī)價(jià)格非常低而且硬件速度越來(lái)越快,游戲逐漸成為人們生活中不可缺少的一部分。游戲產(chǎn)業(yè)也逐漸發(fā)展成熟。1.1.2 圖形硬件的革命圖形硬件的飛速發(fā)展是近些年來(lái)的事情,部分原因是來(lái)自工業(yè)方面的壓力,例如在軍事和醫(yī)療方面對(duì)于實(shí)時(shí)圖形的需求很強(qiáng)烈,而交互娛樂(lè)產(chǎn)業(yè)也極大的推動(dòng)了圖形硬件的發(fā)展。技術(shù)上的因素同樣也推動(dòng)著圖形硬件的發(fā)展,許多圖形算法可以很容易地表達(dá)為并行方式,這樣硬件執(zhí)行的效率變得很高。摩樂(lè)定律也起了作用,越來(lái)越多的晶體管可以集成到一塊單獨(dú)的芯片上。在所謂的GPU(圖形處理器)概念出現(xiàn)以前,特殊的圖形硬件只出現(xiàn)在諸如SGI和E&S系統(tǒng)里面,這些硬件價(jià)格太昂貴,不過(guò)這些公司提供了第一代基于硬件的頂點(diǎn)變換和紋理映射的解決方案。1.2游戲的意義與內(nèi)涵游戲這個(gè)名稱一直就存在于每個(gè)人的日常生活中,如猜拳游戲、猜謎游戲、大地游戲、球類游戲等,林林總總,不勝枚舉,甚至于有些流行歌曲把人生也比喻為游戲,好比“一場(chǎng)游戲一場(chǎng)夢(mèng)” 。因此,游戲?qū)τ诂F(xiàn)代人的成長(zhǎng)歷程,絕對(duì)是一個(gè)不可或缺的重要角色。1.2.1 游戲的組成要素“游戲”,最簡(jiǎn)單的定義,就是一種供人們娛樂(lè)休閑的快樂(lè)元素。從更專業(yè)的角度形容, “游戲”是具有特定行為模式、規(guī)則條件、身心娛樂(lè)及輸贏的一種行為表現(xiàn)。這種行為表現(xiàn)具備以下4個(gè)要素。行為模式:“游戲”最簡(jiǎn)單的要素就是游戲有特定的流程模式,這種流程模式貫穿于整個(gè)游戲的行為,用戶必須依照它的模式流程來(lái)執(zhí)行。倘若一種游戲沒(méi)有了特定的行為模式,那么就沒(méi)有執(zhí)行的行為;在沒(méi)有執(zhí)行的行為之后,這個(gè)游戲也玩不下去了。舉個(gè)例子來(lái)說(shuō),如果猜拳游戲沒(méi)有了剪刀、石頭、布等行為模式,那么這還能叫做“猜拳游戲” 嗎?所以不管游戲的流程有多么復(fù)雜還是多么簡(jiǎn)單,一定要有特定的行為模式。條件規(guī)則:當(dāng)游戲有了一定的行為模式后,接著就必須制定出一系列的條件規(guī)則。簡(jiǎn)單來(lái)說(shuō),這些游戲的條件規(guī)則就是大家必須去遵守的游戲行為守則,只要是大家一致以為的游戲行為,在游戲中,玩家就必須遵守它,如果不遵守這種游戲行為,那么就失去了公平性。如同一種簡(jiǎn)單的球賽,打球的英文解釋可以用PLAY GAME來(lái)加以說(shuō)明,按照英文字面上的解釋,它就是執(zhí)行游戲的行為,而球賽必須有一定的條件規(guī)則,并且參與者都要必須去遵守它,不能遵守它就叫作“犯規(guī)”。所以不管是什么游戲,它都會(huì)具備一組規(guī)則條件,在游戲進(jìn)行的時(shí)候才會(huì)有足夠的公平性。娛樂(lè)身心:一種游戲所帶來(lái)的娛樂(lè)性,關(guān)鍵就在于為玩家所帶來(lái)的刺激感,這也是游戲的精華所在。簡(jiǎn)單來(lái)說(shuō),不管是很多人玩的游戲,還是一個(gè)人玩的單機(jī)游戲,游戲本身就會(huì)存在它的娛樂(lè)和刺激性,使得玩家們想要去玩它。輸贏:其實(shí)針對(duì)游戲而言,輸贏是所有游戲的最終目的。一個(gè)沒(méi)有輸贏的游戲,也就沒(méi)有了它存在的意義,如同我們常常接觸到的猜拳游戲,說(shuō)穿了最終目的就是為了分出勝負(fù)而己。一般而言,游戲又可以分為動(dòng)態(tài)和靜態(tài)兩種形態(tài)。動(dòng)態(tài)的游戲必須配合肢體動(dòng)作,如猜拳游戲;而靜態(tài)游戲則是較偏向思考的行為,如同紙上游戲。然而不管是動(dòng)態(tài)或是靜態(tài)游戲,只要具備上述4項(xiàng)組成要素,都可以將它稱為“游戲”。1.3 俄羅斯方塊游戲俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,它曾經(jīng)造成的轟動(dòng)與造成的經(jīng)濟(jì)價(jià)值可以說(shuō)是游戲史上的一件大事。這款游戲最初是由蘇聯(lián)的游戲制作人Alex Pajitnov制作的,它看似簡(jiǎn)單但卻變化無(wú)窮,令人上癮。但是經(jīng)過(guò)時(shí)代的變遷,當(dāng)初簡(jiǎn)單卻變化無(wú)窮的俄羅斯方塊游戲如今卻已失去了它的市場(chǎng),究其原因,主要是因?yàn)橛螒蛴布约凹夹g(shù)的革新使得優(yōu)秀的游戲接二連三地推出,而俄羅斯方塊游戲作為一款形式、內(nèi)容過(guò)于簡(jiǎn)單的游戲勢(shì)必經(jīng)受不住時(shí)間的沖擊的?,F(xiàn)在作者將改寫(xiě)這個(gè)固定的游戲模式,通過(guò)增加一系列的新功能,開(kāi)發(fā)出一種全新的俄羅斯方塊游戲,使游戲用戶重新燃起對(duì)俄羅斯方塊游戲的熱愛(ài)。畢業(yè)設(shè)計(jì)課程定做 QQ1714879127沈陽(yáng)工程學(xué)院畢業(yè)論文 第2章 可行性研究第2章 可行性研究2.1 設(shè)計(jì)目的綜合運(yùn)用在校期間所學(xué)理論知識(shí)和技能,設(shè)計(jì)開(kāi)發(fā)俄羅斯方塊,使自己熟悉應(yīng)用系統(tǒng)的開(kāi)發(fā)過(guò)程,培養(yǎng)獨(dú)立思考能力,檢驗(yàn)學(xué)習(xí)效果和動(dòng)手能力,提高工程實(shí)踐能力,為將來(lái)實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。2.2 可行性研究前提基本需求:系統(tǒng)開(kāi)發(fā)的總體任務(wù)是實(shí)現(xiàn)游戲的可操作性、美觀性、及時(shí)性,及適當(dāng)?shù)墓δ軘U(kuò)展。主要開(kāi)發(fā)目標(biāo):采用結(jié)構(gòu)化設(shè)計(jì)方法,開(kāi)發(fā)出一個(gè)可操作性、美觀性、及時(shí)性的游戲,并通過(guò)此次軟件開(kāi)發(fā)過(guò)程全面提高自身的綜合素質(zhì)??尚行匝芯克捎玫姆椒ê筒襟E:通過(guò)研究分析俄羅斯方塊所具備的能力及實(shí)現(xiàn)的方法、確定主體結(jié)構(gòu)。利用現(xiàn)階段我所能達(dá)到的能力,以最簡(jiǎn)潔、最容易的辦法,邊開(kāi)發(fā)邊測(cè)試邊修改,實(shí)現(xiàn)一個(gè)有一定可玩性的游戲軟件。評(píng)價(jià)尺度:本游戲盡量追求游戲操作的合理性及正確性,但是仍不排除會(huì)出現(xiàn)一些偶然性的錯(cuò)誤;同時(shí)游戲也盡量追求界面的美觀性及功能的豐富性,但是基于時(shí)間的關(guān)系,可能會(huì)有極少數(shù)的拓展功能不能實(shí)現(xiàn)。2.3 可行性分析管理可行性: 本游戲設(shè)計(jì)的目的只在于提高自身實(shí)踐水平,并不對(duì)外發(fā)布,因此完全具有管理可行性。經(jīng)濟(jì)可行性:由于本游戲的主要背景是畢業(yè)課程設(shè)計(jì),不注重直接的經(jīng)濟(jì)效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對(duì)自身的經(jīng)濟(jì)要求也不高,只要有一臺(tái)電腦便可,所以不用考慮到經(jīng)濟(jì)問(wèn)題。技術(shù)可行性:可用與本游戲的編程語(yǔ)言有VB,VC,Java,Delphi等,考慮到用于編寫(xiě)程序的困難度,和對(duì)語(yǔ)言的了解程度,選擇JAVA作為編程語(yǔ)言。需要對(duì)圖形界面設(shè)計(jì)、事件處理、多媒體、網(wǎng)絡(luò)編程等有一定了解。社會(huì)可行性:本游戲的開(kāi)發(fā)作為畢業(yè)課程設(shè)計(jì)以鞏固先前所學(xué)的知識(shí),以個(gè)人為單位,僅供個(gè)人平常娛樂(lè)所用,無(wú)須考慮有可能造成的社會(huì)影響,不用考慮到法律、版權(quán)等的社會(huì)因素,所以在這方面是完全可行的。2.4 結(jié)論綜上所述,本游戲軟件的技術(shù)成熟、完備。各方面均無(wú)重大問(wèn)題,因此本游戲軟件可開(kāi)始著手編寫(xiě)沈陽(yáng)工程學(xué)院畢業(yè)論文 第3章 需求分析第3章 需求分析3.1 引言對(duì)軟件需求完全理解對(duì)于軟件開(kāi)發(fā)工作的成功是至關(guān)重要的,需求說(shuō)明的任務(wù)是發(fā)現(xiàn)、規(guī)范的過(guò)程,有益于提高軟件開(kāi)發(fā)過(guò)程中的能見(jiàn)度,便于對(duì)軟件開(kāi)發(fā)過(guò)程中的控制與管理,便于采用工程方法開(kāi)發(fā)軟件,提高軟件的質(zhì)量,便于開(kāi)發(fā)人員、維護(hù)人員、管理人員之間的交流、協(xié)作,并作為工作成果的原始依據(jù),并且在向潛在用戶傳遞軟件功能、性能需求,使其能夠判斷該軟件是否與自己的需求相關(guān)。3.2 游戲功能需求3.2.1 游戲界面需求良好的用戶界面設(shè)計(jì)。本游戲主要有三個(gè)界面,一是用于主游戲區(qū)的游戲畫(huà)布,用來(lái)顯示游戲時(shí)運(yùn)動(dòng)和落下去的方塊,二是用于控制游戲的各種控件以及顯現(xiàn)游戲信息的一些組件,這是一個(gè)面板,三是進(jìn)行網(wǎng)絡(luò)對(duì)戰(zhàn)時(shí)用以顯示對(duì)方游戲信息的面板。3.2.2 游戲控制需求方塊下落時(shí),可通過(guò)鍵盤(pán)方向鍵(上、下、左、右鍵)對(duì)該方塊進(jìn)行向上(變形),向下(加速)、向左、向右移動(dòng)。3.2.3 圖形顯示需求隨機(jī)給出不同的形狀(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,記分,當(dāng)達(dá)到一定的分?jǐn)?shù)時(shí),過(guò)關(guān),一共設(shè)置十關(guān),每關(guān)方塊下落的速度不同,游戲中先結(jié)束的一方為本局輸家,十關(guān)過(guò)后,勝出局?jǐn)?shù)多的為贏家。3.2.4 音樂(lè)播放需求本游戲,應(yīng)該具備播放背景音樂(lè)和發(fā)生相應(yīng)操作時(shí)的音效的功能,比如,方塊落下、滿行消除時(shí)的音效。3.2.5 道具使用需求本游戲,可以具備幾種道具的使用功能,比如,這些道具可以是某些特殊的方塊,比如,可以定義一種旋轉(zhuǎn)的方塊,也可以定義一種炸彈,能夠炸毀一定數(shù)量的方塊,以增強(qiáng)游戲的趣味性。3.2.6 網(wǎng)絡(luò)對(duì)戰(zhàn)需求本游戲,具備網(wǎng)絡(luò)對(duì)戰(zhàn)功能,所以要求玩家能夠看到對(duì)方的游戲信息。3.3 運(yùn)行環(huán)境及系統(tǒng)性能的需求 本游戲?qū)\(yùn)行環(huán)境及系統(tǒng)性能的需求如表3.1所示:表3.1 游戲?qū)\(yùn)行環(huán)境及系統(tǒng)性能需求分析表操作系統(tǒng)Windows98/me/2000/XP/2003內(nèi)存容量64MB顯卡要求8M聲卡要求支持DirectX 8.0 聲卡交互工具鍵盤(pán)/鼠標(biāo)CPU奔騰133以上光驅(qū)8倍速以上硬盤(pán)空間400MB顯示器VGA以上顯示器開(kāi)發(fā)及運(yùn)行軟件JDK1.5以上版本3.4 接口需求本軟件需求通過(guò)鍵盤(pán)進(jìn)行操作,在Windows的操作系統(tǒng)下,利用鍵盤(pán)的上、下、左、右鍵對(duì)方塊進(jìn)行移動(dòng)變形,要使用鍵盤(pán)的接口事件。3.5 方案論證可用于較好地實(shí)現(xiàn)俄羅斯方塊的語(yǔ)言有C+、VB、JAVA,所以客觀上說(shuō)來(lái),可用Jave,VB和C+這三種語(yǔ)言編寫(xiě)俄羅斯方塊程序。下面結(jié)合自身實(shí)際情況分別論述三種語(yǔ)言的優(yōu)缺點(diǎn)并從中選擇一種適合的編寫(xiě)語(yǔ)言。3.6.1 VB的特點(diǎn)VB是完全中文化的環(huán)境使用,語(yǔ)句生成器和快速提示幫助使用戶不必記憶成千上萬(wàn)的屬性和方法,在較短的時(shí)間內(nèi)就能開(kāi)發(fā)出功能強(qiáng)大的應(yīng)用程序。Internet應(yīng)用程序的開(kāi)發(fā)功能更加強(qiáng)大和容易,支持動(dòng)態(tài)HTML技術(shù)的應(yīng)用程序。種類繁多,功能強(qiáng)大的多媒體控件,能幫助用戶在較短的時(shí)間內(nèi)用較少的語(yǔ)句編寫(xiě)出圖文聲像并茂的多媒體程序。能對(duì)多種數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作。它所提供的可視化數(shù)據(jù)管理器能幫助用戶構(gòu)造多種類型的數(shù)據(jù)庫(kù)。用戶自定義類型可以作為參數(shù)或作為公共屬性和方法的返回值,函數(shù)可以返回?cái)?shù)組變量,動(dòng)態(tài)數(shù)組可以賦值,文件系統(tǒng)對(duì)象,按名調(diào)用,增強(qiáng)創(chuàng)建對(duì)象函數(shù)和StrConv函數(shù)。應(yīng)用程序安裝向?qū)軒椭脩糇詣?dòng)生成具有一定功能的應(yīng)用程序,加快了程序的開(kāi)發(fā)速度。3.6.2 C+的特點(diǎn)C+是對(duì)C語(yǔ)言的擴(kuò)充,擴(kuò)充的絕大部分來(lái)自著名語(yǔ)言中的最佳特性:從SIMULA 67中吸取了類,從ALGOL 68中吸取了運(yùn)算符一名多用、引用和在分程序中任何地方說(shuō)明變量,綜合了Ada的類屬和Clu的模塊特點(diǎn),從BCPL中吸取異常處理,從BCPL中吸取了用/表示注釋。C+保持了C的緊湊、靈活、高效和易移植強(qiáng)的優(yōu)點(diǎn),它對(duì)數(shù)據(jù)抽象的支持主要在于類概念和機(jī)制,對(duì)面向?qū)ο箫L(fēng)范的支持主要通過(guò)虛擬函數(shù)。C+既有數(shù)據(jù)抽象和面向?qū)ο竽芰?,語(yǔ)言運(yùn)行性能高多,加上C語(yǔ)言的普及,而從C至C+的過(guò)渡較為平滑,以及C+與C的兼容程度可使數(shù)據(jù)巨大的C程序能方便地在C+環(huán)境中重用。盡管C+當(dāng)初的設(shè)計(jì)本意是幫助管理大型程序,但其用途并不僅限于此。C+的面向?qū)ο蟮奶匦钥捎行У赜糜趯?shí)際的程序設(shè)計(jì)工作。C+常常用于設(shè)計(jì)編輯器、數(shù)據(jù)庫(kù)、個(gè)人文件系統(tǒng)以及通訊程序等。而且,由于C+共享C的效率,所以用C+可以構(gòu)成很多高性能的系統(tǒng)軟件。3.6.3 Java的特點(diǎn)Java是定義位于網(wǎng)絡(luò)計(jì)算的計(jì)算機(jī)語(yǔ)言,它幾乎所有的特點(diǎn)也是圍繞著這一中心展開(kāi)的并為之服務(wù)的,這些特點(diǎn)使得Java語(yǔ)言特別適全于用來(lái)開(kāi)發(fā)網(wǎng)絡(luò)上的應(yīng)用程序;另外,作為一種面世較晚的語(yǔ)言,Java也集中體現(xiàn)和充分利用了若于當(dāng)代軟件技術(shù)新成果,如面向?qū)ο?、多線程等,這些也都在它的特點(diǎn)中有所反映。平臺(tái)無(wú)關(guān)性:如前所述,Java語(yǔ)言獨(dú)特的運(yùn)行機(jī)制使得它具有良好的可移植性,利用Java,開(kāi)發(fā)人員可以編寫(xiě)出與具體平臺(tái)無(wú)關(guān)、普遍適用的應(yīng)用程序,大大降低了開(kāi)發(fā)、維護(hù)和管理的開(kāi)銷。面向?qū)ο螅篔ava是純面向?qū)ο蟮木幊陶Z(yǔ)言。面向?qū)ο蠹夹g(shù)較好地適應(yīng)了當(dāng)今軟件開(kāi)發(fā)過(guò)程中新出現(xiàn)的種種傳統(tǒng)面向過(guò)程語(yǔ)言所不能處理的問(wèn)題,包括軟件開(kāi)發(fā)的規(guī)模擴(kuò)大、升級(jí)加快、維護(hù)量增大經(jīng)及開(kāi)發(fā)分工日趨細(xì)化、專業(yè)化和標(biāo)準(zhǔn)化等,是一種迅速成熟、推廣的軟件開(kāi)發(fā)方法。面向?qū)ο蠹夹g(shù)的核心是以更接近人類思維的方式建立計(jì)算機(jī)邏輯模型,它利用類和對(duì)象的機(jī)制將數(shù)據(jù)與其上的操作封裝在一起,并通過(guò)統(tǒng)一的接口與外界交互,使反映現(xiàn)實(shí)世界實(shí)體的各個(gè)類在程序中能夠獨(dú)立、自治、繼承;這種方法非常有利于提高程序的可維護(hù)性和可重用性,大大提高了開(kāi)發(fā)效率和程序的可管理性,使得面向過(guò)程語(yǔ)言難于操縱的大規(guī)模軟件可以很方便的創(chuàng)建、使用和維護(hù)。多線程機(jī)制:多線程是當(dāng)今軟件技術(shù)的又一重要成果,已成功應(yīng)用在操作系統(tǒng)、應(yīng)用開(kāi)發(fā)等多個(gè)領(lǐng)域。多程序技術(shù)允許同一個(gè)程序有兩個(gè)執(zhí)行線索,即同時(shí)做兩件事情,滿足了一些復(fù)雜軟件的需求。Java不但內(nèi)置多線程功能,而且提供語(yǔ)言級(jí)的多線程支持,即定義了一些用于建立、管理多線程的類和方法,使得開(kāi)發(fā)具有多線程功能的程序變得簡(jiǎn)單、容易和有效。簡(jiǎn)單易學(xué):如前所述,衍生自C+的Java語(yǔ)言,出于安全穩(wěn)定性的考慮,去除了C+中不容不得易理解和掌握的部分,如最典型的指針操作等,降低了學(xué)習(xí)的難度;同時(shí)Java還有一個(gè)特點(diǎn)就是它的基本語(yǔ)法部分與C語(yǔ)言幾乎一模一樣。這樣,無(wú)論是學(xué)過(guò)Java再學(xué)C,還是已經(jīng)掌握了C語(yǔ)言再業(yè)學(xué)Java,都會(huì)感到易于入門(mén)。3.6.方案選擇面向?qū)ο笫且环N認(rèn)識(shí)世界的方法,是一種程序設(shè)計(jì)方法。面向?qū)ο蟮挠^點(diǎn)認(rèn)為,客觀世界是由各種各樣的實(shí)體,即對(duì)象組成的。每種對(duì)象都有自己的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,不同對(duì)象間的相互聯(lián)系和相互作用就構(gòu)成了各種不同的系統(tǒng),并進(jìn)而構(gòu)成整個(gè)客觀世界。按照這樣的思想設(shè)計(jì)程序,就是面向?qū)ο蟮某绦蛟O(shè)計(jì)。面向?qū)ο蟮某绦蛟O(shè)計(jì)吸取了結(jié)構(gòu)化程序設(shè)計(jì)的先進(jìn)思想,并把它們同幾個(gè)支持用戶用新方法進(jìn)行程序設(shè)計(jì)的有力概念結(jié)合在一起。所有面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言一般都包含三個(gè)概念:封裝、多態(tài)性和繼承性。這種方法要求語(yǔ)言必須具備抽象、封裝、繼承和多態(tài)性這幾個(gè)關(guān)鍵要素。面向?qū)ο蟮某绦蛟O(shè)計(jì),是通過(guò)數(shù)據(jù)和代碼建立分塊的內(nèi)存區(qū)域,以便提供對(duì)程序進(jìn)行模塊化的一種程序設(shè)計(jì)方法,這些模塊可以被用作樣板,在需要時(shí)再建立其副本。C+和Java在面向?qū)ο筮@方面比VB要強(qiáng),所以我排除了用VB做的可能性。但是C+主觀上在校期間學(xué)校并沒(méi)有這方面的授課內(nèi)容,雖然自學(xué)了一些內(nèi)容,對(duì)C+也有一定了解,但是若用C+實(shí)現(xiàn),必定是基于windows應(yīng)用程序的Visual C+設(shè)計(jì),對(duì)于windows編程,我還有待提高,而我對(duì)JAVA的掌握,相對(duì)而言,比較熟悉,綜合考慮,決定采用Java語(yǔ)言編寫(xiě)俄羅斯方塊。沈陽(yáng)工程學(xué)院畢業(yè)論文 第4章 概要設(shè)計(jì)第4章 概要設(shè)計(jì)4.1 游戲設(shè)計(jì)所要遵循的規(guī)范一個(gè)良好的程序,在編寫(xiě)之前,必須要制定各種編寫(xiě)規(guī)范,以便組內(nèi)各成員協(xié)調(diào)工作。當(dāng)然,本游戲只是一個(gè)小程序,過(guò)多的規(guī)范制定顯得沒(méi)有必要,但是,也必須制定一個(gè)對(duì)于變量的命名規(guī)則,這有利于設(shè)計(jì)出一個(gè)可讀性高的程序。本程序變量的命名規(guī)則為:所有變量一律使用相應(yīng)的英文單詞命名如果同一類中需要?jiǎng)?chuàng)建多個(gè)同一類型,功能相似的變量,變量的前綴應(yīng)使用統(tǒng)一的英文單詞,后綴為下劃線“_”加數(shù)字。比如,從JButton對(duì)象創(chuàng)建開(kāi)始按鈕,可以命名為:startbutton。再如,創(chuàng)建多個(gè)道具按鈕,可以命名為toolbutton_1,toolbutton_2等等。方法命名盡量使用能夠描述本方法功能的英文單詞比如,游戲初始化可以用gameinitial。類名字命名也應(yīng)當(dāng)使用能夠描述本類功能的英文單詞。如方塊類,可以用class block。4.2 游戲總體設(shè)計(jì)分析Java為純面向?qū)ο螅∣bject-Oriented,OO)的程序語(yǔ)言,它的諸多優(yōu)點(diǎn)在此就不作論述了。從面向?qū)ο蟮挠^念出發(fā),本程序主要可分為以下幾個(gè)模塊:l 客戶端GUI模塊l 方塊及地圖數(shù)據(jù)模塊l 音頻文件播放模塊l 道具使用模塊l 網(wǎng)絡(luò)傳輸模塊分析對(duì)象的技巧在于它的功能的擴(kuò)展性及維護(hù)效率。試想,如果因?yàn)橥獠凯h(huán)境或者用戶需求的變化需要對(duì)程序進(jìn)行功能擴(kuò)展或者維護(hù),就要對(duì)代碼作大幅度的更動(dòng)甚至重寫(xiě),這樣就失去了面向?qū)ο蟮膬?yōu)勢(shì),所以在本程序分析時(shí)將獨(dú)立性高的模塊作為一個(gè)對(duì)象,以提高程序的可擴(kuò)展性和可維護(hù)性。4.3 各模塊的算法設(shè)計(jì)4.3.1客戶端接口的設(shè)計(jì) “客戶端控制器”是指游戲界面上顯示游戲相關(guān)信息及排布游戲控件的面板。游戲客戶端控制器上集合了游戲的各種事件處理,包括游戲定時(shí)控制,鍵盤(pán)控制,道具控制,音樂(lè)播放,選擇網(wǎng)絡(luò)對(duì)戰(zhàn)等各種控制命令。本模塊是程序的主模塊,其它四個(gè)模塊都由本模塊進(jìn)行控制。1 客戶端接口的結(jié)構(gòu),如圖4.1所示: 關(guān)客戶端控制器程 序 運(yùn) 行網(wǎng) 絡(luò)對(duì) 戰(zhàn)背景音 樂(lè)游戲暫 停道具使 用游戲開(kāi)始圖4.1 客戶端結(jié)構(gòu)圖2 客戶端接口的實(shí)現(xiàn)一個(gè)程序,在追求程序性能的同時(shí),應(yīng)該同時(shí)注重GUI的美觀度,基于此,本游戲應(yīng)該采用JAVA中swing組件包,swing組件是一組完全由JAVA語(yǔ)言編寫(xiě)的輕量級(jí)組件,沒(méi)有本地代碼,不依賴本機(jī)操作系統(tǒng)的支持,所以swing比AWI具有更強(qiáng)的實(shí)用性,比起AWI組件,swing組件在美觀度和控制性能方面具有如下幾方面的優(yōu)點(diǎn):可插入的外觀感覺(jué)在AWI組件中,猶豫控制組件外形惡對(duì)等類與具體平臺(tái)相關(guān),使得AWI組件總是只有與本機(jī)相關(guān)的單一的L&F。swing對(duì)PL&F的支持改變了單一圖形界面的觀感,即實(shí)現(xiàn)了在任意平臺(tái)上運(yùn)行同一個(gè)swing程序能有不同惡L&F。變成人員可以在GUI程序設(shè)計(jì)中加入相應(yīng)的開(kāi)關(guān),使得程序運(yùn)行時(shí)可以根據(jù)喜好選擇不同的L&F,呈現(xiàn)不同個(gè)性化界面。設(shè)置邊框可以使用相應(yīng)的方法為swing組件設(shè)置一個(gè)或多個(gè)邊框。Swing中提供了各種各樣的邊框供用戶選用,也能夠給通過(guò)變成人員的組合來(lái)設(shè)計(jì)個(gè)性邊框。充分利用邊框設(shè)計(jì),可以協(xié)助布局管理器對(duì)組件進(jìn)行合理的布局。使用圖標(biāo)此特性使得swing組件較之AWI組件具有更強(qiáng)的外觀感受。與AWT組件不同,許多swing組件如按鈕、標(biāo)簽,不僅可以使用文字,還可以使用圖標(biāo)來(lái)加強(qiáng)外觀效果。支持鍵盤(pán)操作在swing組件中,使用Jcomponent類的registerKeyboardAction方法,能使用戶通過(guò)鍵盤(pán)操作來(lái)替代鼠標(biāo)驅(qū)動(dòng)GUI上swing組件的相應(yīng)動(dòng)作??纱嫒⌒灾С炙衧wing組件都實(shí)現(xiàn)了可存取性接口,提供對(duì)可存取性的支持,使得輔助功能如屏幕閱讀器、語(yǔ)音識(shí)別系統(tǒng),能十分方便地從swing組件中得到信息。MVC體系結(jié)構(gòu)Swing組件設(shè)置三個(gè)通訊對(duì)象:模型、視圖和控件,并將模型與視圖奮力開(kāi)來(lái),這樣可以方便用戶直接通過(guò)模型管理數(shù)據(jù),實(shí)現(xiàn)基于一種模型的多種視圖處理。基于swing組件的優(yōu)點(diǎn),結(jié)合本程序的設(shè)計(jì)目標(biāo),程序的界面將使用swing組件實(shí)現(xiàn)。4.3.2方塊及地圖數(shù)據(jù)模塊的設(shè)計(jì)這是俄羅斯方塊游戲最基本的功能模塊,本游戲的設(shè)計(jì)思想是只要有客戶端控制器及方塊地圖數(shù)據(jù)模塊,就能實(shí)現(xiàn)游戲的基本功能。本模塊其實(shí)可以分開(kāi)為方塊和地圖兩個(gè)模塊,但考慮到二者聯(lián)系緊密,需要共享數(shù)據(jù)結(jié)構(gòu),屬于公共耦合,耦合性過(guò)高,將二者分開(kāi)也有悖于作者設(shè)計(jì)的游戲算法,增加了程序的編寫(xiě)難度,故把它們并作了一個(gè)對(duì)象。1方塊數(shù)據(jù)方塊數(shù)據(jù)存儲(chǔ)了七種不同形態(tài)的方塊,以及每個(gè)方塊的四種形態(tài),可用一個(gè)7x4x4x4的四維數(shù)組表示,例如,定義一個(gè)四維數(shù)組block7444,數(shù)組block的第一維表示七種不同形態(tài)的方塊,第二維代表方塊的四種不同翻轉(zhuǎn)狀態(tài)。數(shù)組的第三維和第四維代表某一種形態(tài)的方塊的某一狀態(tài)。假定,block00ij的值如以下:1,1,0,0 0,1,0,0 0,1,0,0 0,0,0,0則,block00ij代表“7”字型的方塊。當(dāng)方塊翻轉(zhuǎn)時(shí),只需改變第二維的下標(biāo)即可,即,block00ij變?yōu)閎lock01ij。而如果更改方塊形態(tài),就改變數(shù)組第一維坐標(biāo)。 2地圖數(shù)據(jù)本游戲的游戲地圖為25x15格,故應(yīng)當(dāng)用一個(gè)25行15列的二維數(shù)組存儲(chǔ)游戲地圖數(shù)據(jù),但是考慮到本游戲嵌入了方塊越界自動(dòng)糾正功能,而方塊越界,實(shí)際上就是游戲地圖數(shù)組越界。假定,方塊數(shù)據(jù)有以下數(shù)據(jù)模式,代表長(zhǎng)條形的一種方塊:0,0,0,10,0,0,10,0,0,10,0,0,1當(dāng)以上數(shù)據(jù)模式所代表的方塊處在游戲的左邊界區(qū),并且發(fā)生翻轉(zhuǎn)時(shí),方塊可能翻出游戲地圖外,在這種情況下,就發(fā)生了游戲地圖數(shù)組越界,JAVA異常處理系統(tǒng)會(huì)拋出ArrayIndexOutOfBoundsException,為避免這種情況的發(fā)生,游戲地圖數(shù)組應(yīng)當(dāng)適當(dāng)增大,故本游戲?qū)⒌貓D數(shù)組長(zhǎng)度和寬度各擴(kuò)大了三個(gè)單位,定義成為28x18模式的數(shù)組。3建立游戲的坐標(biāo)系統(tǒng)俄羅斯方塊,最終是要將方塊繪到游戲地圖中,如何確定方塊在地圖上的位置,就需要一個(gè)方塊數(shù)組與游戲地圖數(shù)組的映射關(guān)系。建立一個(gè)合理的坐標(biāo)系統(tǒng),對(duì)于游戲的設(shè)計(jì)有莫大的方便。結(jié)合JAVA的坐標(biāo)系統(tǒng),綜合游戲設(shè)計(jì)上的考慮,本程序最終確定了將游戲地圖的左上角坐標(biāo)表示為(0,0),同樣,方塊在游戲地圖中表示為記錄方塊左上角在游戲地圖中的坐標(biāo)。4對(duì)方塊數(shù)據(jù)和游戲數(shù)據(jù)的操作確定了方塊數(shù)據(jù)與地圖數(shù)據(jù)的映射關(guān)系,對(duì)方塊和游戲數(shù)據(jù)的操作就變得簡(jiǎn)便了。對(duì)方塊的操作包括方塊的左移、右移、下移等,當(dāng)方塊左移時(shí),只需將方塊數(shù)組左上角的坐標(biāo)往左方向移動(dòng)一個(gè)單位即可,同理,方塊右移、下移時(shí),只需將坐標(biāo)往右、往下移動(dòng)一個(gè)單位。如果以X代表方塊左上角的橫坐標(biāo),以Y代表縱坐標(biāo),方塊左移,執(zhí)行的操作是X-,方塊右移,執(zhí)行的操作是X+,方塊下落,執(zhí)行的操作是Y+。5游戲繪圖俄羅斯方塊具有七種不同形態(tài)的方塊,而方塊又分別有正在下落和已經(jīng)落下固定兩種不同狀態(tài),如何在游戲地圖中實(shí)現(xiàn)靜態(tài)和動(dòng)態(tài)地繪制出七種不同形態(tài)的方塊,具有一定的挑戰(zhàn)性。經(jīng)過(guò)反復(fù)思考論證,本游戲決定采用不同的繪制模式來(lái)分別實(shí)現(xiàn)繪制動(dòng)態(tài)和靜態(tài)方塊。遍歷方塊數(shù)組繪制動(dòng)態(tài)方塊假定調(diào)用Graphics類中的fill3DRect(int x,int y,int width,int height,Boolean raised)方法繪制方塊,再假定方塊數(shù)組左上角在地圖中的坐標(biāo)為x和y,則繪制動(dòng)態(tài)方塊可采用如下方式實(shí)現(xiàn)。for(int i=0;i=3;i+) for(int j=0;j=3;j+) if(Blockblocktypeturnstateij=1)g.fill3DRect(y+j)*width,(x+i)*width,width,width,raised);這種繪制方式的原理是每一次繪制一個(gè)單位長(zhǎng)度的正方形格子,在將這些格子組合成某一種的形態(tài)方塊。這里面,某一種形態(tài)的方塊是由方塊數(shù)組中的參數(shù)i和j決定的,具體是哪種形態(tài)的方塊,方塊的哪一種翻轉(zhuǎn)狀態(tài),是由參數(shù)blocktype和turnstate決定的。而參數(shù)y+j表示的當(dāng)前格子的左上角在游戲地圖中的橫坐標(biāo),x+i表示的是小格子的縱坐標(biāo)。遍歷游戲地圖數(shù)組實(shí)現(xiàn)墜下方塊的消行繪制當(dāng)墜下的方塊有滿行需要重新繪制時(shí),需要進(jìn)行消行繪制。首先,可用一個(gè)數(shù)值代表游戲地圖數(shù)組的某一個(gè)區(qū)域是否有方塊填充,假定這個(gè)數(shù)值是2,即如果地圖數(shù)組中某一個(gè)元素的值為2,則表示這個(gè)元素所代表的地圖區(qū)域存在方塊。進(jìn)行消行繪制時(shí)需要判斷地圖數(shù)組的某一行是否全為2,如果全為2,則可以認(rèn)為這行被方塊填滿,需要進(jìn)行消行,然后再繼續(xù)往下判斷下一行,直到所有滿行被消除為止。開(kāi)始結(jié)束否地圖數(shù)組某一行是否全為2是消去這一行圖4.2 消行流程圖4.3.3音樂(lè)播放模塊的設(shè)計(jì)音頻文件的播放涉及到IO操作,不管是何種系統(tǒng),對(duì)于IO操作,都是比較慢的,如果當(dāng)程序運(yùn)行到需要播放音效時(shí),再?gòu)奈募腥〉靡纛l數(shù)據(jù),然后播放,很可能會(huì)造成一種“卡”的感覺(jué),影響用戶體驗(yàn)?;诖耍?jīng)過(guò)反復(fù)論證,本游戲決定采用以剪輯的方式來(lái)播放音頻文件。JAVA語(yǔ)言中的剪輯Clip,是一種在播放之前就提前加載于內(nèi)存中的特殊的音頻數(shù)據(jù)流,當(dāng)需要用時(shí),只需直接從內(nèi)存中調(diào)出即可,省去了IO讀取所需的大量時(shí)間,而且剪輯播放完畢后,仍舊存儲(chǔ)在內(nèi)存中,對(duì)于游戲的背景音樂(lè)及音效這類需要反復(fù)多次播放的音頻,這種方式是非常有用的。單單采用剪輯還是不夠的,音頻文件的播放,應(yīng)當(dāng)另外開(kāi)啟線程來(lái)控制,這樣既可以更方便地控制音頻的播放、暫停等操作,也不會(huì)程序執(zhí)行其它的操作。1音效播放在游戲開(kāi)始、暫停,方塊落下及消行時(shí)添加相應(yīng)的音效既可以提醒用戶發(fā)生某種變化,又能增強(qiáng)程序的表現(xiàn)效果。音效,相對(duì)來(lái)說(shuō)是比較小的音頻文件,對(duì)于音效,可選取wav格式的音頻文件,不但音頻質(zhì)量好,在系統(tǒng)支持、存儲(chǔ)性方面也占有優(yōu)勢(shì)。根據(jù)多線程及剪輯的思想,首先在程序初始化時(shí)應(yīng)該把音效載入內(nèi)存,游戲開(kāi)始后開(kāi)啟一個(gè)線程,當(dāng)滿足音效播放的條件時(shí),即播放音效,音效播放完畢后,應(yīng)當(dāng)將相應(yīng)的音頻文件的剪輯位置重新置為開(kāi)始處。2背景音樂(lè)播放同音效的播放,背景音樂(lè)的播放也應(yīng)當(dāng)采用剪輯的形式,以方便音樂(lè)的循環(huán)多次播放,同樣,背景音樂(lè)播放可能是貫穿于整個(gè)游戲過(guò)程,背景音樂(lè)的播放必須采用單獨(dú)的線程控制,以不影響程序執(zhí)行其它操作。因?yàn)楸尘耙魳?lè)采用單獨(dú)線程播放,這里面會(huì)出現(xiàn)一個(gè)問(wèn)題,當(dāng)用戶選擇暫停背景音樂(lè)播放時(shí),背景音樂(lè)播放線程是進(jìn)入wait狀態(tài)還是以另一種方式實(shí)現(xiàn)暫停?如果背景音樂(lè)進(jìn)入wait狀態(tài),則當(dāng)用戶取消暫停播放時(shí),必須再創(chuàng)建一個(gè)線程去喚醒它,新建一個(gè)線程只是控制背景音樂(lè)播放,不免浪費(fèi)資源,而且也增加程序編寫(xiě)難度??紤]到背景音樂(lè)極可能在玩家的整個(gè)游戲過(guò)程中都處在播放狀態(tài),當(dāng)暫停時(shí),玩家也隨時(shí)會(huì)取消暫停,故而在游戲結(jié)束之前,本程序會(huì)將背景音樂(lè)播放線程一直處在執(zhí)行狀態(tài),如果玩家暫停音樂(lè)播放,則讓線程轉(zhuǎn)去處理檢測(cè)玩家是否取消暫停,當(dāng)檢測(cè)到暫停取消后,繼續(xù)播放音樂(lè)。4.3.4道具使用模塊目前已經(jīng)存在的俄羅斯方塊游戲鮮有能夠使用道具的,開(kāi)發(fā)一款能夠使用道具功能的俄羅斯方塊游戲具有一定挑戰(zhàn)度,因?yàn)榈谰叩拈_(kāi)發(fā)不僅涉及到游戲策劃等創(chuàng)意性的內(nèi)容,也與圖形圖像處理等美工技術(shù)息息相關(guān),而作者對(duì)美工卻是不擅長(zhǎng)的,基于此,本游戲最初版本的道具可能只有一個(gè),但是為了將來(lái)版本提升的方便,本程序另外預(yù)留了三種道具的使用接口。本游戲一共設(shè)計(jì)了五種道具,旋轉(zhuǎn)方塊、炸彈、地雷、仙女、惡魔,這四種道具是程序現(xiàn)今或?qū)?lái)版本提升后要使用到的,暫時(shí),本游戲?qū)⒅粚?shí)現(xiàn)旋轉(zhuǎn)方塊和炸彈兩種道具。1旋轉(zhuǎn)方塊旋轉(zhuǎn)方塊是一種增加游戲難度的道具,它本身其實(shí)就是方塊,和正常的方塊的不同之處就在于,正常方塊在下落時(shí),如果沒(méi)有接受到用戶的控制命令是不會(huì)旋轉(zhuǎn)的,而旋轉(zhuǎn)方塊則會(huì)不斷地旋轉(zhuǎn)下降。這樣,用戶便很難控制旋轉(zhuǎn)方塊下墜到指定的位置。對(duì)于旋轉(zhuǎn)方塊的定時(shí)下落,可以借用方塊控制線程,但是旋轉(zhuǎn)方塊的定時(shí)旋轉(zhuǎn),則只能依靠另一個(gè)線程實(shí)現(xiàn)。2炸彈本游戲定義的炸彈能夠像方塊一樣從地圖的頂部墜落,當(dāng)下墜到地圖下部與堆積的方塊碰撞時(shí)會(huì)發(fā)生“爆炸”,爆炸將炸毀一定數(shù)量的方塊。炸彈的視圖模型以現(xiàn)成的方塊模型為依據(jù),即除了添加的“炸彈”標(biāo)記,它和七種方塊在外形上是沒(méi)有任何區(qū)別的。炸彈,可以看成是一種特殊類型的方塊。對(duì)于炸彈的殺傷力,有一個(gè)規(guī)則,如果炸彈能夠沒(méi)入已經(jīng)墜下的方塊中,則可以將這個(gè)“炸彈”所占的行數(shù)全部炸毀,并增加相應(yīng)的積分,如果本身已經(jīng)能夠消行,則額外再獎(jiǎng)勵(lì)一倍的積分。否則,炸彈將只炸毀它左右各兩個(gè)格子范圍內(nèi)的方塊。4.3.5網(wǎng)絡(luò)對(duì)戰(zhàn)模塊目前的俄羅斯方塊游戲中,也鮮有具備網(wǎng)絡(luò)對(duì)戰(zhàn)功能的,這是因?yàn)榇祟愋∮螒虿痪邆湓诰W(wǎng)絡(luò)對(duì)戰(zhàn)方面的可玩性,當(dāng)然,如果能夠利用道具進(jìn)行網(wǎng)絡(luò)對(duì)攻,那就另當(dāng)別論了。就如QQ上的火并俄羅斯方塊一樣,要實(shí)現(xiàn)利用道具進(jìn)行網(wǎng)絡(luò)對(duì)攻,其中一方玩家必須能夠看到他的對(duì)手的游戲信息,但這并限于看到對(duì)手的道具數(shù)量,下一個(gè)方塊預(yù)告。所以,本游戲要求將游戲地圖中方塊的實(shí)時(shí)信息遠(yuǎn)程傳輸?shù)搅硪环酵婕业娘@示平臺(tái)。圖像的遠(yuǎn)程傳輸首先要求將游戲地圖中的方塊信息轉(zhuǎn)化為圖像資源,然后將圖像資源轉(zhuǎn)化成基于某種圖片格式的數(shù)據(jù)流,進(jìn)行打包發(fā)送,在接收端上,再把圖像數(shù)據(jù)從數(shù)據(jù)包上提取出來(lái),進(jìn)行解碼,生成相應(yīng)的圖像,然后再把圖像繪制到游戲畫(huà)布中。進(jìn)行網(wǎng)絡(luò)傳輸,首先應(yīng)當(dāng)選定一種網(wǎng)絡(luò)傳輸協(xié)議。TCP套接字協(xié)議和UDP數(shù)據(jù)報(bào)協(xié)議二者中前者傳輸速率慢,但是提供可靠性保證,準(zhǔn)確率高,后者傳輸速率快,但是并提供可靠性保證。對(duì)于游戲的網(wǎng)絡(luò)對(duì)戰(zhàn)來(lái)說(shuō),對(duì)網(wǎng)絡(luò)傳輸?shù)膶?shí)時(shí)性要求比較高,一方玩家必須能夠看到另一方玩家游戲狀況的實(shí)時(shí)信息,這就要求圖像的傳輸速率必須要快,同樣因?yàn)樗膶?shí)時(shí)性,即使某一次傳輸錯(cuò)誤,后面一幀圖像也會(huì)馬上覆蓋前面的圖像,人的肉眼基本上不能辨別出這種錯(cuò)誤,基于此,本游戲的網(wǎng)絡(luò)對(duì)戰(zhàn)傳輸方式應(yīng)該采用基于UDP的用戶數(shù)據(jù)報(bào)協(xié)議。4.4 可靠性設(shè)計(jì)游戲在設(shè)計(jì)時(shí)應(yīng)當(dāng)盡量注意降低各個(gè)模塊之間的耦合性,增強(qiáng)模塊的獨(dú)立性,以便將來(lái)需求時(shí)進(jìn)行游戲版本的提升以及相關(guān)維護(hù)。4.5 概要設(shè)計(jì)評(píng)審經(jīng)過(guò)反復(fù)論證,上面提出的設(shè)計(jì)方案,尤其是游戲設(shè)計(jì)的各個(gè)功能模塊間的算法確實(shí)可行,因此,本游戲可進(jìn)入詳細(xì)設(shè)計(jì)階段。沈陽(yáng)工程學(xué)院畢業(yè)論文 第5章 詳細(xì)設(shè)計(jì)第5章 詳細(xì)設(shè)計(jì)5.1 客戶端設(shè)計(jì)客戶端是游戲非常重要的一部分,它是所有游戲功能的開(kāi)關(guān),上面集合了許多的圖像用戶接口,客戶端的實(shí)現(xiàn)應(yīng)該確定一種合理的組織架構(gòu)。圖5.1是客戶端的組織結(jié)構(gòu)圖:游戲客戶端網(wǎng)絡(luò)對(duì)戰(zhàn)開(kāi) 關(guān)背景音樂(lè)開(kāi) 關(guān)游戲控制器游戲開(kāi) 關(guān)道具控制器游戲定時(shí)控 制鍵盤(pán)控 制音效控制器圖5.1 客戶端的組織架構(gòu)圖游戲客戶端采用swing組件開(kāi)發(fā),并且向其注冊(cè)監(jiān)聽(tīng)器,以實(shí)現(xiàn)各種控制功能,綜合游戲前面的設(shè)計(jì),客戶端上至少要注冊(cè)三個(gè)監(jiān)聽(tīng)器,分別是窗口監(jiān)聽(tīng)器(WindowListener)、動(dòng)作監(jiān)聽(tīng)器(ActionListener)、鍵盤(pán)監(jiān)聽(tīng)器(KeyListener)、選項(xiàng)監(jiān)聽(tīng)器(ItemListener)。根據(jù)初步設(shè)計(jì),可以確定客戶端上所要用到的Swing組件對(duì)象有JFrame對(duì)象、JPanel對(duì)象,JLabel對(duì)象、JButton對(duì)象、JMenuBar對(duì)象、JMenu對(duì)象、JMenuItem對(duì)象、JTextField對(duì)象、JTextArea對(duì)象、JDialog對(duì)象、JRadioButton對(duì)象、JTabbedPane對(duì)象,至少十二個(gè)swing組件對(duì)象。JFrame用以創(chuàng)建窗體,考慮到本游戲具備單機(jī)和網(wǎng)絡(luò)對(duì)戰(zhàn),JFrame對(duì)象的大小并不是不變的,在單機(jī)游戲和網(wǎng)絡(luò)對(duì)戰(zhàn)時(shí),JFrame對(duì)象分別會(huì)呈現(xiàn)出不同大小,以適應(yīng)不同的游戲環(huán)境需求。在主界面上,可以確定有四個(gè)JPanel對(duì)象。第一個(gè)JPanel對(duì)象是用來(lái)繪制方塊的游戲地圖,第二個(gè)JPanel對(duì)象是用來(lái)排列其它各種組件的容器組件,做游戲信息顯示面板,可以放在游戲地圖的左邊,第三個(gè)JPanel對(duì)象是用來(lái)顯示NEXT方塊的,應(yīng)該畫(huà)在第二個(gè)JPanel對(duì)象上,第三個(gè)JPanel對(duì)象是當(dāng)網(wǎng)絡(luò)對(duì)戰(zhàn)時(shí),用來(lái)繪制另一方玩家游戲地圖的繪圖面板,放在游戲信息顯示面板的右邊。可以確定,主界面上,本游戲的按鈕有五個(gè),一個(gè)“開(kāi)始游戲”按鈕,四個(gè)道具按鈕,排列在游戲信息顯示面板上,可以將“開(kāi)始游戲”按鈕放在頂端,當(dāng)按下“開(kāi)始游戲”按鈕后,應(yīng)該改變“開(kāi)始游戲”按鈕的文本內(nèi)容為“暫停游戲”,按下“暫停游戲”按鈕后,再將其文本內(nèi)容重新設(shè)置為“開(kāi)始游戲”。至于四個(gè)道具按鈕,可以放在信息顯示面板的中部位置。JTextArea對(duì)象用來(lái)顯示游戲時(shí)的相關(guān)信息,比如網(wǎng)絡(luò)對(duì)戰(zhàn)時(shí)顯示雙方玩家的比分等信息。JTextArea應(yīng)該放在游戲信息面板的底部。JTextField對(duì)象至少應(yīng)該有兩個(gè),用來(lái)顯示雙方玩家的分?jǐn)?shù)信息,考慮到對(duì)戰(zhàn)時(shí)的局時(shí)設(shè)置,還應(yīng)該增加一個(gè)文本框用來(lái)計(jì)時(shí),計(jì)時(shí)的文本框最好放在JTextArea對(duì)象的上方,這樣,兩個(gè)分?jǐn)?shù)文本框則布置在道具按鈕和計(jì)時(shí)文本框之間。本游戲主界面上的JLabel對(duì)象至少應(yīng)該有四個(gè)。首先,應(yīng)該為NEXT方塊畫(huà)布添加一個(gè)標(biāo)簽,然后在四個(gè)道具按鈕上也應(yīng)該添加一個(gè)道具標(biāo)簽,最后,在兩個(gè)顯示分?jǐn)?shù)的文本框上方也應(yīng)該添加一個(gè)標(biāo)簽最后,在游戲主界面的頂端要添加一個(gè)菜單欄,菜單欄上添加幾個(gè)菜單對(duì)象。綜合以上信息,可以大概確定本游戲的主界面,如圖5.2所示:圖5.2 游戲界面圖5.2音效播放控制模塊設(shè)計(jì)本游戲的音效播放采用剪輯及多線程的方式實(shí)現(xiàn)。音頻播放需要用到JAVA中的sound包。首先,利用AudioSystem這個(gè)音頻工廠的getAudioInputstream()方法從音頻文件中取得一個(gè)音頻輸入流,其次,從這個(gè)音頻輸入流創(chuàng)建一個(gè)Clip,然后打開(kāi)這個(gè)Clip。這樣,當(dāng)需要時(shí),就可以利用Clip中的start()方法播放這個(gè)剪輯,重復(fù)播放,可以用setFramePosition(0)這個(gè)方法將剪輯的位置重新置為0。音效剪輯的播放控制流程圖如圖5.3所示:開(kāi)始滿足音效播放條件Notify音效播放線程,游戲線程進(jìn)入wait狀態(tài)播放音效Notify游戲線程,音效播放線程進(jìn)入wait狀態(tài)結(jié)束圖5.3 音效播放流程圖5.3背景音樂(lè)播放控制模塊設(shè)計(jì)同音效的播放,背景音樂(lè)的播放也應(yīng)當(dāng)采用剪輯的形式,以方便音樂(lè)的循環(huán)多次播放,同樣,背景音樂(lè)播放也要單獨(dú)的線程進(jìn)行控制。前面概要設(shè)計(jì)提出了一個(gè)問(wèn)題。因?yàn)楸尘耙魳?lè)采用單獨(dú)線程播放,當(dāng)用戶選擇暫停背景音樂(lè)播放時(shí),背景音樂(lè)播放線程如果以進(jìn)入wait狀態(tài)來(lái)暫停的話,則當(dāng)用戶取消暫停時(shí)必須還需要一個(gè)線程來(lái)喚醒它,額外增加一個(gè)線程的話,不免浪費(fèi)系統(tǒng)資源,而且也會(huì)增加編寫(xiě)的難度。從另一個(gè)角度來(lái)說(shuō),背景音樂(lè)極可能在玩家的整個(gè)游戲過(guò)程中都處在播放狀態(tài),當(dāng)暫停時(shí),玩家也隨時(shí)會(huì)取消暫停,因此,可以讓背景音樂(lè)線程從游戲開(kāi)始后就一直處在執(zhí)行狀態(tài),如果用戶暫停播放,可以讓線程轉(zhuǎn)去循環(huán)處理檢測(cè)用戶是否取消暫停,當(dāng)檢測(cè)到用戶取消暫停時(shí),繼續(xù)播放音樂(lè)。背景音樂(lè)播放控制的算法流程如圖5.4所示:開(kāi)始否背景音樂(lè)播放控制線程是否接受到恢復(fù)信息是否處在暫停狀態(tài)是否是播放背景音樂(lè)接受到暫停信息暫停播放結(jié)束圖5.4 背景音樂(lè)播放控制流程圖5.4網(wǎng)絡(luò)對(duì)戰(zhàn)模塊設(shè)計(jì)如圖5.2游戲界面圖所示,可以在菜單欄中“游戲”菜單項(xiàng)中添加一個(gè)“網(wǎng)絡(luò)對(duì)戰(zhàn)”菜單選項(xiàng),當(dāng)用戶單擊“網(wǎng)絡(luò)對(duì)戰(zhàn)”菜單選項(xiàng)后,彈出一個(gè)對(duì)話框,提示用戶輸入要連接的主機(jī)的IP地址,用戶輸入IP地址后,程序會(huì)記錄下這個(gè)IP地址,當(dāng)用戶開(kāi)啟游戲后,數(shù)據(jù)傳輸線程會(huì)將數(shù)據(jù)發(fā)送到這個(gè)IP地址的指定端口號(hào)上。對(duì)于實(shí)現(xiàn)網(wǎng)絡(luò)傳輸?shù)募夹g(shù),可以用UDP數(shù)據(jù)報(bào)傳輸方式。首先從AWT包中的Robot創(chuàng)建一個(gè)實(shí)例,這個(gè)類的實(shí)例是有關(guān)本機(jī)屏幕資源的信息,它有一個(gè)createScreenCapture()方法,可以用它來(lái)創(chuàng)建屏幕上指定坐標(biāo)位置,指定大小的一副圖像。當(dāng)然,在此之前,我們還需要獲得游戲地圖所在屏幕的坐標(biāo)。Component類中提供了一個(gè)獲取組件屏幕坐標(biāo)的方法getLocationOnScreen(),我們可以利用這個(gè)方法獲取組件在屏幕上的坐標(biāo),然后把這個(gè)坐標(biāo)賦給一個(gè)Point對(duì)象,再?gòu)腞ectangle類中創(chuàng)建一個(gè)指定屏幕坐標(biāo)位置,指定寬和高的矩形,然后就可以用createScreenCapture()創(chuàng)建一副包含游戲地圖區(qū)域的圖像了。創(chuàng)建圖像信息以后,可以利用imageio包ImageIO類中的write(RenderedImageim, StringformatName, OutputStreamoutput)方法將圖像文件寫(xiě)入到一個(gè)輸出流中,然后可以用toByteArray()從輸出流中取得數(shù)據(jù),最后就是將數(shù)據(jù)打包發(fā)送了。對(duì)于接收端接收到的數(shù)據(jù)包,可以先從數(shù)據(jù)包中將圖像字節(jié)數(shù)據(jù)提出出來(lái)放到一個(gè)字節(jié)數(shù)組中,然后利用Toolkit包中的createImage(byte imagedata)方法將圖像字節(jié)數(shù)據(jù)轉(zhuǎn)化成圖像,最后將圖像畫(huà)到游戲畫(huà)布中即可。相應(yīng)的算法流程如圖5.5所示:開(kāi)始開(kāi)始確定游戲地圖在屏幕上的坐標(biāo)構(gòu)造一個(gè)指定坐標(biāo)大小的Rectangle對(duì)象從指定的端口號(hào)接收數(shù)據(jù)包將Rectangle對(duì)象指定的屏幕區(qū)域轉(zhuǎn)化為圖像資源從數(shù)據(jù)包中取得字節(jié)數(shù)據(jù)將此圖像資源以某種格式寫(xiě)入輸出流以此字節(jié)數(shù)據(jù)創(chuàng)建一副圖像從輸出流獲取字節(jié)數(shù)據(jù)將圖像繪制到游戲畫(huà)布中將字節(jié)數(shù)據(jù)打包發(fā)送結(jié)束結(jié)束(a) 圖像發(fā)送流程 (b) 圖像接收流程圖5.5 圖像發(fā)送和接收流程圖5.5道具模塊設(shè)計(jì)5.5.1旋轉(zhuǎn)方塊的設(shè)計(jì)旋轉(zhuǎn)方塊的出現(xiàn)是隨機(jī)的,而隨著游戲級(jí)別的提升,每一關(guān)出現(xiàn)的旋轉(zhuǎn)方塊的數(shù)量也會(huì)不同,對(duì)于七種方塊來(lái)說(shuō),它們?cè)谌魏我欢螘r(shí)間內(nèi)出現(xiàn)的概率都是一致的,再者,旋轉(zhuǎn)方塊需要兩個(gè)定時(shí)器,定時(shí)下落和定時(shí)旋轉(zhuǎn)。旋轉(zhuǎn)方塊的這個(gè)性質(zhì)要求它必須要兩個(gè)線程才能控制,但是為了充分利用資源,我們可以利用方塊控制線程去控制旋轉(zhuǎn)方塊定時(shí)下落,然后只需再創(chuàng)建一個(gè)線程控制它定時(shí)旋轉(zhuǎn)即可。確定了兩個(gè)線程共同控制旋轉(zhuǎn)方塊,就會(huì)出現(xiàn)一個(gè)線程協(xié)調(diào)工作的問(wèn)題。如果一個(gè)新方塊出現(xiàn)的時(shí)機(jī)正好也是旋轉(zhuǎn)方塊出現(xiàn)的時(shí)機(jī),程序就會(huì)出現(xiàn)紊亂,所以必須保證,在同一時(shí)間,正常方塊和旋轉(zhuǎn)方塊只能出現(xiàn)一個(gè)。因?yàn)閮蓚€(gè)線程需要共同控制旋轉(zhuǎn)方塊,所以不能用wait()和notify()這兩個(gè)方法去協(xié)調(diào)線程,而應(yīng)當(dāng)利用其它條件去協(xié)調(diào)兩個(gè)線程。首先,游戲開(kāi)始后,旋轉(zhuǎn)方塊控制線程可以隨機(jī)休眠一定時(shí)間(這個(gè)休眠時(shí)間應(yīng)該是隨著游戲級(jí)別的提升而縮短的)。休眠時(shí)間結(jié)束后,循環(huán)檢測(cè)正常方塊是否已經(jīng)落下,當(dāng)檢測(cè)到方塊落下后,馬上得到一個(gè)新方塊,然后開(kāi)啟一個(gè)循環(huán),在方塊沒(méi)有落下之前讓它按一定的時(shí)間頻率旋轉(zhuǎn),成為一個(gè)旋轉(zhuǎn)方塊。對(duì)于方塊控制線程,在方塊落下時(shí)應(yīng)該休眠一定數(shù)量的時(shí)間,以讓旋轉(zhuǎn)方塊控制線程有得到旋轉(zhuǎn)方塊的機(jī)會(huì),如果超出這個(gè)休眠時(shí)間,旋轉(zhuǎn)方塊控制線程還沒(méi)有得到新方塊,則可以認(rèn)為旋轉(zhuǎn)方塊控制線程還處在休眠中,方塊控制線程得到一個(gè)新方塊。相應(yīng)的算法流程如圖5.6和圖5.7所示:休眠時(shí)間結(jié)束隨機(jī)休眠一定時(shí)間檢測(cè)現(xiàn)有方塊是否已經(jīng)落下是否能夠消行方塊是否已經(jīng)落下是否能夠消行休眠一定時(shí)間否是得到新方塊休眠一定時(shí)間旋轉(zhuǎn)方塊否是游戲是否結(jié)束是否能夠消行是否開(kāi)始結(jié)束圖5.6 旋轉(zhuǎn)方塊控制線程工作圖休眠一定時(shí)間,讓旋轉(zhuǎn)方塊控制線程有得到方塊的機(jī)會(huì)檢測(cè)方塊是否已經(jīng)落下是否能夠消行是休眠時(shí)間結(jié)束旋轉(zhuǎn)方塊控制線程是否得到新方塊是否能夠消行是否否得到新方塊方塊下落開(kāi)始結(jié)束圖5.7 方塊控制線程對(duì)旋轉(zhuǎn)方塊的控制示意圖5.5.2炸彈的設(shè)計(jì)道具的出現(xiàn)是隨機(jī)的。本游戲中要實(shí)現(xiàn)的道具“炸彈”和方塊一樣,從游戲地圖頂部降落,每隔一個(gè)時(shí)間間隔,會(huì)自動(dòng)降落一格。對(duì)于炸彈的控制,可以添加到道具(旋轉(zhuǎn)方塊)控制線程中。炸彈控制的算法流程如圖5.8所示:休眠時(shí)間結(jié)束隨機(jī)休眠一定時(shí)間檢測(cè)現(xiàn)有方塊是否已經(jīng)落下是否能夠消行是否能夠消行是否能夠消行休眠一定時(shí)間否是產(chǎn)生一個(gè)炸彈炸彈落下否否是否完全沒(méi)入了方塊中炸毀左右各兩個(gè)格子范圍內(nèi)的方塊格子炸毀所占行數(shù)的方塊,增加相應(yīng)積分,再額外增加所能消行的相應(yīng)分?jǐn)?shù)炸毀所占行數(shù)的方塊,增加相應(yīng)積分是否是是開(kāi)始結(jié)束圖5.8 炸

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論