版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
成績(jī)數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院09級(jí)計(jì)算機(jī)應(yīng)用專業(yè)畢業(yè)設(shè)計(jì)題目:J2ME手機(jī)游戲——SuDoKu數(shù)獨(dú)年級(jí)專業(yè):09級(jí)計(jì)算機(jī)應(yīng)用(2)班學(xué)號(hào):20095938姓名:謝平日期:2011年12月13日摘要J2ME(Java2MicroEdition)是近年來隨著各種不同設(shè)備,尤其是移動(dòng)通信設(shè)備的飛速發(fā)展而誕生的一項(xiàng)新的開發(fā)技術(shù)。它定位在消費(fèi)性電子產(chǎn)品的應(yīng)用上,對(duì)設(shè)備的智能化、多樣化,提供了革命性的解決方案,并因其“WriteOnce,runanywhere”的Java特性而提高開發(fā)的效率。隨著手機(jī)的日益普及、Java功能在移動(dòng)設(shè)備上的實(shí)現(xiàn),Java應(yīng)用程序產(chǎn)生的手機(jī)增值服務(wù)逐漸體現(xiàn)出其影響力,對(duì)豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。特別是手機(jī)性能的逐漸增強(qiáng),手機(jī)作為一個(gè)游戲平臺(tái)越來越成熟了。本論文著眼于J2ME技術(shù)的應(yīng)用,開發(fā)一款可用的手機(jī)游戲程序——數(shù)獨(dú)。本文在介紹J2ME的相關(guān)技術(shù)的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了數(shù)獨(dú)游戲。關(guān)鍵詞:J2ME、手機(jī)游戲、Java、數(shù)獨(dú)AbstractJ2MEisakindoffastdevelopingtechnologyimplementedonvariousdevicesespeciallymobilecommunicationequipments.Itfocusesonapplicationforconsumptiveelectronicproducts,providingrevolutionarysolutiontotheintelligentizationanddiversificationoftheequipment.Itimprovetheefficiencyofthedevelopmentprocessthankstoits“WriteOnce,runanywhere”nature.Whenmobilephoneisgettingevermorepopularnowadays,withtheimplementationofJavatechnologyonmobileequipment,incrementofcapitaloncommunicationserviceexhibitsitsforceonpeople’severydaylife,providingthemeverfastinformationjustinhand.Mobilephonewhosecapabilityisgreaterismoreandmorematureforgame.ThisdissertationfocusesonimplementationofJ2MEtechnologyandhasdevelopedacommercialgamesuiterunonmobilephones—sudoku.ThisarticleinintroducedthatJ2MEincorrelationtechnique'sfoundation,designedandhasrealizedofSodukugame.Keywords:J2ME;mobilegame;java;sudoku目錄80451.引言 5141592.緒論 5221372.1手機(jī)軟件現(xiàn)狀 6138812.2手機(jī)游戲應(yīng)具有的特征 6189902.3本游戲背景介紹 7296613.開發(fā)環(huán)境及相關(guān)技術(shù)的介紹 721993.1開發(fā)環(huán)境 735273.2J2ME簡(jiǎn)介 725753.3MIDletSuites簡(jiǎn)介 8122513.4MIDP類庫(kù) 8296963.5.WTK2.5簡(jiǎn)介 10139914.數(shù)獨(dú)游戲的策劃和設(shè)計(jì) 11292764.1.生成數(shù)獨(dú)題目的方法 11249454.2數(shù)獨(dú)題目的變換 13261204.3.謎題數(shù)據(jù)的制作 13310884.4.利用回溯法求解數(shù)獨(dú) 14224314.5.游戲的類結(jié)構(gòu) 15164014.6.用戶界面流程 16228255.主要模塊設(shè)計(jì) 18174755.1.主類SuDoKuMIDlet類 1858275.1.1.閃屏界面 18325235.1.2.游戲菜單列表 1954485.1.3.繼續(xù)游戲選項(xiàng) 19230405.1.4.填充完成后提示界面 20177995.3游戲菜單MenuList類 23190495.3.1.MenuList類得構(gòu)造函數(shù) 23162075.3.2.游戲當(dāng)前狀態(tài) 23322965.3.3.菜單事件處理 24307275.4.總結(jié) 3523784參考文獻(xiàn): 3624475致謝: 引言雖然J2ME以開發(fā)交互式業(yè)務(wù)為主,屬于戰(zhàn)略性產(chǎn)品,備受產(chǎn)業(yè)連的重視,但是由于自從NOKIA的貪食蛇掀起手機(jī)游戲風(fēng)潮之后,現(xiàn)在已經(jīng)很難再想像一部時(shí)尚的手機(jī)里頭沒有游戲。隨著手機(jī)從單色屏到灰度屏到彩屏,從蜂鳴器到揚(yáng)聲器,隨著手機(jī)存儲(chǔ)能力的加大和處理能力的加強(qiáng),手機(jī)已經(jīng)成為合情合理的游戲平臺(tái),越來越多的手機(jī)廠商和專業(yè)的游戲公司開始關(guān)注手機(jī)游戲這個(gè)潛在的市場(chǎng)?;贘2ME的通用解決方案,這種方案不僅僅可以提供高質(zhì)量的游戲,而且可以提供全方位的軟件服務(wù)。正是由于無線業(yè)務(wù)的蓬勃發(fā)展,和越來越多的無線廠商支持J2ME技術(shù),J2ME也將擁有一個(gè)更廣闊的發(fā)展空間。在這樣的背景下,本文分析了數(shù)獨(dú)游戲的基本原理和關(guān)鍵技術(shù),利用WTK實(shí)現(xiàn)了數(shù)獨(dú)游戲的部分模塊。緒論2.1手機(jī)軟件現(xiàn)狀在信息社會(huì)中,手機(jī)及其他無線設(shè)備越來越多的走進(jìn)普通百姓的工作和生活,隨著信息網(wǎng)絡(luò)化的不斷進(jìn)展,手機(jī)及其他無線設(shè)備上網(wǎng)絡(luò)勢(shì)在必行。但是傳統(tǒng)手機(jī)存在以下弊端:1.傳統(tǒng)手機(jī)出廠時(shí)均由硬件廠商固化程序,程序不能增加、刪除,有了錯(cuò)誤也不能更新、修改,若要增加新功能必須另?yè)Q一部手機(jī)。2.傳統(tǒng)手機(jī)訪問互聯(lián)網(wǎng)是通過WAP(WirelessApplicationProtocal),所有網(wǎng)絡(luò)資源必須接通網(wǎng)絡(luò)才能在線訪問,非常耗時(shí)、費(fèi)用亦很高。而Java技術(shù)在無線應(yīng)用方面的優(yōu)勢(shì)非常明顯:1.應(yīng)用程序可按需下載,而不是購(gòu)買由硬件商提供的套件,可升級(jí)空間大。2.Java技術(shù)提供了一個(gè)類庫(kù),它使的應(yīng)用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面(GUI).3.Java技術(shù)使網(wǎng)絡(luò)帶寬的應(yīng)用更為有效,因?yàn)閼?yīng)用程序可以下載到器件上,并在本地運(yùn)行,僅僅是在連接到服務(wù)器時(shí)才會(huì)占用網(wǎng)絡(luò)帶寬。基于以上分析,Java手機(jī)將是未來手機(jī)的發(fā)展方向,是業(yè)界的熱點(diǎn)。2.2手機(jī)游戲應(yīng)具有的特征一個(gè)手機(jī)游戲應(yīng)該具有以下特征:易于學(xué)習(xí):既然手機(jī)游戲面向的是普通消費(fèi)者而不是計(jì)算機(jī)專家,那么他們不可能深入的學(xué)習(xí)游戲技巧,消費(fèi)者不會(huì)花幾個(gè)小時(shí)去研究一個(gè)3元的手動(dòng)操作的游戲.保持游戲的簡(jiǎn)單是最基本的要求??芍袛嘈?多任務(wù)處理是手機(jī)生活方式的基本特征。手機(jī)用戶常常在任務(wù)(如等一個(gè)電子郵件或者等車)之間有一小段時(shí)間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使用的是同一個(gè)設(shè)備。所以一個(gè)好的手機(jī)游戲應(yīng)該提供短時(shí)間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換?;谟嗛啠菏謾C(jī)游戲的盈利成功取決于他們巨大的使用量,一開始開發(fā)和設(shè)計(jì)每個(gè)游戲都是昂貴的,如果一個(gè)手機(jī)游戲開發(fā)者要贏利的話,重要的是:同一個(gè)游戲引擎,多個(gè)標(biāo)題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法。豐富的社會(huì)交互:不管一個(gè)游戲設(shè)計(jì)得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會(huì)厭煩這個(gè)游戲。對(duì)于一個(gè)基于訂閱的游戲,重要的是與別的玩家合作以增強(qiáng)所玩游戲的智力和隨機(jī)性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會(huì)交互的游戲證明是成功的。利用手機(jī)技術(shù)的優(yōu)點(diǎn):巨額的手機(jī)技術(shù)研發(fā)費(fèi)用都花在提高設(shè)備和網(wǎng)絡(luò)的可用性和可靠性上面。因此,手機(jī)設(shè)備硬件和網(wǎng)絡(luò)協(xié)議與桌面/控制臺(tái)世界(如全球定位系統(tǒng)(GPS)擴(kuò)展、條形碼掃描儀、和短消息服務(wù)(SMS)/多媒體信息服務(wù)(MMS)通訊)有著非常大的差別。好的手機(jī)游戲應(yīng)該利用那些更新的設(shè)備特征和網(wǎng)絡(luò)基礎(chǔ)設(shè)備的優(yōu)點(diǎn)。2.3本游戲背景介紹相傳數(shù)獨(dú)源起于拉丁方陣(LatinSquare),1970年代在美國(guó)發(fā)展,改名為數(shù)字拼圖(NumberPlace),之后流傳至日本并發(fā)揚(yáng)光大,以數(shù)字智力游戲智力拼圖游戲發(fā)表。在1984年一本游戲雜志《パズル通信ニコリ》正式把它命名為數(shù)獨(dú),意思是“在每一格只有一個(gè)數(shù)字”。拼圖是九宮格(即3格寬×3格高)的正方形狀,每一格又細(xì)分為一個(gè)九宮格。在每一個(gè)小九宮格中,分別填上1至9的數(shù)字,讓整個(gè)大九宮格每一列、每一行的數(shù)字都不重復(fù)。數(shù)獨(dú)的玩法邏輯簡(jiǎn)單,數(shù)字排列方式千變?nèi)f化,不少教育者認(rèn)為數(shù)獨(dú)是鍛煉腦筋的好方法。開發(fā)環(huán)境及相關(guān)技術(shù)的介紹3.1開發(fā)環(huán)境操作系統(tǒng):MicrosoftWindowsXP程序語(yǔ)言:Java2開發(fā)包:Java(TM)2StandardEdition(5.0)SunMicro.J2MEWirelessToolKitJ2ME簡(jiǎn)介Sun公司將J2ME定義為“一種以廣泛的消費(fèi)性產(chǎn)品為目標(biāo),高度優(yōu)化的java運(yùn)行時(shí)環(huán)境”。J2ME是為了那些使用有限能源,有限網(wǎng)絡(luò)連接(正常是無線連接),以及有限圖形用戶界面的設(shè)備而開發(fā)的。J2ME不只是一個(gè)單獨(dú)的技術(shù)規(guī)范,而是一系列技術(shù)規(guī)范的總稱。這些規(guī)范定義了java技術(shù)在資源限制的設(shè)備中的表現(xiàn)形式,而且新規(guī)范的不斷制定當(dāng)中,并且這些規(guī)范的制定是完全向公眾開放的。目前所說的手機(jī)游戲其實(shí)是其中規(guī)范的一種,即MIDP(移動(dòng)信息設(shè)備規(guī)范),該規(guī)范應(yīng)用最為普遍,因此習(xí)慣上也被人們籠統(tǒng)地稱之為J2ME技術(shù)。J2ME主要應(yīng)用于手機(jī)等小型嵌入式設(shè)備,這些設(shè)備由不同的廠商設(shè)計(jì)生產(chǎn),功用千差萬(wàn)別。J2ME在應(yīng)用于這些設(shè)備的同時(shí)也保留了java的傳統(tǒng)特性,即任何時(shí)間和任何地點(diǎn)的代碼有可移植性,部署靈活性,安全的網(wǎng)絡(luò)傳輸性,以及代碼穩(wěn)定性。3.3MIDletSuites簡(jiǎn)介在制定MIDP規(guī)范過程中,最重要的一件事情就是定義一個(gè)MIDP應(yīng)用程序的組成。換句話說,它應(yīng)當(dāng)回答任何開發(fā)人員都可能問的問題,比如,如何將程序正確下載到設(shè)備中?程序的入口在哪?設(shè)備如何識(shí)別該MIDP應(yīng)用程序是自己想要的?同Applet類似,一個(gè)MIDP程序被稱為“MIDlet”,MIDlet應(yīng)用的主類需要從一個(gè)特殊的類(javax.microedition.midlet.MIDlet)中繼承,并提供共用的默認(rèn)的構(gòu)造函數(shù)。一個(gè)或多個(gè)MIDlet打包在一起叫做MIDletSuite,其表現(xiàn)形式一個(gè)以“.jar”為后綴名的文件,這個(gè)JAR文件非常重要,它所包含的主要信息如下:包含MIDlet運(yùn)行所需要的所有類,與Applet不同,MIDlet不運(yùn)行在運(yùn)行時(shí)下載其他類,而只運(yùn)行在同一個(gè)MIDlet中的類。JAR的Mainfest是文本文件,用于描述JAR文件的內(nèi)容,定義了在MIDlet中的重要信息,如名稱,主類,圖標(biāo)等。其他資源文件,如使用的圖像,聲音文件。和JavaApplet類似,MIDlet應(yīng)用程序在移動(dòng)設(shè)備上運(yùn)行時(shí)具有應(yīng)用程序生命周期,顯而易見,MIDlet可能處于以下3種狀態(tài):暫停,激活和終止?fàn)顟B(tài)。各種狀態(tài)之間的轉(zhuǎn)換規(guī)則如圖2-1所示。3.4MIDP類庫(kù)MIDP類庫(kù)建立在CLDC類庫(kù)基礎(chǔ)之上,因此許多類庫(kù)都來自J2SE。為了實(shí)現(xiàn)特定功能,MIDP增加了一些新的類庫(kù),這些類庫(kù)描述如表2-1所示。核心類庫(kù)類庫(kù)描述java.io通過數(shù)據(jù)流提供系統(tǒng)的輸入/輸出java.langMIDP語(yǔ)言包,在CLDC中java.lang包的基礎(chǔ)上增加了類(來自J2SE)java.lang.IllegalStateException。當(dāng)有非法的轉(zhuǎn)換請(qǐng)求時(shí)拋出這個(gè)異常,比如,在一個(gè)TimerTask安排中調(diào)用或者在用戶界面組件容器中請(qǐng)求時(shí)java.utilMIDP工具欄,在CLDC中java.util包的基礎(chǔ)之上增加了以下類(來自J2SE):?java.util.Timer?java.util.TimerTaskTimer用于安排一個(gè)后臺(tái)線程使它在以后執(zhí)行,TimeTask通過使用Timer安排一個(gè)單次執(zhí)行的任務(wù),或者以一定間隔重復(fù)執(zhí)行的任務(wù)應(yīng)用程序生命周期javax.micorediton.midletMidlet包定義了MIDP應(yīng)用程序,以及應(yīng)用程序和它所運(yùn)行于環(huán)境之間的交互用戶界面Javax.microedition.lcduijavax.microedition.lcdui.game為MIDP應(yīng)用程序提供用戶界面APE為MIDP應(yīng)用程序提供游戲開發(fā)的高級(jí)API(MIDP2.0新增)持久存儲(chǔ)javax.mircroedition.rms這個(gè)包用來為MIDlet提供持久存儲(chǔ)的機(jī)制,應(yīng)用程序可以存儲(chǔ)數(shù)據(jù),在以后需要的時(shí)候獲取這些數(shù)據(jù)網(wǎng)絡(luò)javax.mircroedition.ioMIDP提供了基于CLDC通用連接框架的網(wǎng)絡(luò)支持,在CLDC這個(gè)包的基礎(chǔ)之上,增加了類javax.microedition.io.HttpConnection,這個(gè)類用于建立HTTP連接在MIDP2.0中除了支持HTTP連接外,還支持HTTPS,報(bào)文,Socket通信及串口通信。另外,MIDP2.0還支持服務(wù)器Push體系架構(gòu)公開密鑰javax.microedition.pki提供用于鑒別安全網(wǎng)絡(luò)信息的數(shù)字認(rèn)證(MIDP2.0新增)聲音媒體Javax.microedition.mediajavax.microedition.media.control該包為MIDP應(yīng)用程序提供音,視頻等多媒體功能,該包遵循JSR-135規(guī)范(MIDP2.0新增)該包為播放器提供了一些特定的控制功能(MIDP2.0新增)表2-1MIDP中的類庫(kù)描述3.5.WTK2.5簡(jiǎn)介WTK(WirelessToolKit)是Sun公司針對(duì)J2ME推出的用于手機(jī)和Palm等移動(dòng)設(shè)備的開發(fā)包,是除手機(jī)廠商的專用開發(fā)包外唯一的手機(jī)模擬器開發(fā)包。它通用性高,開發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運(yùn)行模擬器的最基本組件,是其他IDE需集成采用的必備元素。J2MEWTK包含了為能夠支持MIDP設(shè)備開發(fā)應(yīng)用程序所需要的全部工具。這些工具包含字節(jié)碼與校驗(yàn)器(byte-codepreverifier),KToolbar,自帶的模擬器,以及其他一些用來優(yōu)化代碼和監(jiān)視程序的工具。在安裝WTK2.5以前,需要安裝JDK5(1.5)或者更高版本,安裝完成需要添加環(huán)境變量:JAVA_HOME:C:\ProgramFiles\Java\jdk1.5.0_04classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\htmlconverter.jar在原來的path變量前添加%JAVA_HOME%\bin;WTK2.5新建的項(xiàng)目會(huì)產(chǎn)生源程序,資源和類庫(kù)文件,其結(jié)構(gòu)組成如表2-2所示。目錄描述src\包含所有源程序文件res\包含所有的資源文件,如圖片,聲音,3D數(shù)據(jù)文件bin\包含JAR,JAD和未打包的Manifest(創(chuàng)建項(xiàng)目自動(dòng)生成)lib\包含外部類庫(kù)文件(JAR或者ZIP文件)tmplib\存放臨時(shí)外部類庫(kù)(臨時(shí)目錄,編譯后生成)cmpclasses\使用JDK編譯后的類文件(臨時(shí)目錄,編譯后生成)classes\使用preverify預(yù)驗(yàn)證后的類文件(臨時(shí)目錄,編譯后生成)表2-2項(xiàng)目文件的組織數(shù)獨(dú)游戲的策劃和設(shè)計(jì)4.1.生成數(shù)獨(dú)題目的方法到底有多少個(gè)9×9的拉丁方陣呢?答案552475149615689284253122560個(gè)。但數(shù)獨(dú)的規(guī)則除了每行每列都是1到9的數(shù)字外,數(shù)獨(dú)的9個(gè)小宮格也都要是1到9不同的數(shù)字,所以要減少很多。直到2005年底,數(shù)學(xué)家貝米耳與羅斯坦才算出一共有6670903752021072936960種可能的數(shù)獨(dú)謎題。由于同一個(gè)數(shù)獨(dú)可以變形,如列變換,行變換,數(shù)字代碼變換(比如1和5交換,2和8,3和4),重復(fù)前面幾次之后,就分不清是來自同一個(gè)數(shù)獨(dú)了,因此,如何產(chǎn)生一道數(shù)獨(dú)題目呢?產(chǎn)生數(shù)獨(dú)題目的方法是從答案反推題目。為了便于理解,可以先從2×2的4個(gè)四宮格(共16個(gè)宮格)開始思考,推論。先給出一個(gè)2×2個(gè)四宮格的數(shù)獨(dú)解,為了方便解說,我把方陣內(nèi)的數(shù)字位置分區(qū)塊為A區(qū)(黃色),B區(qū)(綠色),C區(qū)(藍(lán)色),D區(qū)(紅色),如圖3-1所示。推導(dǎo)數(shù)獨(dú)題目的方法如下:1.任意選取一個(gè)方格,并將此空格內(nèi)的數(shù)字挖掉。例如將(3,3)位置的數(shù)字4挖掉,如圖3-2所示。2.觀察B區(qū)得四宮格可以發(fā)現(xiàn),不管(2,2)位置的數(shù)字4是否存在,為確定(4,1)位置挖掉的數(shù)字4,(3,1)位置的數(shù)字2必須存在,如圖3-3所示。3.觀察A區(qū)得四宮格,由于(3,1)位置的數(shù)字2已存在,為了要找到(1,2)位置的數(shù)字2,則(2,2)位置的數(shù)字4必須存在,如圖3-4所示。4.觀察C區(qū)得四宮格,由于(2,2)位置的數(shù)字4已存在,為了要找到(1,4)位置的數(shù)字4,則(1,3)位置的數(shù)字3必須存在,如圖3-5所示。5.觀察D區(qū)得四宮格,由于(1,3)位置的數(shù)字3已存在,為了要找到(3,4)位置的數(shù)字3,則(4,4)位置的數(shù)字1必須存在,如圖3-6所示。4.2數(shù)獨(dú)題目的變換經(jīng)過以上5個(gè)步驟可以發(fā)現(xiàn):只需要提供4個(gè)位置的數(shù)字就可以得出一個(gè)唯一解的數(shù)獨(dú)謎題,如圖3-7所示。另外通過以下形式的變換方式,仍然可以得出唯一解的數(shù)獨(dú)謎題。行列變換:將同一四宮格內(nèi)的行列變換,例如,將第1,2列互掉;第3,4列互掉;第1,2行互掉;第3,4列互掉,如圖3-8和圖3-9所示。標(biāo)準(zhǔn)的3×3個(gè)九宮格的數(shù)獨(dú)謎題的推出原理與此相同,但過程復(fù)雜,在此不再贅述。數(shù)字替換:例如數(shù)字1換4;數(shù)字2換3;如圖3-10所示。4.3.謎題數(shù)據(jù)的制作數(shù)獨(dú)游戲使用到了81個(gè)宮格,因此首先聯(lián)想到使用數(shù)組保存謎題數(shù)據(jù)。使用數(shù)組保存數(shù)據(jù)更加直觀,但是如果用非常多的謎題,就會(huì)造成代碼量龐大而且冗余。因此,使用字符串的格式來保存九宮格的數(shù)據(jù)。然而,新的問題出現(xiàn)了,通過前面的討論我們可能發(fā)現(xiàn),謎題的答案是9×9共81個(gè)數(shù)字,但給玩家的謎題只是其中的一部分,那么哪些數(shù)字應(yīng)該顯示,哪些數(shù)字不應(yīng)該顯示呢?這樣是否應(yīng)該使用兩個(gè)字符串來保存一道謎題?通過類似加密的方法可以使這個(gè)問題迎刃而解,能夠使用這種方法的前提是char字符類型的數(shù)據(jù)能夠使用一個(gè)字符表示0到FFFF得Unicode碼(可以把char字符看成是多進(jìn)制的運(yùn)算)。例如char字符是1,轉(zhuǎn)化到int字符是49。為此,對(duì)謎題答案進(jìn)行一定的處理(這里采用編碼時(shí)加10的方法,讀取時(shí)減10的方法),就能將謎題和空白區(qū)域區(qū)分開來。運(yùn)行下面代碼,完成了數(shù)字和字符的轉(zhuǎn)換:for(inti=1;i<=9;i++){System.out.print(i);}System.out.println();for(inti=1;i++){System.out.print((char)(i+'0'));}兩次的輸出結(jié)果都是:123456789,但數(shù)據(jù)類型已經(jīng)發(fā)生了變化。對(duì)原有數(shù)字加10,然后再轉(zhuǎn)成char字符:for(inti=1;i<=9;i++){System.out.print((char)(i+10+'0'));}運(yùn)行程序,原來的123456789通過加10再變換,變成了;<=>?@ABC,結(jié)果毫無規(guī)律,變得不可識(shí)別。4.4.利用回溯法求解數(shù)獨(dú)回溯法有“通用解題法”之稱,將所有的解(問題的解空間)按照一定結(jié)構(gòu)排列,再進(jìn)行搜索。一般解空間構(gòu)造成為為樹狀結(jié)構(gòu),用深度優(yōu)先的策略搜索,一般有兩種方式:1.只需要一個(gè)解的話,找到解就停止。2.需要求所有解,則需做“樹的遍歷”找到所有解。回溯法的基本做法是搜索,或是一種組織得井井有條的,能避免不必要搜索的窮舉式搜索法。這種方法適用于解一些組合數(shù)相當(dāng)大的問題?;厮莘ㄔ趩栴}的解空間樹中,按深度優(yōu)先策略,從根結(jié)點(diǎn)出發(fā)搜索解空間樹。算法搜索至解空間樹的任意一點(diǎn)時(shí),先判斷該結(jié)點(diǎn)是否包含問題的解。如果肯定不包含,則跳過對(duì)該結(jié)點(diǎn)為根的子樹的搜索,逐層向其祖先結(jié)點(diǎn)回溯;否則,進(jìn)入該子樹,繼續(xù)按深度優(yōu)先策略搜索。回溯法是一種搜索算法,其基本思路是:在一個(gè)問題中,根據(jù)題意給出的邊界條件劃定出所有可能解的范圍(稱為可能解),根據(jù)題意確定出約束條件。利用程序順次在所有可能解中搜索時(shí)按照深度搜索的方式進(jìn)行。即在第一層選定一個(gè)滿足約束條件的解,然后以該可能解為出發(fā)點(diǎn),搜索第二層的一個(gè)可能解(試探)。如果搜索到第二層的一個(gè)可能解,則繼續(xù)搜索第三層得一個(gè)可能解。依次類推,直到所有層得可能解都被找到,則得到了該問題的一個(gè)完整解。如果第二層所有的肯可能解都不滿足約束條件,則返回第一層,放棄原有的可能解,使用第一層的下一個(gè)可能解(回溯)。一次類推,尋找第二層的一個(gè)可能解?;厮莘ㄏ鄬?duì)于其他窮舉的特點(diǎn)在于,不必把問題的每一層的所有可能解都遍歷一遍,只要當(dāng)前的可能解不滿足約束條件就拋棄該解,尋求下一個(gè)可能解,而不必求解其余的下層解。當(dāng)當(dāng)前層得所有可能解都不滿足約束條件,則回溯到上一層,拋棄上一層的當(dāng)前可能解。從以上分析中結(jié)合數(shù)獨(dú)問題的規(guī)則,得出數(shù)獨(dú)問題的約束條件為:每一格的數(shù)值范圍僅限1-9每一格內(nèi)的數(shù)字在當(dāng)前行不允許重復(fù)每一格內(nèi)的數(shù)字在當(dāng)前列不允許重復(fù)每一格內(nèi)的數(shù)字在當(dāng)前小宮格內(nèi)不允許重復(fù)由此,回溯法通過約束條件的篩選,在所有解中除掉不可能的解,從而獲得問題的一個(gè)或者全部解。具體實(shí)現(xiàn)方法和代碼會(huì)在后面章節(jié)詳細(xì)說明。4.5.游戲的類結(jié)構(gòu)整個(gè)游戲共由10個(gè)類組成,如圖3-11所示是游戲的類結(jié)構(gòu)。游戲的SuDoKuMIDlet類負(fù)責(zé)保持display對(duì)象,確保在各個(gè)屏幕之間切換。所切換的屏幕包括閃屏,菜單,游戲畫布,游戲設(shè)置表單和游戲說明表單。游戲線程和屏幕繪制由SuDoKuCanvas畫布類實(shí)現(xiàn),屏幕繪制包括背景,宮格和數(shù)字,游戲循環(huán)每隔50ms繪制一次。游戲聲效由SoundEffects類實(shí)現(xiàn)。游戲控制類SuDoKuModel銜接了游戲畫布,游戲存儲(chǔ)和游戲邏輯各個(gè)功能單元。使用這種結(jié)構(gòu)能很好地保持各個(gè)類得抽象性和封裝性,例如,邏輯類負(fù)責(zé)保持宮格數(shù)據(jù),判斷勝負(fù);而畫布類只負(fù)責(zé)繪制和接收鍵盤事件;游戲控制類起到中樞神經(jīng)的功能。圖3-11類結(jié)構(gòu)4.6.用戶界面流程游戲啟動(dòng)時(shí),首先顯示閃屏畫面,等待3秒或者玩家按下任意鍵之后,進(jìn)入游戲主菜單。菜單選項(xiàng)有“開始新游戲”“加載游戲”“游戲設(shè)置”“游戲說明”和“退出游戲”。玩家選擇“開始新游戲”和“加載游戲”則顯示游戲畫布;玩家選擇“游戲設(shè)置”,則進(jìn)入游戲設(shè)置表單;玩家按下“游戲說明”則顯示游戲說明畫面;玩家選擇“退出游戲”則退出整個(gè)游戲。整個(gè)游戲的界面切換流程如圖3-12所示,主要的用戶界面如圖3-13所示。圖3-12整個(gè)游戲的界面切換流程圖主要模塊設(shè)計(jì)5.1.主類SuDoKuMIDlet類5.1.1.閃屏界面游戲的主類為SuDoKuMIDlet類,該類繼承了MIDlet類,用于在各個(gè)屏幕之間切換,并且實(shí)現(xiàn)各個(gè)功能的調(diào)用,是整個(gè)程序的中樞核心。游戲啟動(dòng)后顯示游戲閃屏,閃屏由SplashScreen類實(shí)現(xiàn),代碼如下:publicvoidstartApp(){Displayablecurrent=Display.getDisplay(this).getCurrent();if(current==null){Display.getDisplay(this).setCurrent(newSplashScreen(this));//顯示閃屏界面}}5.1.2.游戲菜單列表當(dāng)閃屏畫面結(jié)束之后,將創(chuàng)建并顯示菜單,菜單由Menulist類實(shí)現(xiàn),此時(shí)后臺(tái)創(chuàng)建SuDoKuCanvas游戲畫布:privateMenuListmenuList;//游戲菜單privateSuDoKuCanvasmyCanvas;//游戲畫布publicvoidsplashScreenDone(){menuList=newMenuList(this);//創(chuàng)建游戲菜單myCanvas=newSuDoKuCanvas(this);//創(chuàng)建游戲畫布Display.getDisplay(this).setCurrent(menuList);//顯示游戲菜單} 游戲菜單有“開始新游戲”,“加載游戲”,“參數(shù)設(shè)置”,“游戲說明”,“退出游戲”,當(dāng)玩家選中這些選項(xiàng)時(shí),將會(huì)有相應(yīng)的調(diào)用方法。5.1.3.繼續(xù)游戲選項(xiàng)當(dāng)玩家進(jìn)入游戲后如果中途返回菜單,菜單會(huì)增加一項(xiàng)“繼續(xù)游戲”,選擇該項(xiàng)則返回游戲。中途返回菜單將停止計(jì)算時(shí)間,代碼如下:publicvoidmenuListContinue(){Display.getDisplay(this).setCurrent(myCanvas);//顯示游戲畫布myCanvas.start();//啟動(dòng)游戲線程}從游戲,游戲幫助和參數(shù)設(shè)置界面返回菜單的代碼如下,但是注意,從游戲中返回時(shí)調(diào)用了菜單對(duì)象的setGameActive()方法,該方法用于在菜單中插入“繼續(xù)游戲”選項(xiàng);當(dāng)設(shè)置好游戲參數(shù)返回時(shí),通過主類將參數(shù)從對(duì)象傳遞給游戲畫布,可見主類起到了中介傳遞作用,這些方法代碼如下:publicvoidgameBack(){menuList.setGameActive(true);//在菜單中插入繼續(xù)游戲選項(xiàng)Display.getDisplay(this).setCurrent(menuList);//顯示菜單}publicvoidmenuListContinue(){Display.getDisplay(this).setCurrent(menuList);//顯示菜單myCanvas.start();}publicvoidoptionsBack(bytelevel,byteback,byteinput,bytemusic){myCanvas.setOptions(level,back,input,music);//將參數(shù)傳遞給游戲畫布Display.getDisplay(this).setCurrent(menuList);//顯示菜單}5.1.4.填充完成后提示界面當(dāng)玩家填好方格內(nèi)所有數(shù)字后,將對(duì)結(jié)果進(jìn)行檢測(cè),將檢測(cè)結(jié)果保存在布爾變量isSolved中,并且彈出提示框。如果玩家順利完成了謎題,提示框中將顯示玩家耗費(fèi)的時(shí)間和難度級(jí)別,并恭喜玩家順利通過;如果玩家填充了題目,卻存在錯(cuò)誤,提示框?qū)@示失敗圖片,并請(qǐng)玩家繼續(xù)努力。由于持續(xù)時(shí)間使用的是毫秒單位,還需將時(shí)間轉(zhuǎn)換為小時(shí),分,秒單位。由notifyGameOver()方法處理游戲完成,該方法代碼如下:publicvoidnotifyGameOver(bytelevel,longgameDuration,booleanisSolved){StringstrTime;//時(shí)間字符串Strings;//提示字符串longtemp;//轉(zhuǎn)換時(shí)間格式臨時(shí)長(zhǎng)整型變量temp=gameDuration/1000;//將毫秒轉(zhuǎn)換成秒strTime=(gameDuration%60)+"秒";//獲取秒if(temp>=60){temp=temp/60;strTime=(temp%60)+"分"+strTime;//獲取分if(temp>=60){temp=temp/60;strTime=temp+"小時(shí)"+strTime;//獲取小時(shí)}}if(isSolved)s="恭喜,在"+strTime+"內(nèi)您順利完成了本題!";elses="未能完成本題,請(qǐng)繼續(xù)加油!";if(alert==null){alert=newAlert("游戲結(jié)束");//創(chuàng)建提示框alert.setTimeout(Alert.FOREVER);//等待用戶確認(rèn)后消失alert.setType(AlertType.INFO);}alert.setString(s);//設(shè)置提示框的文字內(nèi)容ImageimgGameOver;if(isSolved)imgGameOver=createImage("/win.png");elseimgGameOver=createImage("/lose.png");alert.setImage(imgGameOver);menuList.setGameActive(false);Display.getDisplay(this).setCurrent(alert,menuList);}5.2.游戲閃屏游戲閃屏由SplashScreen類實(shí)現(xiàn),該類繼承了低級(jí)用戶界面Cancas類,并且開啟線程來等待用戶確認(rèn),該類實(shí)現(xiàn)了Runnable接口。5.2.1.加載閃屏圖片SplashScreen類得構(gòu)造方法加載了閃屏圖片,并且啟動(dòng)等待線程,由如下代碼實(shí)現(xiàn):SplashScreen(SuDoKuMIDletmidlet){this.midlet=midlet;imgSplash=midlet.createImage("/splash.png");//加載閃屏圖片newThread(this).start();}5.2.2.繪制閃屏屏幕當(dāng)顯示閃屏畫布時(shí),將自動(dòng)調(diào)用paint()方法,該方法將閃屏圖片繪制到屏幕中心,繪制完成后將圖片銷毀,以便垃圾回收。代碼如下:privateImageimgSplash;publicvoidpaint(Graphicsg){intCanvasWidth=getWidth();//獲取屏幕寬度intCanvasHeight=getHeight();//獲取屏幕高度if(imgSplash!=null){g.drawImage(imgSplash,CanvasWidth/2,CanvasHeight/2,Graphics.VCENTER|Graphics.HCENTER);//將圖片繪制到屏幕中心imgSplash=null;}}5.2.3.閃屏的線程閃屏的線程等待3秒鐘后取消閃屏,代碼如下:publicvoidrun(){synchronized(this){try{wait(3000L);//等待3秒}catch(InterruptedExceptione){//捕捉線程中斷異常}dismiss();}}5.2.4.閃屏的取消除了等待3秒外,玩家按下任意鍵也能取消閃屏,鍵盤處理調(diào)用畫布類的keyPressed()方法,代碼如下:publicsynchronizedvoidkeyPressed(intkeyCode){dismiss();}Dismiss()方法用于取消閃屏,取消閃屏的同時(shí)設(shè)置標(biāo)志位,此時(shí)調(diào)用主類的splahScreenDone()方法,該方法將顯示權(quán)交給游戲菜單。用如下方法實(shí)現(xiàn):privatevolatilebooleanisDismissed=false;privatevoiddismiss(){if(!isDismissed){isDismissed=true;midlet.splashScreenDone();}}5.3游戲菜單MenuList類MenuList類繼承了高級(jí)用戶界面的List類,由于菜單屬于IMPLICT(有軟鍵組成的菜單),因此需要監(jiān)聽各個(gè)選項(xiàng)的選定事件,并且還實(shí)現(xiàn)了CommandListener接口。5.3.1.MenuList類得構(gòu)造函數(shù)MenuList類得構(gòu)造函數(shù)主要設(shè)置菜單名稱和增加各個(gè)選項(xiàng)(軟鍵),并監(jiān)聽選項(xiàng)的選擇事件。構(gòu)造函數(shù)的代碼如下:MenuList(SuDoKuMIDletmidlet){super("數(shù)獨(dú)",List.IMPLICIT);//設(shè)置菜單名稱和List的類型this.midlet=midlet;append("開始新游戲",null);//添加選項(xiàng)append("加載游戲",null);append("參數(shù)設(shè)置",null);append("游戲說明",null);append("退出游戲",null);setCommandListener(this);//監(jiān)聽選中事件}5.3.2.游戲當(dāng)前狀態(tài)如果玩家在游戲過程中,中途返回菜單,此時(shí)玩家會(huì)發(fā)現(xiàn)菜單中多了”繼續(xù)游戲“選項(xiàng)。該功能由setGameActive()方法實(shí)現(xiàn)。當(dāng)玩家在游戲過程中按下”返回菜單“軟鍵,則會(huì)調(diào)用主類的gameBack()方法,該方法先調(diào)用菜單的setGameActive()方法,方法的布爾參數(shù)active設(shè)置為true,表示游戲進(jìn)行中,需要增加”繼續(xù)游戲“選項(xiàng),然后才顯示菜單,該方法的代碼如下:privatebooleangameActive=false;voidsetGameActive(booleanactive){if(active&&!gameActive){gameActive=true;insert(0,"繼續(xù)游戲",null);//插入繼續(xù)游戲選項(xiàng)}elseif(!active&&gameActive){gameActive=false;delete(0);//刪除繼續(xù)游戲選項(xiàng)}}5.3.3.菜單事件處理前面提到,游戲菜單實(shí)際上由眾多軟鍵組成,所以菜單選項(xiàng)的選擇和軟鍵的選擇處理方法類似,所不同的是List將各個(gè)軟鍵看成一個(gè)軟鍵,然后用索引的方式具體處理各個(gè)子選項(xiàng)。響應(yīng)軟鍵事件的代碼如下:publicvoidcommandAction(Commandc,Displayabled){if(c==List.SELECT_COMMAND)//如果發(fā)生菜單事件{intindex=getSelectedIndex();//獲取選中選項(xiàng)的索引if(index!=-1)//shouldneverbe-1//不可能為-1{if(!gameActive){index++;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京醫(yī)科大學(xué)康達(dá)學(xué)院《專業(yè)方向綜合課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南省長(zhǎng)沙市2024年中考數(shù)學(xué)模擬考試試卷含答案
- 九江學(xué)院《服裝CAD制版》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇海洋大學(xué)《生化分離工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南九嶷職業(yè)技術(shù)學(xué)院《越南語(yǔ)閱讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 【物理】第十二章 簡(jiǎn)單機(jī)械 單元練習(xí)+2024-2025學(xué)年人教版物理八年級(jí)下冊(cè)
- 黑龍江工商學(xué)院《文化與社會(huì)發(fā)展》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶第二師范學(xué)院《機(jī)器學(xué)習(xí)與人工智能》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江海洋大學(xué)《光電信息材料與技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國(guó)科學(xué)技術(shù)大學(xué)《公關(guān)與營(yíng)銷策劃》2023-2024學(xué)年第一學(xué)期期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 人教版(2024)英語(yǔ)七年級(jí)上冊(cè)單詞表
- 中醫(yī)養(yǎng)生產(chǎn)業(yè)現(xiàn)狀及發(fā)展趨勢(shì)分析
- 2023年浙江省溫州市中考數(shù)學(xué)真題含解析
- 窗簾采購(gòu)?fù)稑?biāo)方案(技術(shù)方案)
- 司庫(kù)體系建設(shè)
- 居間合同范本解
- 機(jī)電傳動(dòng)單向數(shù)控平臺(tái)-礦大-機(jī)械電子-有圖
- 婦科病盆腔炎病例討論
- 食堂油鍋起火演練方案及流程
- 有余數(shù)的除法算式300題
評(píng)論
0/150
提交評(píng)論