




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于Java的打磚塊游戲開(kāi)發(fā)PAGEPAGEII北方民族大學(xué)學(xué)士學(xué)位論文論文題目基于JAVA的打磚塊游戲開(kāi)發(fā)系(部)名稱(chēng):計(jì)算機(jī)科學(xué)與工程學(xué)院學(xué)生姓名:專(zhuān) 業(yè):軟件工程 學(xué) 號(hào): 指導(dǎo)教師姓名:論文提交時(shí)間:2014-5-7論文答辯時(shí)間:2014-5-17學(xué)位授予時(shí)間:北方民族大學(xué)教務(wù)處制基于JAVA的打磚塊游戲開(kāi)發(fā)摘要打磚塊是一款堪稱(chēng)經(jīng)典的小游戲,在掌上游戲機(jī)上和許多手機(jī)上都能發(fā)現(xiàn)這個(gè)小游戲。游戲基本內(nèi)容是玩家通過(guò)控制一個(gè)能夠左右移動(dòng)的擋板,反彈正在運(yùn)動(dòng)中彈球,使之改變移動(dòng)的方向,用小球消除游戲窗口里面的的磚塊,然后到達(dá)下一關(guān),在障礙物被消除的過(guò)程中,可能會(huì)產(chǎn)生一些能改變擋板或者小球狀態(tài)的物品,例如:擋板變長(zhǎng)、變短,小球威力加強(qiáng)等等。本系統(tǒng)是一個(gè)基于Java語(yǔ)言平臺(tái)的打磚塊游戲。主要任務(wù)是設(shè)計(jì)打磚塊游戲的算法,并使用JAVA語(yǔ)言編寫(xiě)程序,最終完成游戲編程,并使之能夠正確運(yùn)行。主要是小球的碰撞檢測(cè)和運(yùn)動(dòng)軌跡的算法,碰撞部分可以將小球看成一個(gè)矩形,當(dāng)矩形的邊界坐標(biāo)與磚塊、擋板、墻壁等一樣時(shí),可以判斷為進(jìn)行了碰撞,而運(yùn)動(dòng)軌跡只要在碰撞后將X軸或Y軸取反就可以了。本文第一章闡述了選題目的及Java游戲目前的發(fā)展現(xiàn)狀。第二章介紹了Java語(yǔ)音的特點(diǎn)和基于Java游戲開(kāi)發(fā)的相關(guān)的技術(shù)。第三章詳細(xì)介紹了打磚塊游戲,包括游戲的規(guī)則和期待的效果等。第四章進(jìn)行打磚塊游戲的具體設(shè)計(jì)與實(shí)現(xiàn),包括界面的設(shè)計(jì),類(lèi)的設(shè)計(jì),算法的設(shè)計(jì)等等。第五章對(duì)游戲進(jìn)行運(yùn)行和測(cè)試,以期檢測(cè)游戲中的各種問(wèn)題。期望通過(guò)本游戲?qū)嵗莆招⌒蚃ava游戲開(kāi)發(fā)和Java編程的基礎(chǔ)的知識(shí)和技巧,使自己具備開(kāi)發(fā)Java游戲基本能力。關(guān)鍵字:java,游戲設(shè)計(jì),測(cè)試,打磚塊,算法
Arkanoidjava-baseddevelopmentAbstractArkanoidisasmallclassicgamesonhandheldgameconsolesandmanymobilephonescanbefoundonthislittlegame.Thebasiccontentofthegamebycontrollingaplayercanmovearoundthebaffle,thereboundisinmotionpinball,makingchangesinthedirectionofmovement,eliminatingthebrickswithasmallballinsidethegamewindow,thenreachthenextlevel,theobstaclesprocessiseliminated,theshuttermaybesomechangeinthestateofpelletsorarticlessuchas:thepaddlelength,shorter,andsoenhancethepoweroftheball.ThissystemisaJava-basedplatformArkanoidgame.ThemaintaskistodesignalgorithmsArkanoidgameandusingJAVAprogramminglanguage,thefinalcompletionofgameprogramming,andenableittoruncorrectly.Themaincollisiondetectionalgorithmandthetrajectoryoftheball,theballcollisionportionmayberegardedasarectangle,thecoordinatesoftheboundaryrectanglewhenbricks,baffles,suchasawall,thecollisioncanbejudged,andexerciseJustafterthecollisiontrajectoryX-axisorY-axisinvertedit.ThefirstchapterdescribesthepurposeofthetopicandthecurrentstatusofthedevelopmentofJavagames,thesecondchapterintroducestheJava-basedvoicefeaturesandrelatedtechnologiesJavagamedevelopment,thethirdlegdetailingArkanoidgames,includinggamesrulesandexpectationseffects,ChapterIVspecificdesignandimplementationofArkanoidgames,includinginterfacedesign,classdesign,algorithmdesign,etc.,thefifthchapterofthegamerunningandtestinginordertodetectgamevariousproblems.ExpectedbythegamemasterinstancesmallJavagamedevelopmentandJavaprogrammingbasedknowledgeandskills,sothattheyhavethebasicabilitytodevelopJavagames.Keywords:Java,GameDesign,GameTesting,Arkanoid,TheAlgorithm
目錄摘要 IAbstract II第一章緒論 11.1選題的目的和意義 11.2游戲產(chǎn)業(yè)的發(fā)展現(xiàn)狀 1第二章游戲開(kāi)發(fā)的環(huán)境及相關(guān)技術(shù) 32.1開(kāi)發(fā)環(huán)境 32.2Java語(yǔ)言特點(diǎn) 32.3GUI介紹 4第三章打磚塊游戲介紹 53.1打磚塊游戲的規(guī)則 53.2打磚塊游戲預(yù)期的效果 5第四章打磚塊游戲的設(shè)計(jì)與實(shí)現(xiàn) 74.1游戲模塊設(shè)計(jì) 74.1.1游戲界面繪制模塊 74.1.2游戲操作模塊 84.2類(lèi)的設(shè)計(jì) 84.3代碼實(shí)現(xiàn) 104.3.1GameFrame類(lèi) 104.3.2GamePanel類(lèi) 114.3.3Pad類(lèi) 164.3.4Block類(lèi) 174.3.5Bullet類(lèi) 204.3.6Ball類(lèi) 224.3.7SoundPlayer類(lèi) 26第五章游戲的運(yùn)行與測(cè)試 275.1測(cè)試的目的和原則 275.2游戲界面顯示測(cè)試 275.3擋板移動(dòng)控制 295.4小球運(yùn)動(dòng)檢測(cè) 305.5寶物功能測(cè)試 305.6游戲聲音測(cè)試 315.7測(cè)試結(jié)果分析 32第六章總結(jié)與展望 336.1論文工作總結(jié) 336.2展望 33參考文獻(xiàn) 34致謝 35第一章緒論1.1選題的目的和意義Java編程語(yǔ)言具有非常多的優(yōu)點(diǎn),它簡(jiǎn)單而健壯,高性能又可移植,面向?qū)ο?、多線程和動(dòng)態(tài)的語(yǔ)言等等。隨著Java語(yǔ)言的發(fā)展,如今,Java已經(jīng)被廣泛的運(yùn)用于多種領(lǐng)域。而且對(duì)基于Java語(yǔ)言的游戲需求量也越來(lái)越大。隨著人們生活質(zhì)量的不斷提高以及個(gè)人電腦和網(wǎng)絡(luò)的普及,人們的業(yè)余生活質(zhì)量要求也在不斷提高,選擇一款好玩,精美,畫(huà)面和音質(zhì),品質(zhì)優(yōu)良的休閑游戲已經(jīng)成為一種流行的休閑方式??梢哉f(shuō)在人們的日常生活中,除了工作、學(xué)習(xí),玩自己喜歡的游戲正在成為一種時(shí)尚。休閑類(lèi)游戲可以說(shuō)是最受各個(gè)年齡段的人們歡迎的一類(lèi)游戲,可以想象大量六七十歲的老人都玩過(guò)打磚塊,休閑類(lèi)游戲給許多玩家們留下了一個(gè)美好的回憶。打磚塊游戲是一個(gè)很常見(jiàn)的游戲,游戲規(guī)則也非常簡(jiǎn)單。本畢業(yè)設(shè)計(jì)使用java語(yǔ)言來(lái)開(kāi)發(fā)一個(gè)打磚塊游戲。此項(xiàng)目的目的在于通過(guò)完成游戲項(xiàng)目,加深對(duì)Java的語(yǔ)法、算法等多方面的學(xué)習(xí),深入了解圖形用戶(hù)界面的設(shè)計(jì),并且熟練的使用編程軟件,將書(shū)本上的理論知識(shí)應(yīng)用到實(shí)踐當(dāng)中,來(lái)拿這款打磚塊小游戲來(lái)驗(yàn)證下自己的學(xué)習(xí)的理論知識(shí)是否扎實(shí)。希望通過(guò)這一次的畢業(yè)設(shè)計(jì),讓我在程序的設(shè)計(jì)和算法的設(shè)計(jì)上有進(jìn)一步的認(rèn)識(shí),然后獲得一定提高。通過(guò)設(shè)計(jì)增加了我們的實(shí)際動(dòng)手能力,對(duì)于我們以后工作能力和信心的培養(yǎng)有重要意義,進(jìn)而與社會(huì)所需的人才相接軌。更好的完善自己!游戲是一種藝術(shù),而Java是一種技術(shù),集合不同的藝術(shù)門(mén)類(lèi),并把藝術(shù)與技術(shù)相結(jié)合,完成游戲的開(kāi)發(fā),游戲可以讓人在疲倦或休閑之時(shí)獲得輕松而又愉快的享受。所以,開(kāi)發(fā)出大家都比較喜歡的,高品質(zhì)的,簡(jiǎn)單容易好玩的休閑游戲,將會(huì)受到人們的普遍歡迎。讓人們?cè)诠ぷ鲗W(xué)習(xí)之余,享受游戲的快樂(lè),也是一款游戲真正成功的意義。1.2游戲產(chǎn)業(yè)的發(fā)展現(xiàn)狀游戲的產(chǎn)業(yè)是新時(shí)代發(fā)展起來(lái)的行業(yè),它的獨(dú)特的力量使它在當(dāng)今的娛樂(lè)領(lǐng)域占有一塊非常大的比重,當(dāng)前的種種原因使得用戶(hù)可以選擇的娛樂(lè)活動(dòng)變少,這是游戲產(chǎn)業(yè)發(fā)展起來(lái)的一個(gè)原因,但是更大的原因是游戲具有非常大的吸引力,它可以讓玩家消磨時(shí)間,可以讓玩家在緊張的工作后獲得放松,可以讓玩家們相互溝通認(rèn)識(shí)更多的朋友,它可以跨越地區(qū)的限制,使人們?cè)谑澜绲娜我饨锹涠伎梢韵嗷蕵?lè)。游戲產(chǎn)業(yè)作為“第四產(chǎn)業(yè)”,更是促進(jìn)高新技術(shù)不斷升級(jí)發(fā)展,這也使之成為經(jīng)濟(jì)增長(zhǎng)的一個(gè)支撐點(diǎn)如今,小游戲、網(wǎng)頁(yè)游戲深受廣大網(wǎng)民歡迎,它方法簡(jiǎn)單,不需要繁復(fù)的注冊(cè)下載等過(guò)程,而且游戲不乏經(jīng)典。隨著手機(jī)產(chǎn)業(yè)的迅速發(fā)展,傳統(tǒng)網(wǎng)游占據(jù)的空間不斷的縮減,而網(wǎng)頁(yè)游戲無(wú)需客戶(hù)端的特性,也使得Web游戲可能會(huì)主宰網(wǎng)絡(luò)游戲的市場(chǎng)。目前,知識(shí)數(shù)據(jù)庫(kù)廣泛的被應(yīng)用在企業(yè)系統(tǒng),金融也等等封面,但是游戲知識(shí)數(shù)據(jù)下載還在處展初期。如果利用游戲知識(shí)庫(kù)的話,我們能更好的實(shí)現(xiàn)游戲規(guī)則處理。開(kāi)發(fā)出一款游戲后,再開(kāi)發(fā)其他的同種類(lèi)型的游戲,我們僅僅把游戲規(guī)則作改變,就能完成全部游戲的開(kāi)發(fā)。通過(guò)游戲知識(shí)數(shù)據(jù)庫(kù),我們可以快速的開(kāi)發(fā)多款同類(lèi)游戲,大大地縮減了游戲開(kāi)發(fā)周期,游戲知識(shí)數(shù)據(jù)庫(kù)在將來(lái)很有前景。
第二章游戲開(kāi)發(fā)的環(huán)境及相關(guān)技術(shù)本系統(tǒng)是基于Java語(yǔ)言開(kāi)發(fā)的打磚塊游戲,使用Eclipse作為開(kāi)發(fā)工具,搭建游戲的開(kāi)發(fā)環(huán)境,在整個(gè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中,需要使用到Java編程語(yǔ)言的基本知識(shí),包括GUI、算法、線程等,并遵循它的一系列相關(guān)規(guī)范。2.1開(kāi)發(fā)環(huán)境 操作系統(tǒng):MicrosoftWindows7 開(kāi)發(fā)語(yǔ)言:Java JDK版本:JDK1.7<build1.7.0_51–b13>2.2Java語(yǔ)言特點(diǎn)1.Java語(yǔ)言是強(qiáng)制面向?qū)ο蟮?。Java語(yǔ)言提供了類(lèi)和繼承和借口原語(yǔ),為了方便,只能允許類(lèi)間的單繼承,但是,它支持接口的多繼承,而且支持類(lèi)和接口之間的實(shí)現(xiàn)機(jī)制。Java是純面向?qū)ο蟮摹?.Java語(yǔ)言是健壯的。Java會(huì)強(qiáng)類(lèi)型,異常處理和垃圾的自動(dòng)收集等是Java程序健壯性的重要保證。Java丟棄了指針,是個(gè)非常明智的決定。安全檢查機(jī)制使Java具有更強(qiáng)的健壯性。3.Java語(yǔ)言是可移植的。Java可移植性源于體系結(jié)構(gòu)的中立。Java嚴(yán)格規(guī)定了各個(gè)基本數(shù)據(jù)類(lèi)型的長(zhǎng)度。Java系統(tǒng)本身也具有很強(qiáng)的可移植性。4.Java語(yǔ)言是解釋型的。Java程序在Java平臺(tái)上被編譯為字節(jié)碼格式(class文件),然后就可以在實(shí)現(xiàn)Java平臺(tái)的所有系統(tǒng)中運(yùn)作。Java平臺(tái)中的Java解釋器對(duì)節(jié)碼進(jìn)行解釋執(zhí)行,執(zhí)行過(guò)程中需要的類(lèi)在聯(lián)接階段把執(zhí)行過(guò)程中需要的類(lèi)載入到運(yùn)行環(huán)境中。5.Java語(yǔ)言是原生支持多線程的。Java的線程是一種特殊的對(duì)象,由Thread類(lèi)或者它的子(孫)類(lèi)建立。另外Thread類(lèi)實(shí)現(xiàn)了Runable接口,所以,每個(gè)線程均有它獨(dú)自的run方法,run方法中包含了運(yùn)行線程所需代碼。線程活動(dòng)由方法來(lái)控制。Java語(yǔ)言可以同步運(yùn)行多個(gè)線程,將提供多線程同步機(jī)制。2.3GUI介紹圖形用戶(hù)界面(GraphicalUserInterface,簡(jiǎn)稱(chēng)GUI)將計(jì)算機(jī)用戶(hù)的界面用圖形顯示。圖形界面相對(duì)于命令行界面,更加簡(jiǎn)單直觀,更容易使用戶(hù)在視覺(jué)上接受。GUI的廣泛應(yīng)用,可以說(shuō)是計(jì)算機(jī)發(fā)展的重大成就,讓非專(zhuān)業(yè)用戶(hù)也可以流暢的使用計(jì)算機(jī)。人們可以通過(guò)菜單、界面、按鈕等途徑來(lái)進(jìn)行方便的控制,取代了大量的需要死記硬背的命令。而嵌入式GUI幾個(gè)基本方面的要求如下:輕便、資源占用率少、高性能、高可靠、方便移植、可以配置。
第三章打磚塊游戲介紹打磚塊游戲(英文:Arkanoid)是一款堪稱(chēng)經(jīng)典的小游戲,曾經(jīng)流行在老式掌上游戲機(jī)上面。這款游戲上手非常簡(jiǎn)單,操作簡(jiǎn)單又變換無(wú),十分耐玩,所以它一出現(xiàn)很快便風(fēng)靡一時(shí)。3.1打磚塊游戲的規(guī)則打磚塊游戲的規(guī)則比較簡(jiǎn)單,游戲基本內(nèi)容是玩家通過(guò)控制一個(gè)能夠左右移動(dòng)的擋板,反彈正在運(yùn)動(dòng)中的球,使之改變移動(dòng)的方向,用小球消除游戲窗口里面的磚塊,然后到達(dá)下一關(guān),在障礙物被消除的過(guò)程中,可能會(huì)使小球和擋板產(chǎn)生一些變化,例如:擋板變長(zhǎng)、變短,小球威力加強(qiáng)等等。下面對(duì)游戲的規(guī)則做一個(gè)詳細(xì)的說(shuō)明:(1)游戲主界面,是一個(gè)的矩形區(qū)域,固定其大?。簩挾葹?00,高度為500;(2)擋板位于界面最下方,可以水平移動(dòng),擋板會(huì)將下落的小球反彈,讓小球繼續(xù)運(yùn)動(dòng);(3)磚塊位于界面的上方,每一關(guān)的數(shù)量和排列方式都不同。(4)小球會(huì)在界面上、左、右邊界和擋板、磚塊之間來(lái)回彈跳,小球碰到邊界和擋板會(huì)反彈,碰到磚塊會(huì)將磚塊消除再反彈。如果小球掉落到擋板下方,會(huì)失去生命,小球生命值為0時(shí)游戲結(jié)束。(5)小球每擊碎一塊磚塊都會(huì)增加分?jǐn)?shù)。(6)有一些特殊顏色的磚塊,當(dāng)小球擊碎塔門(mén)時(shí)會(huì)產(chǎn)生各種變化,比如小球速度加快減慢,或者是擋板的長(zhǎng)度增加或減短。打磚塊游戲非常經(jīng)典,但是版本也很多,某些規(guī)則可能不同,但最基本的規(guī)則是不會(huì)改變的。3.2打磚塊游戲預(yù)期的效果打磚塊游戲系統(tǒng)界面的布局應(yīng)盡可能的做到合理、美觀。具體針對(duì)本次設(shè)計(jì),游戲的基本要求包括下面幾點(diǎn):(1)游戲基本功能(方塊的操作):擋板左右移動(dòng)、發(fā)射小球等,要求用鼠標(biāo)或者方向鍵都能操作。(2)游戲界面:游戲界面要顯示小球的生命值(剩余小球數(shù)量),得分,關(guān)卡。(3)游戲隨關(guān)卡等級(jí)提升使難度有所增加。(4)游戲分?jǐn)?shù)的統(tǒng)計(jì)。(5)暫停游戲/繼續(xù)游戲、退出游戲。(6)磚塊消除,擋板與小球碰撞,關(guān)卡升級(jí)都會(huì)有不同的聲音。(7)游戲能流暢的運(yùn)行游戲啟動(dòng)后,點(diǎn)擊鼠標(biāo)或者按空格鍵,發(fā)射小球,小球碰到磚塊會(huì)將磚塊消除,并同時(shí)增加得分,清除掉所有磚塊,進(jìn)入下一關(guān),通過(guò)最后一關(guān)后游戲勝利,如果擋板沒(méi)有在小球下落時(shí)擋住小球,小球生命值減少,小球生命值為0時(shí),游戲結(jié)束。
第四章打磚塊游戲的設(shè)計(jì)與實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)是經(jīng)過(guò)系統(tǒng)分析,然后由抽象至具體的過(guò)程,本階段的主要目標(biāo)是把在分析階段中的抽象概念化作能夠?qū)崿F(xiàn),使之成為有具體功能的模塊,提供支持給系統(tǒng)代碼設(shè)計(jì)。在系統(tǒng)設(shè)計(jì)的階段種,應(yīng)該盡可能全面的思考全系統(tǒng)的功能與需求,由于情況的不同,有時(shí)還要考慮到系統(tǒng)性能。打磚塊游戲的畫(huà)面簡(jiǎn)單,功能也不怎么復(fù)雜,系統(tǒng)資源占用很少,所以,在這里不過(guò)于考慮性能需求,下面對(duì)游戲的詳細(xì)設(shè)計(jì)過(guò)程做一個(gè)說(shuō)明。4.1游戲模塊設(shè)計(jì)4.1.1游戲界面繪制模塊界面繪制模塊的作用是負(fù)責(zé)游戲界面的顯示。游戲界面為一矩形窗口。游戲界面內(nèi)容:1.游戲信息:小球生命值顯示、游戲得分、游戲等級(jí),隨著游戲不斷更新;2.游戲功能:磚塊、小球、擋板;3.游戲提示信息,當(dāng)游戲開(kāi)始后會(huì)隱藏。游戲界面如圖4.1,灰色區(qū)域?yàn)橛螒蚬δ軈^(qū)圖4-1游戲界面設(shè)計(jì)4.1.2游戲操作模塊游戲操作模塊,包括磚塊的生成,擋板的生成,擋板的移動(dòng),小球的運(yùn)動(dòng),消除磚塊,游戲得分,游戲等級(jí)等。要特別注意小球與擋板移動(dòng)后會(huì)不會(huì)超出操作區(qū)域等問(wèn)題。游戲過(guò)程中,玩家是通過(guò)鍵盤(pán)或鼠標(biāo)控制游戲。玩家輸入操作命令,程序接收并做出響應(yīng)。下面列出鼠標(biāo)、鍵盤(pán)的按鍵和對(duì)應(yīng)的功能:(1)左右方向鍵或鼠標(biāo)左右移動(dòng):擋板左右移動(dòng);(2)空格鍵或鼠標(biāo)左鍵:彈出小球,開(kāi)始游戲(3)R鍵:游戲重新開(kāi)始;(4)CTRL鍵:發(fā)射子彈(子彈可以消除小球)。4.2類(lèi)的設(shè)計(jì)本論文共設(shè)計(jì)了7個(gè)類(lèi),分別是GameFrame,GamePanel,Pad,Block,Bullet,Ball,SoundPlayer類(lèi),每個(gè)類(lèi)具體如下:(1)GameFrame類(lèi):游戲窗口類(lèi),如圖4-2; 圖4-2GameFrame類(lèi)的方法(2)GamePanel類(lèi):游戲界面類(lèi),如圖4-3;圖4-3GamePanel類(lèi)的方法(3)Pad類(lèi):擋板類(lèi),如圖4-4;圖4-4Pad類(lèi)的方法(4)Block類(lèi):磚塊類(lèi),如圖4-5; 圖4-5Block類(lèi)的方法(5)Bullet類(lèi):子彈類(lèi),如圖4-6;圖4-6Bullet類(lèi)的方法(6)Ball類(lèi):小球類(lèi),如圖4-7;圖4-7Ball類(lèi)的方法(7)SoundPlayer:聲音控制類(lèi),如圖4-8;圖4-8SoundPlayer聲音類(lèi)GameFrame類(lèi)是游戲窗口啟動(dòng)類(lèi),在啟動(dòng)時(shí)會(huì)調(diào)用GamePanel類(lèi),繪制游戲啟動(dòng)界面,GamePanel類(lèi)繼續(xù)調(diào)用其他類(lèi),最終實(shí)現(xiàn)游戲功能。4.3代碼實(shí)現(xiàn)這一部分將會(huì)對(duì)游戲中的類(lèi)的功能做出介紹,并給出關(guān)鍵部分的代碼實(shí)現(xiàn)。4.3.1GameFrame類(lèi)GameFrame是創(chuàng)建一個(gè)JFrame主界面,設(shè)置主界面的標(biāo)題、長(zhǎng)與寬、窗口監(jiān)聽(tīng)、畫(huà)板等屬性、窗口監(jiān)聽(tīng)這是一個(gè)標(biāo)準(zhǔn)的游戲窗口繪制類(lèi),可以在多處使用?!敬a實(shí)現(xiàn)】publicclassGameFrame{ publicGameFrame(){ Frameapp=newFrame("打磚塊"); app.addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ System.exit(0); } }); app.setLocation(200,100); GamePanelgamePanel=newGamePanel(); app.add(gamePanel,BorderLayout.CENTER); app.pack(); app.setVisible(true); gamePanel.gameStart(); } publicstaticvoidmain(Stringargs[]){ newGameFrame(); }}4.3.2GamePanel類(lèi)GamePanel類(lèi)是游戲界面類(lèi),這個(gè)類(lèi)處理了這個(gè)游戲中的大部分業(yè)務(wù)功能(1)游戲提示。打開(kāi)游戲后,在游戲界面中間顯示“UseKeyboradOrMousetoControlThePad”,游戲通關(guān)后,在有些界面中間顯示“YOUWIN”和“PressRToRestartGame”。如圖4-9本段代碼使用if語(yǔ)句,對(duì)游戲狀態(tài)判斷,初始時(shí)和游戲勝利時(shí)顯示不同的提示,使用setColour和drawString方法進(jìn)行文字的繪制圖4-9游戲界面的提示信息【代碼實(shí)現(xiàn)】publicvoidtips(){ graphics.setColor(Color.GRAY); if(tips==true){ graphics.drawString("Usemouseorkeyboardtocontrolthepad", width/2-200,height/2+40); } if(win==true){ graphics.setColor(Color.white); graphics.drawString("YOUWIN",width/2-40,height/2+40); graphics.drawString("PressRtoRestartGame",width/2-110, height/2+70); }(2)游戲界面的設(shè)置在游戲界面上顯示生命值、得分、等級(jí)的信息。如圖4-10本段代碼用到了GradientPaint類(lèi),可以控制顏色的漸變效果,其構(gòu)造函數(shù)GradientPaint(floatx1,floaty1,Colorcolor1,floatx2,floaty2,Colorcolor2)。圖4-10游戲界面生命、得分、等級(jí)【代碼實(shí)現(xiàn)】 //繪制生命值、得分、等級(jí)信息 graphics.drawString("生命值",0,37); graphics.drawString("得分"+Score,200,37); graphics.drawString("等級(jí)"+level,400,37); Graphics2Dgraphics2=(Graphics2D)graphics; for(inti=1;i<=4-fallTimes;i++){ GradientPaintwhiteToGray=new GradientPaint(i*40,20,Color.white,i*40+20,40,Color.gray); graphics2.setColor(pinkToRed); graphics.fillOval(i*40,20,20,20); }//失敗次數(shù)超過(guò)四次,提示游戲失敗。 if(fallTimes>=4){ graphics.setColor(Color.white); graphics.setFont(newFont("Arial",Font.BOLD,40)); graphics.drawString("YouLose!",width/2-50,height/2); graphics.setFont(newFont("Arial",Font.BOLD,20)); graphics.drawString("PressRtorestrart",width/2-70,height/2+40); } }(3)判斷游戲是否結(jié)束,計(jì)算剩余磚塊的數(shù)目,第一關(guān)時(shí),如果磚塊數(shù)目為0,游戲繼續(xù)進(jìn)行到第二關(guān),第二關(guān)時(shí),如果磚塊數(shù)目為0,游戲結(jié)束。 游戲得分的計(jì)算,每個(gè)磚塊計(jì)10分,得分為:(磚塊總數(shù)-當(dāng)前數(shù)量)*10【代碼實(shí)現(xiàn)】publicvoidisGameOver(){ intcountBlock=0; for(inti=0;i<=block.blockNumber;i++){ if(block.exist[i]==true){ countBlock++; score=(block.blockNumber-countBlock++)*10 } } if(countBlock==0){ if(level==2){ reStart=false; gameOver=true; ballMove=false; win=true; } if(level==1){ sound.loadSound("Sounds/level2.wav"); sound.playSound(); level=2; ballnum=3; ball=newBall[ballnum]; reSetGame(); } } fail(); }(4)鍵盤(pán)按鍵設(shè)置。按鍵控制擋板的移動(dòng),當(dāng)游戲正常進(jìn)行時(shí),按空格鍵使小球開(kāi)始移動(dòng),按下左右方向鍵,使擋板左右移動(dòng),按下空格鍵時(shí),小球開(kāi)始運(yùn)動(dòng),按下R鍵時(shí),游戲重新開(kāi)始?!敬a實(shí)現(xiàn)】publicvoidkeyPressed(KeyEvente){ //ASCII碼 intkeycode=e.getKeyCode(); if(keycode==KeyEvent.VK_CONTROL){ if(!gameOver) { Bulletbul=newBullet(this,pad,block); bulletList.add(bul); bul.isActive=true; bul.locX=pad.location.x; bul.locY=pad.location.y; } } if(keycode==KeyEvent.VK_RIGHT){ padMoveRight=true; } if(keycode==KeyEvent.VK_LEFT){ padMoveLeft=true; } if(keycode==KeyEvent.VK_SPACE){ for(inti=0;i<ballnum;i++){ ball[i].ballMove=true; } tips=false; } if(keycode==KeyEvent.VK_R){ level=1; reSetGame(); reStart=true; gameOver=false; fallTimes=0; ballNumber=2; } } publicvoidkeyReleased(KeyEvente){ intkeycode=e.getKeyCode(); if(keycode==KeyEvent.VK_RIGHT){ padMoveRight=false; } if(keycode==KeyEvent.VK_LEFT){ padMoveLeft=false; } }(5)鼠標(biāo)設(shè)置(控制擋板移動(dòng)),分別設(shè)置第一關(guān)和第二關(guān)的擋板移動(dòng)速度,設(shè)置擋板不能超過(guò)邊界當(dāng)擋板的坐標(biāo)超出左邊界時(shí),強(qiáng)制其坐標(biāo)為0,擋板超出右邊界時(shí),強(qiáng)制其坐標(biāo)為(界面寬度-擋板長(zhǎng)度)【代碼實(shí)現(xiàn)】publicvoidmouseMoved(MouseEventarg0){ if(!gameOver){ if(level==1){ pad.location.x=arg0.getX()-75; }else pad.location.x=arg0.getX()-60; if(pad.location.x+pad.size.x>=width){ pad.location.x=width-pad.size.x; } if(pad.location.x<=0){ pad.location.x=0; } } }4.3.3Pad類(lèi)Pad類(lèi)是擋板類(lèi),主要設(shè)計(jì)擋板的大小、顏色和移動(dòng)的速度與方向。擋板的畫(huà)法,確定擋板左上角的坐標(biāo)和擋板的高度與寬度,就可以畫(huà)出,初始位置設(shè)為游戲界面中間,距離下邊界30,界面寬為width,高為height,所以擋板初始位置為:((gamePanel.width-size.x)/2,(gamePanel.height-size.y-30))(1)各關(guān)卡擋板大小使用if語(yǔ)句實(shí)現(xiàn)不同關(guān)卡擋板的長(zhǎng)度。【代碼實(shí)現(xiàn)】Pad(GamePanelpanel){ this.gamePanel=panel; if(gamePanel.level==1) size=newPoint(140,20); if(gamePanel.level==2) size=newPoint(120,20); location=newPoint((gamePanel.width-size.x)/2,(gamePanel.height-size.y-30)); }(2)擋板移動(dòng)速度和方向 publicvoidupdate(){ if(gamePanel.padMoveRight){ if(location.x+size.x<gamePanel.width){ location.x+=8; } } if(gamePanel.padMoveLeft){ if(location.x>0){ location.x-=8; } } }(3)畫(huà)擋板, GradientPaint的作用是填充漸變顏色,此處填充上方灰色到下方黑色顏色逐漸加深的漸變【代碼實(shí)現(xiàn)】publicvoiddraw(Graphicsg){ Graphics2Dg2=(Graphics2D)g; GradientPaintyelloToRed=newGradientPaint(location.x,location.y,Color.yellow,location.x,location.y+size.y,Color.red); g2.setPaint(yelloToRed); g2.fillRoundRect(location.x,location.y,size.x,size.y,10,10); }4.3.4Block類(lèi)Blocl類(lèi)為磚塊類(lèi),功能主要是磚塊初始的排列和磚塊的寶物功能(1)磚塊位置初始化。設(shè)置磚塊位置和數(shù)量,第一關(guān)設(shè)置磚塊為四行八列。第二關(guān)設(shè)置磚塊數(shù)量為五行九列磚塊大小和游戲界面大小是固定的,所以磚塊的間距要設(shè)計(jì)好,必須對(duì)每一個(gè)磚塊的具體位置進(jìn)行計(jì)算。磚塊是矩形的,確定磚塊左上角坐標(biāo)與長(zhǎng)寬,就能確定磚塊位置。定義數(shù)組存放磚塊的左上角坐標(biāo),再定義一個(gè)Point型變量存放磚塊的長(zhǎng)寬?!敬a實(shí)現(xiàn)】publicBlock(GamePanelpanel){ this.gamePanel=panel; //設(shè)置磚塊數(shù)量和排列 if(gamePanel.level==1){ blockNumber=32; allocate=newPoint(8,4); } if(gamePanel.level==2){ blockNumber=54; allocate=newPoint(9,5); } size=newPoint(50,20); location=newPoint[blockNumber]; //設(shè)置磚塊的位置 for(inti=0;i<allocate.y;i++) for(intj=0;j<allocate.x;j++){ location[i*allocate.x+j]=newPoint((gamePanel.width/8-size.x)/2+j*(gamePanel.width/size.x),(i+1)*30+50); } exist=newboolean[blockNumber]; for(booleani:exist){ i=true; } }//publicBlock(GamePanelpanel){ this.gamePanel=panel; if(gamePanel.level==1){ blockNumber=32; allocate=newPoint(8,4); } if(gamePanel.level==2){ blockNumber=54; allocate=newPoint(9,5); } size=newPoint(50,20); location=newPoint[blockNumber]; for(inti=0;i<allocate.y;i++) for(intj=0;j<allocate.x;j++){ location[i*allocate.x+j]=newPoint((gamePanel.width/8-size.x)/2+j*(gamePanel.width/size.x),(i+1)*30+50); } exist=newboolean[blockNumber]; for(booleani:exist){ i=true; } } publicvoiddraw(Graphicsgraphics)(2)寶物設(shè)置,設(shè)置具有不同功能的磚塊,小球碰到這些磚塊會(huì)得到不同的效果,效果有小球速度加快和減慢,擋板長(zhǎng)度增加和減少,寶物設(shè)置在固定的位置 【代碼實(shí)現(xiàn)】publicvoiddraw(Graphicsg){ Imageimage=gameP.setImage("Images/block.png"); for(inti=0;i<num;i++){ if(exist[i]==true){ g.drawImage(image,location[i].x,location[i].y,size.x, size.y,null); if(gameP.level==1){ if(i==num-2){//變長(zhǎng) g.setColor(newColor(250,0,0)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } if(i==num-15){//加速 g.setColor(newColor(0,0,250)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } if(i==num/2-5){//變短 g.setColor(newColor(0,250,0)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } } if(gameP.level==2){ if(i==num-12||i==45||i==10){//紅色變長(zhǎng) g.setColor(newColor(250,0,0)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } if(i==15||i==44){//藍(lán)色變快 g.setColor(newColor(0,0,250)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } if(i==28||i==26){//粉色變慢 g.setColor(Color.pink); g.fillRect(location[i].x,location[i].y,size.x,size.y); } if(i==40){//綠色變短 g.setColor(newColor(0,250,0)); g.fillRect(location[i].x,location[i].y,size.x,size.y); } } } } }4.3.5Bullet類(lèi)Bullet類(lèi)為子彈類(lèi),增加子彈功能,從擋板的兩端發(fā)射子彈,子彈也可以消除磚塊,屬于一個(gè)輔助功能,增加游戲樂(lè)趣(1)子彈消除磚塊的實(shí)現(xiàn) 把子彈定義為數(shù)組。 判斷子彈與磚塊的碰撞:因?yàn)樽訌検茄刂鳼軸豎直運(yùn)動(dòng),所以只要子彈在磚塊左右兩端之間且與磚塊下邊接觸,即可判斷碰到當(dāng)前磚塊,如圖4-11圖4-11子彈與磚塊碰撞判斷 子彈與磚塊碰撞后會(huì)反彈buldy=-buldy,擋板碰到反彈回來(lái)的子彈會(huì)縮短長(zhǎng)度buldy=-buldy【代碼實(shí)現(xiàn)】publicvoidhit(){ for(intj=0;j<blk.num;j++) if(blk.exist[j]==true){ if(locY<blk.location[j].y+blk.size.y&&locX>blk.location[j].x&&locX<blk.location[j].x+blk.size.x) { blk.exist[j]=false; buldy=-buldy; break; } }//子彈超出邊界停止運(yùn)動(dòng) if(locY>gameP.heigth||locY<0){ isActive=false;} //擋板碰到小球反彈回來(lái)的子彈時(shí),擋板長(zhǎng)度減少 if(locY>mypad.location.y&&locX>mypad.location.x&&locX<mypad.location.x+mypad.size.x) { pad.size.x--; }4.3.6Ball類(lèi)Ball類(lèi)是小球類(lèi),主要實(shí)現(xiàn)小球的顏色,大小,速度,位置,小球碰撞和碰到寶物磚塊后的變化(1)小球速度,第一關(guān)速度設(shè)置為3,第二關(guān)設(shè)置為4【代碼實(shí)現(xiàn)】if(gp.level==1){ dx=3; dy=-3; }elseif(gp.level==2){ dx=4; dy=-4; }}(2)小球的位置,小球移動(dòng)時(shí)小球位置為(x,y),第一關(guān)時(shí)小球有兩個(gè),在擋板上的初始位置為擋板左端三分之一處和右端三分之一處,第二關(guān)時(shí)又增加了一個(gè)在擋板正中間的小球,如圖4-12。圖4-12小球位置設(shè)置【代碼實(shí)現(xiàn)】if(ballMove){ //if(gameP.ballMove){ location.x+=dx; location.y+=dy; wallBounced(); blockBounced(); padBounced(); }else{ if(lor==0) location=newPoint(pd.location.x+pd.size.x*1/3-20, pd.location.y-pd.size.y); elseif(lor==1) location=newPoint(pd.location.x +(pd.size.x*2/3+20-diameter),pd.location.y -pd.size.y); else location=newPoint(pd.location.x+pd.size.x*2/5+3,pd.location.y-pd.size.y); } }(3)小球與磚塊碰撞檢測(cè),判斷小球是否碰到了磚塊,設(shè)置一個(gè)函數(shù)Bounce(),它用來(lái)判斷小球是否碰到磚塊(或擋板),其中bk_location存放磚塊左上角坐標(biāo),bk_size存放磚塊的大小當(dāng)傳入的第二個(gè)Point型參數(shù)等于十分之一磚塊長(zhǎng)度和磚塊寬度時(shí),小球碰到磚塊左邊界;當(dāng)傳入的第一個(gè)Point型參數(shù)的x坐標(biāo)加上十分之一磚塊長(zhǎng)度,傳入的第二個(gè)Point參數(shù)的x坐標(biāo)是磚塊長(zhǎng)度的十分之八時(shí),小球碰到磚塊上方邊界和下方邊界;當(dāng)傳入的第一個(gè)Point型參數(shù)的x坐標(biāo)是磚塊左上角坐標(biāo)加上十分之八個(gè)磚塊的長(zhǎng)度,第二個(gè)Point型參數(shù)的x坐標(biāo)是磚塊的十分之一時(shí),小球碰到磚塊右邊界。當(dāng)小球碰到磚塊左邊界或右邊界時(shí),dx=-dx;當(dāng)小球碰到磚塊上邊界或下邊界時(shí),dy=-dy。【代碼實(shí)現(xiàn)】publicbooleanBounce(Pointbk_location,Pointbk_size){ if((location.x>bk_location.x–diameter) &&(location.x<bk_location.x+bk_size.x) &&(location.y>bk_location.y–diameter) &&(location.y<bk_location.y+bk_size.y)){ returntrue; }else{ returnfalse; } }publicvoidblockBounced(){ Pointlocal1,local2,local3,size1,size2,size3; for(inti=0;i<block.num;i++){ if(block.exist[i]==false) continue; local1=newPoint(block.location[i].x,block.location[i].y); size1=newPoint(block.size.x*1/10,block.size.y); local2=newPoint(block.location[i].x+block.size.x*1/10, block.location[i].y); size2=newPoint(block.size.x*8/10,block.size.y); local3=newPoint(block.location[i].x+block.size.x*9/10, block.location[i].y); size3=newPoint(block.size.x*1/10,block.size.y);(4)小球與墻壁碰撞檢測(cè)小球X坐標(biāo)等于左X邊界坐標(biāo)時(shí),小球與左邊界碰撞,Y軸方向速度不變,X軸方向速度取反,同理,小球與右邊界碰撞,也是Y軸方向速度不變,X軸方向速度取反,當(dāng)小球Y坐標(biāo)等于0時(shí),與上邊界碰撞,小球X軸方向速度不變,Y軸方向速度取反,如圖4-13。圖4-13小球與墻壁碰撞處理【代碼實(shí)現(xiàn)】publicvoidwallBounced(){ if((location.x>gameP.width-diameter)||(location.x<0)){ dx=-dx; padCanBounce=true; } if(location.y<0){ dy=-dy; padCanBounce=true; } if(location.y>gameP.heigth){ //當(dāng)小球超出下邊界時(shí),小球失去生命值 gameP.fallTimes=gameP.fallTimes+1; System.out.println("fallTimes+1"); ballMove=false; padCanBounce=true; } }4.3.7SoundPlayer類(lèi)SoundPlayer類(lèi)為聲音配置類(lèi),主要是導(dǎo)入添加聲音【代碼實(shí)現(xiàn)】publicvoidloadSound(StringfileName){ file=newFile(fileName); try{ stream=AudioSystem.getAudioInputStream(file); }catch(UnsupportedAudioFileExceptionex){ }catch(IOExceptionex){ } format=stream.getFormat(); } publicvoidplaySound(){ info=newDataLine.Info(Clip.class,format); try{ clip=(Clip)AudioSystem.getLine(info); }catch(LineUnavailableExceptionex){ } try{ clip.open(stream); }catch(LineUnavailableExceptionex){ }catch(IOExceptionex){ } clip.start(); }
第五章游戲的運(yùn)行與測(cè)試軟件工程理論要求任何程序開(kāi)發(fā)都不能離開(kāi)軟件測(cè)試,游戲項(xiàng)目的開(kāi)發(fā)當(dāng)然也是如此。要想開(kāi)發(fā)的游戲被玩家接受與喜愛(ài),最基本的是游戲能正確合理運(yùn)行,所以,游戲的測(cè)試就變得非常重要了。5.1測(cè)試的目的和原則本次測(cè)試要找出游戲的各種錯(cuò)誤、缺陷,發(fā)現(xiàn)游戲中不合理的地方,進(jìn)一步完善游戲內(nèi)容,增強(qiáng)用戶(hù)的體驗(yàn),確保游戲正常運(yùn)行。根據(jù)測(cè)試目的,本測(cè)試的測(cè)試原則如下:(1)測(cè)試用例的設(shè)計(jì),要同時(shí)包含合理的和不合理的條件輸入。(2)測(cè)試用例要有輸入數(shù)據(jù)與預(yù)期輸出的結(jié)果兩部分。(3)測(cè)試計(jì)劃必須嚴(yán)格執(zhí)行。(4)對(duì)測(cè)試結(jié)果檢查和記錄。(5)多人測(cè)試,增強(qiáng)測(cè)試的全面性。(6)為了后續(xù)游戲完善的方面,應(yīng)該將測(cè)試材料歸檔,包括測(cè)試的計(jì)劃、用例、錯(cuò)誤統(tǒng)計(jì)與最終分析結(jié)果。5.2游戲界面顯示測(cè)試圖5-1游戲初始界面圖5-2小球生命值顯示(1)游戲初始界面顯示輸入:進(jìn)入游戲輸出:游戲初始界面,如圖5-1結(jié)果:正常(2)小球生命值顯示初始狀態(tài):顯示四條生命輸入:擋板沒(méi)有擋住小球輸出:生命值顯示減少,如圖5-2結(jié)果:正常(3)游戲等級(jí)升級(jí)顯示初始狀態(tài):等級(jí)顯示為1輸入:清除第一關(guān)所有磚塊輸出:等級(jí)顯示為2,如圖5-4結(jié)果:正常(4)游戲升級(jí)后磚塊的顯示輸入:清空第一關(guān)磚塊進(jìn)入第二關(guān)輸出:如圖5-4結(jié)果:正常(5)游戲通關(guān)后界面顯示輸入:通過(guò)所有關(guān)卡輸出:“YouWin,PressRToRestart”,如圖5-3結(jié)果:正常圖5-3游戲通關(guān)顯示圖5-4第二關(guān)界面5.3擋板移動(dòng)控制(1)按鍵控制擋板輸入:分別按下“左”、“右”按鍵輸出:擋板按照游戲規(guī)則移動(dòng),擋板左側(cè)正常,右側(cè)超出游戲窗口。如圖5-6結(jié)果:異常。異常原因:擋板長(zhǎng)度沒(méi)有計(jì)算如圖5-5異常處理:if(location.x+size.x<gameP.width){ location.x+=8;} 圖5-5擋板異常圖 圖5-6擋板異常(2)鼠標(biāo)控制擋板輸入:進(jìn)入游戲后左右移動(dòng)鼠標(biāo)輸出:擋板沿著橫坐標(biāo)左右移動(dòng)結(jié)果:正常。5.4小球運(yùn)動(dòng)檢測(cè)(1)小球發(fā)射檢測(cè)輸入:進(jìn)入游戲后按下“空格”輸出:小球開(kāi)始運(yùn)動(dòng)結(jié)果:正常輸入:進(jìn)入游戲后點(diǎn)擊鼠標(biāo)“左鍵”輸出:小球開(kāi)始
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 墩身安全施工方案
- 永年冷庫(kù)施工方案
- 基礎(chǔ)回填土施工方案
- 化工廠施工方案
- 二零二五年度環(huán)??萍紗挝唤獬齽趧?dòng)合同及綠色技術(shù)轉(zhuǎn)移協(xié)議
- 2025年度超市超市商品防損員勞動(dòng)合同范本
- 二零二五年度蘇州市全日制勞動(dòng)合同員工休息與休假規(guī)定合同
- 二零二五年度農(nóng)村土地占用與農(nóng)村文化傳承合同協(xié)議
- 二零二五年度婚姻忠誠(chéng)保證協(xié)議:男方出軌責(zé)任書(shū)
- 二零二五年度個(gè)人車(chē)輛抵押汽車(chē)貸款合同續(xù)簽合同
- 一年級(jí)下冊(cè)《道德與法治》教案
- 馬克思主義理論前沿匯總
- 高中數(shù)學(xué)圓錐曲線知識(shí)點(diǎn)總結(jié)
- 高中英語(yǔ)北師大版全七冊(cè)單詞表
- 【幼兒園園本教研】幼兒表征的教師一對(duì)一傾聽(tīng)策略
- 人教版新教材高一上學(xué)期期末考試數(shù)學(xué)試卷及答案(共五套)
- 采血知情同意書(shū)模板
- 私人房屋抵押借條
- Mysql 8.0 OCP 1Z0-908 CN-total認(rèn)證備考題庫(kù)(含答案)
- 手拉葫蘆安全使用培訓(xùn)課件
- 教科版二年級(jí)科學(xué)下冊(cè) (磁鐵能吸引什么) 課件
評(píng)論
0/150
提交評(píng)論