版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程名: 手機(jī)游戲開發(fā)題目: 連連看 摘 要信息產(chǎn)業(yè)在中國已經(jīng)成為了非常重要的產(chǎn)業(yè)。無線通訊業(yè)作為通信業(yè)經(jīng)濟(jì)的命脈已經(jīng)占據(jù)了很好市場。在中國,3G時代即將到來,Java手機(jī)游戲作為手機(jī)增值業(yè)務(wù)的主要增長點,必將迎來蓬勃發(fā)展的機(jī)遇。本文對J2ME 的概況進(jìn)行簡單的概述,然后介紹了手機(jī)游戲利用J2ME為平臺的開發(fā)流程,隨著手機(jī)硬件功能的急速提高,手機(jī)游戲也會制作的越來越精美.手機(jī)游戲在國外已經(jīng)得到了很好的發(fā)展,國內(nèi)市場潛力也十分巨大,隨著移動增值業(yè)務(wù)的不斷擴(kuò)大,手機(jī)游戲已經(jīng)開始占據(jù)了很大的市場。目 錄摘要 2一、前言 41.1引言 4 1.2手機(jī)游戲狀況 4 1.3 手機(jī)游戲應(yīng)具有的特征 4二、檢
2、測J2ME 5 21 J2ME定義 .5 22 J2ME的總體架構(gòu) .6三、開發(fā)環(huán)境及相關(guān)技術(shù) 73.1 開發(fā)環(huán)境 73.2 關(guān)于Eclipse及Eclipseme 73.3 關(guān)于Wireless Tool Kit 83.4 MIDP 2.0簡介 8四、詳細(xì)設(shè)計 9 4.1 界面詳細(xì)設(shè)計 9 4.2 功能詳細(xì)設(shè)計 11 4.3 打包測試 17六、源代碼 17七、總結(jié) 84八、參考主要技術(shù)資料/文獻(xiàn) 85一、前 言 1.1引言隨著科技的發(fā)展,移動通訊設(shè)備己經(jīng)成為人們生活中不可缺少的通訊工具。隨著軟硬件技術(shù)的發(fā)展,移動通訊設(shè)備在為人們提供優(yōu)質(zhì)通訊功能的同時也在為人們提供越來越多的附加應(yīng)用。隨著 以
3、W AP,JAVA為代表的新的移動增值應(yīng)用技術(shù)迅速崛起,手機(jī)用戶已不再滿足于簡單的手機(jī)單機(jī)版游戲,而是期待更加絢麗、動感的手機(jī)應(yīng)用體驗。手機(jī)在線游戲因具有實戰(zhàn)感強(qiáng)、操作方便、畫面生動和娛樂性與趣味性強(qiáng)的特點而逐漸獲得人們的青睞。手機(jī)在線游戲大大提高了手機(jī)的應(yīng)用范圍,使原有手機(jī)只能提供固化游戲的方式得到根本改變,同時也為手機(jī)運營商提供了更加廣闊的運營空 J2ME作為Java技術(shù)專為消費嵌入式系統(tǒng)定制的版本,其穩(wěn)定性、跨平臺性、安全性、擴(kuò)展性使得成為移動通訊設(shè)備上主流開發(fā)平臺。1.2手機(jī)游戲現(xiàn)狀在諸如Sun Microsystems、Nokia、摩托羅拉等大公司的推動之下,基于J2ME的應(yīng)用開發(fā)逐
4、成熱點隨著手機(jī)性能的不斷提供,手機(jī)平臺之上的游戲應(yīng)用將逐漸成為繼PC游戲應(yīng)用之后又一新業(yè)務(wù)增長點。越來越多的廠商和開發(fā)者投入其中。目前,國內(nèi)手機(jī)增值業(yè)務(wù)日益增長,基于J2ME的應(yīng)用產(chǎn)品市場也逐日擴(kuò)大。1.3 手機(jī)游戲應(yīng)具有的特征一個手機(jī)游戲應(yīng)該具有以下特征:易于學(xué)習(xí): 既然手機(jī)游戲面向的是普通消費者而不是計算機(jī)專家,那么他們不可能深入的學(xué)習(xí)游戲技巧。消費者不會花幾個小時去研究一個幾元的手動操作的游戲。保持游戲的簡單是最基本的要求。可中斷性: 多任務(wù)處理是手機(jī)生活方式的基本特征。手機(jī)用戶常常在任務(wù)(如等一個電子郵件或者等車)之間有一小段時間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使用的是同一個設(shè)備
5、。所以一個好的手機(jī)游戲應(yīng)該提供短時間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換?;谟嗛啠菏謾C(jī)游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)和設(shè)計每個游戲都是昂貴的。如果一個手機(jī)游戲開發(fā)者要贏利的話,重要的是:同一個游戲引擎,多個標(biāo)題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法。 豐富的社會交互: 不管一個游戲設(shè)計得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別的玩家合作以增強(qiáng)所玩游戲的智力和隨機(jī)性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會交互的游戲證明是成功的。二、J2ME概述 21 J2ME定義
6、Java 2 Micro Edition (J2ME)是一種針對移動電話和PDA這樣的小型設(shè)備的Java語言。它是一種新的、非常小的Java 應(yīng)用程序運行環(huán)境,它所定義的構(gòu)架主要用于在手持式設(shè)備上推廣使用Java技術(shù)。J2ME定制了2種配置:CLDC(Connected Device Configuration ).其中,CLDC是為手機(jī)等CPU和內(nèi)存資源遠(yuǎn)低于u標(biāo)準(zhǔn)Java要求的設(shè)備所提供的一種配置,它是對Java 標(biāo)準(zhǔn)版本做了最大程度的縮減后得到的,其虛擬機(jī)和核心類庫多于100kB。CDC配置主要用于擁有更多資源的下一代設(shè)備。CLDC配置給各種手持設(shè)備提供了能運行Java程序的一種環(huán)境,但
7、開發(fā)者還很難在這種環(huán)境下開發(fā)程序沒,首先因為CLDC核心庫提供的是低級API,不適合直接用于構(gòu)建應(yīng)用程序;其次,手持設(shè)備的系統(tǒng)結(jié)構(gòu)千差萬別,很難保證應(yīng)用程序的圖形界面,網(wǎng)絡(luò)等功能的移植性。因此,為了進(jìn)一步增強(qiáng)J2ME功能,SUN公司允許設(shè)備供應(yīng)商在實現(xiàn)CLDC的基礎(chǔ)上再為自己的設(shè)備提供專門的高級API及程序管理方法,即PROFILE,以簡化應(yīng)用程序的開發(fā),使程序有更好的移植性。同時,SUN公司還與50多家知名的移動設(shè)備制造商及軟件開發(fā)商一起,制訂了專門用于手機(jī)等移動信息設(shè)備的配置文件MIDP(Mobile Information Device Profile).J2ME平臺是移動信息設(shè)備配置文
8、件(MIDP)和在MIDP之上建立的可選軟件包。 22 J2ME的總體架構(gòu)為了支持資源受限設(shè)備所要求的靈活性和可定制性,J2ME體系結(jié)構(gòu)分成如圖1所示的4層。由配置層定義的Java虛擬機(jī)運行于設(shè)備的宿主操作系統(tǒng)之上,構(gòu)成整個平臺的基礎(chǔ)。配置層提供了基本的語言特性,框架層提供針對設(shè)備的特殊功能API和擴(kuò)展類庫??蚣軐樱∕IDP)配置層J2ME虛擬機(jī)操作系統(tǒng)J2ME的體系結(jié)構(gòu)三、 開發(fā)環(huán)境及相關(guān)技術(shù)3.1 開發(fā)環(huán)境操作系統(tǒng):Microsoft Windows XP SP2程序語言:Java 2開發(fā)包:Sun Java (TM) Wireless Toolkit 2.5.2 for CLDCEcli
9、pse SDK Version: Java(TM) 2 Standard Edition(jdk1.5.0_14)IDE:eclipse 關(guān)于本作品的開發(fā)環(huán)境,整合J2DK+Eclipse+NLpack-eclipse + Eclipseme + Wireless Tool Kit,其安裝配置過程為另一方面的內(nèi)容也比較簡單,在此不再贅述。可以這么說,JDK提供了虛擬機(jī)來運行應(yīng)用程序,而WTK提供了仿真器, Eclipse及其它插件提供了開發(fā)測試程序代碼的IDE集成開發(fā)環(huán)境。此外,這些資源都是免費的,可以從網(wǎng)上直接下載,在下面小節(jié)中將做簡單的介紹。3.2 關(guān)于Ecli
10、pse及EclipsemeEclipse是一個開發(fā)源代碼的、基于java的可擴(kuò)展開發(fā)平臺。Eclipse相關(guān)的許可證是大多數(shù)基于Common Public License (CPL),CPL是一個為Open Source Initiative (OSI)所認(rèn)可的許可證。由于Eclipse Foundation的建立,Eclipse的許可證將逐漸趨向于使用Eclipse Public License (EPL),EPL是一個與CPL相類似的許可證,正在進(jìn)行OSI的認(rèn)證工作。作為當(dāng)今最流行的java開發(fā)IDE之一,java社群使用Eclipse以及基于Eclipse技術(shù)而來的IBM Websphe
11、re的開發(fā)者已經(jīng)超過了半數(shù)。Eclipse本身只是一個框架和一組響應(yīng)的服務(wù),并不能夠開發(fā)什么程序。在Eclipse中幾乎每樣?xùn)|西都是插件。同時各個領(lǐng)域的開發(fā)人員通過開發(fā)插件,可以構(gòu)建與Eclipse環(huán)境無縫集成的工具。eclipse的發(fā)行版都已經(jīng)帶有最基 本的插件,方便了開發(fā)人員。因此,除了搭建移動開發(fā)環(huán)境之外,也可以下載Jsp插件、Tomcat插件、Jboss插件來進(jìn)行整合,以用于JSP、J2EE的開發(fā)。圖2-1 Eclipse集成開發(fā)平臺在/downloads/index.php可以免費下載到Eclipse的解壓安裝文件、語言包以及許多實用工具插件
12、。EclipseME作為Eclipse一個插件,致力于幫助開發(fā)者開發(fā)J2ME應(yīng)用程序。EclipseME并不為開發(fā)者提供無線設(shè)備仿真器,而將各手機(jī)廠商的實用仿真器緊密連接到Eclipse開發(fā)環(huán)境中,為開發(fā)者提供一種無縫統(tǒng)一的集成開發(fā)環(huán)境。在/上可以免費下載到EclipseME。 3.3 關(guān)于Wireless Tool KitWTK(Wireless Tool Kit)是Sun公司針對J2ME推出的用于手機(jī)和Palm等移動設(shè)備的開發(fā)包,是除手機(jī)廠商的專用開發(fā)包外唯一的手機(jī)仿真器開發(fā)包。它通用性高,開發(fā)出的應(yīng)用程序可保證能運行在大部分設(shè)備上,
13、而不像專用廠商具有一定的不兼容性。雖然它沒有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運行仿真器的最基本組件,是其他IDE需集成采用的必備元素。當(dāng)然,你可以從手機(jī)廠商下載相關(guān)的API及仿真器來進(jìn)行開發(fā)。同樣,WTK也是個免費軟件,可以在Sun上得到下載。3.4 MIDP 2.0簡介MIDP即移動信息簡表(Mobile Information Device Profile)針對的是移動信息設(shè)備,或者體積較小、能力有限的手持設(shè)備(MID),這些設(shè)備的共性是具有用戶接口即屏幕和輸入機(jī)制。MIDP目標(biāo)設(shè)備的典型例子就是手機(jī)。MIDP 2.0相較之前的1.0版本,加強(qiáng)了對用戶接口、多媒體和游戲功能、網(wǎng)絡(luò)連接功
14、能的支持,主要包括以下幾個方面:n MIDP 2.0提供的游戲API使得游戲本身可以充分地利用設(shè)備自身的圖形處理功能。它的出現(xiàn)大大簡化了J2ME游戲的開發(fā)工作,同時也使開發(fā)者能夠更多地控制程序的圖形處理功能。n 在通信方面,MIDP 1.0僅支持HTTP,MIDP 2.0增加了對HTTPS、報文、Socket通信以及串口通信的支持。此外,MIDP 2.0還支持Push體系架構(gòu),這樣,手機(jī)能夠收到來自服務(wù)器的報警、消息或者廣播,并根據(jù)要求啟動手機(jī)上的應(yīng)用程序進(jìn)行操作。n 支持0ver-The-Air(OTA)Provisioning,它使用戶能夠動態(tài)地部署和更新移動設(shè)備上的應(yīng)用程序。
15、n MIDP OTA Provisioning模型為移動服務(wù)提供商提供了單一、標(biāo)準(zhǔn)地部署MIDP應(yīng)用程序的途徑。該模型已經(jīng)被眾多技術(shù)領(lǐng)先的移動設(shè)備制造商和服務(wù)提供商所采納。n MIDP 2.0增加了強(qiáng)大的“端到端”安全模型。一方面,MIDP 2.0支持HTTPS,可以對所傳輸?shù)馁Y料進(jìn)行加密;另一方面,MIDP 2.0采用了和MIDP 1.0不同的安全機(jī)制,采用安全與來確保未經(jīng)授權(quán)的MIDlet套件無法訪問受權(quán)限控制的數(shù)據(jù)、應(yīng)用程序以及其他網(wǎng)絡(luò)和設(shè)備資源。四、 詳細(xì)設(shè)計4.1 界面詳細(xì)設(shè)計游戲的界面分為控制區(qū)和操作區(qū),控制區(qū)是整個游戲的控制按鈕的集中區(qū)域,操作區(qū)是游戲者進(jìn)
16、行游戲的場所。(1) 控制區(qū)控制區(qū)中有以下一些按鈕:l 開始游戲按鈕:進(jìn)入游戲開始界面,玩游戲顯示分?jǐn)?shù)點數(shù)與所用時間。l 放棄游戲按鈕:放棄本局游戲,進(jìn)行游戲模式選擇重新開始游戲。l 退出按鈕:退出游戲程序。l 重新洗牌按鈕:把游戲中的圖片重新排列。l 暫停按鈕:暫停游戲。l 游戲說明按鈕:游戲規(guī)則的說明。圖4-1(2) 操作區(qū)操作區(qū)是游戲者進(jìn)行游戲的場所,游戲的規(guī)則很簡單,就是用不超過兩次轉(zhuǎn)折的連線把兩個相同的圖片連起來,直到把游戲畫面中的圖片消完為止。游戲采用GameMap類,用來加載圖片和連連看的核心算法來選擇圖片選中以及消除圖片的算法,用GameCanvas來接收手機(jī)鍵盤消息來消除圖片
17、和重畫地圖,用UITimer與GameCanvas來控制時間來計算游戲時間與判斷是否能成功完成游戲通關(guān)。圖4-2圖4-34.2 功能詳細(xì)設(shè)計功能的詳細(xì)設(shè)計主要采用程序流程圖作為工具來闡述。自動游戲開始游戲退出游戲暫停游戲圖4-4(1) 游戲結(jié)束時的判斷 這個主要表現(xiàn)兩個問題:每一次消去圖片后,均將相應(yīng)位置的flag數(shù)組元素置0,且遍歷flag數(shù)組是否為0。如果全部為0,則游戲結(jié)束。 當(dāng)游戲結(jié)束時,直接向玩家發(fā)送gameover指令。 解決的辦法:首先,每次消去圖片后僅將圖片數(shù)目(gamevalue變量控制)減2,當(dāng)為0時,將gameover變量設(shè)為真值。而每次都向函數(shù)發(fā)送圖片數(shù)目,當(dāng)圖片數(shù)目值
18、為0時,即判斷玩家已經(jīng)勝利。(2) 游戲進(jìn)入前的選擇每個MIDlet程序都必須有一個主類,該類必須繼承自MIDlet。它控制著整個程序的運行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機(jī)中很可能有正在運行程序卻突然來電的情況,這時應(yīng)進(jìn)入暫停狀態(tài)。)、結(jié)束的函數(shù)。本程序主類為MainMIDP,并實現(xiàn)接口CommandLIstener。(3) 游戲背景 首先顯示的是游戲的背景介紹,在類MainMIDP定義Form類對象m_frmMain
19、,在startApp()函數(shù)中判斷是否為剛進(jìn)入游戲,如果為假的話,將創(chuàng)建Form類的實例,并且調(diào)用append()方法在表單上放置m_MainList菜單。調(diào)用setCommandListener()命令使Form與CommandListener建立關(guān)聯(lián)。調(diào)用Displayable顯示。seturrent()函數(shù)顯示背景介紹窗口。當(dāng)玩家點擊ok后將調(diào)用display.setCurrent(m_MainList)以顯示游戲菜單m_MainList。當(dāng)玩家按住上或下鍵時,在函數(shù)keyPressed(int code)中的整型變量menuIndex相應(yīng)的減1或加1,相應(yīng)的,在paint()函數(shù)中會根
20、據(jù)menuIndex繪制選項是否被選中。當(dāng)移動選項條到某項,并點擊ok時,在commandAction()方法中根據(jù) menuIndex 來判斷是“開始游戲”、“游戲說明”、“關(guān)于”、“退出”。例如當(dāng)選擇“關(guān)于”時,將調(diào)用MainMIDP類中的commandAction ()方法以顯示”關(guān)于”界面。(4) 游戲邏輯及五個重要類的實現(xiàn)GameCanvas類所實現(xiàn)的功能畫游戲屏幕的時間間隔:private int m_paintTime;玩的時間計數(shù):private int m_timeCount;一局游戲總共花費的時間 :private int m_GameTimeCount;定時次數(shù)調(diào)用次數(shù)計
21、數(shù):private int m_timeMcount;顯示地圖裝載效果狀態(tài)計數(shù):private int m_IniGameMapCount;畫連接線標(biāo)志:private boolean m_bPaintCleanFlag;private boolean m_bPaintCleanStart;private int m_iPaintCleanCount;游戲運行狀態(tài)標(biāo)志:private int m_StatusFlag; 0: 游戲圖片文件裝載過程,在程序啟動的時候,另外一線程裝載。 1:游戲地圖文件初始化狀態(tài),出現(xiàn)地圖初始化的效果 2:游戲進(jìn)行中,檢查剩下時間,調(diào)整狀態(tài)條,顯示分?jǐn)?shù)等信息 3:
22、單節(jié)游戲結(jié)束,處理是否繼續(xù)游戲、退出游戲、保存記錄;4:一局游戲結(jié)束,顯示畫面慶祝游戲地圖信息: private GameMap m_gameMap;接收鍵盤狀態(tài)信息:調(diào)用keyPressed()函數(shù)來消除相同圖片后的設(shè)置以及畫面的重畫。并調(diào)用GameMap類來進(jìn)行游戲算法和規(guī)則的調(diào)用與判斷。(5) 地圖的移動根據(jù)游戲的設(shè)定,游戲中選圖片是向下向上移動的,實現(xiàn)此功能的方法。每個創(chuàng)建Command實例的J2ME的應(yīng)用程序也必須創(chuàng)建實現(xiàn)CommandListener接口的實例。每當(dāng)用戶通過commandAction()方法的方式與命令進(jìn)行交互的時候,就會通過CommandLIstener.所以實現(xiàn)
23、CommandListener的類必須實現(xiàn)commandAction()方法。在commandAction()方法中,使用getabel()方法獲取命令的標(biāo)簽。如果getLabel()=“暫?!睍r,表示玩家點擊了暫停鍵,此時,conti賦值為false,游戲畫面的繪制及游戲相關(guān)的運算暫停,并且,使用removeCommand(c)語句將“暫?!币瞥?,使用addCommand(new Command("繼續(xù)",Command.OK,2);將”繼續(xù)“按紐”添加進(jìn)來。當(dāng)玩家點擊“繼續(xù)“時,conti賦值為true,并且,一定要調(diào)用start()方法,否則繼續(xù)功能不可用。必須調(diào)用s
24、tart()方法的原因是:J2ME的線程被stop()方法拿掉,如果想停止線程的運做,就必須依靠一個旗標(biāo)(flag),在本程序中,flag就是boolean型變量conti。所以一旦此標(biāo)識變量被設(shè)為false,那么while(conti)循環(huán)就會結(jié)束,線程也會跟著結(jié)束。當(dāng)用戶按下“繼續(xù)”的時候,start()將重新產(chǎn)生一個線程繼續(xù)執(zhí)行相關(guān)的運算和畫面繪制。當(dāng)玩家通關(guān)時或者任務(wù)失敗時,將顯示相應(yīng)信息,并使用上面的方法將“暫停”鍵變?yōu)椤胺祷亍辨I盤,當(dāng)點擊“返回”鍵時,將返回主菜單選項,調(diào)用類lzhhdm里的方法menuscreensecond(),在此方法中,實例化一個MenuScreen類對象,
25、并且使選項“新游戲”改變?yōu)椤敝匦麻_始“。完成此項功能的語句子為MenuScreen.mainmenu0 =”重新開始”。當(dāng)選擇”重新開始“時,使用gamescreen=new gameScreen(this)將使所有變量重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家飛機(jī)的當(dāng)前位置等。使用gamescreen.start()重新開始程序的循環(huán)。在方法paint()過程中,除了要重繪地圖、圖片外還要在上方繪制關(guān)卡信息、玩家分?jǐn)?shù)點、及所用時間等。首先使用lm.setViewWindow()和lm.paint()設(shè)定可視范圍ViewWindow和從哪里畫起。其次,使用g.drawSt
26、ring()繪制屏幕上方的關(guān)卡信息、戰(zhàn)績、玩家剩余生命標(biāo)志。當(dāng)每次刷新繪圖頁面時,應(yīng)使用GameCanvas的flushGraphics()將屏幕后臺的緩沖區(qū)內(nèi)的圖像刷新到前臺來(flushGraphics()應(yīng)該寫在paint() 的最后)。(6) 核心算法判斷圖片是否可擦除兩點連接原理原理坐標(biāo)選中兩點,坐標(biāo)分別為S(sx,sy)、T(tx,ty),判斷連接從S點開始,我們可以從四個方向與T點進(jìn)行連接,分別是上、下、左、右,在此,我們以向上為例進(jìn)行算法分析。每次向上連接一點時,又有兩個方向可以選擇,即左和右(即分T在S的左、右邊)。在此,我們選擇選擇向左為例對算法進(jìn)一步分析。確定了方向的選擇
27、,那么連接線的形狀就是:SSTT(T在S的左邊的連接情況)那么如何判斷這一系列連接線是否可連呢?源點S的坐標(biāo)為(sx,sy),目標(biāo)點T坐標(biāo)(tx,ty)在算法中我們定義幾個臨時變量:x1、x2、 y1、 y2,當(dāng)然還有游戲地圖的邊界變量:stMap_x、stMap_y。源點S不需要判斷,默認(rèn)可以作為連接線上的一點。如果sy>0,將sy-1賦給y1,如果坐標(biāo)(sx、y1)沒有圖片文件(我們在此算法中用empty表示),則標(biāo)記此點為可連接點(我們在此算法中用SetCntMaps(x, y)表示),如果有圖片文件則此路線不可行,也就是選擇向上連接是無法滿足要求的。我們在這里演示的情況是先向上再
28、向左,所以接下來的判斷條件是tx<sx,將sx-1賦給x2,判斷(x2,y1)是否有圖片,如果沒有圖片,則標(biāo)記它為可連接點,并循環(huán)判斷到x2 = tx。當(dāng)判斷到x2 = tx時,也就是此路線上都是可連接點,將y1-1賦給y2,判斷(x2,y2)是否有圖片,如果沒有,則標(biāo)記它為可連接點,并循環(huán)判斷到y(tǒng)2=ty,如果此點仍然可連接,則該路線是可行的。當(dāng)然上述連接算法只是判斷一條路線,而y1=sy-1。那么需要循環(huán)判斷是否有其它路線,則根據(jù)y1=y1-1重復(fù)上述算法就可以了。這只是根據(jù)我們選擇從S點出發(fā),向上尋找路線并且T在S的左邊這種情況而設(shè)計的算法,其它的情況(向上再向右、向下再向左、向下
29、再向右、向左、向右)是類似的。此種情況的算法流程圖如下:開始S(sx,sy)、T(tx,ty)定義x1、x2、y1、y2SetCntMaps(iSx, iSy)Sy > 0y1=sy-1(sx,y1)可連接SetCntMaps(Sx, y1)x2=sx-1(x2,y1)可連接SetCntMaps(x2, y1)x2<=txx2=x2-1y2=y1-1(x2,y2)可連接SetCntMaps(x2, y2)y2=y2-1y2<=tyy1=y1-1y1>=0結(jié)束是是是是否否否否4.3 打包測試使用Eclipse完成代碼的調(diào)試之后,需要使用WTK生成包(即jar和jad文件)
30、,其過程如下:首先,使用WTK的新建項目功能建立一個新項目,要求與Eclipse工作區(qū)下的項目名稱、MIDlet類名相同。 新建項目后,將Eclipse工作區(qū)下的.java文件拷入src文件夾,將.class文件拷入class文件夾(需要新建),將pic文件夾拷入res文件夾,點擊生成,如一切正常之后,選擇項目-包-生成包。生成的jar和jad文件存儲在LLK/bin目錄下。運行Wireless Toolkit 2.5.2,使用手機(jī)模擬器進(jìn)行測試。點擊Lanuch按紐,進(jìn)入游戲界面,即可以進(jìn)行游戲測試了。 六、 源代碼主類 import javax.microedition.lcd
31、ui.*; import javax.microedition.midlet.*; import java.lang.Thread; public class MainMIDP extends MIDlet implements CommandListener,ItemStateListener/顯示控制句柄private Display m_display; /游戲顯示對象private GameCanvas m_GameCanvas;/啟動log信息畫面private UICanvas m_uiCanvas;/標(biāo)志是否已經(jīng)運行過一次游戲,用于處理在第二次進(jìn)入游戲的時候,一些資源不需要初始化
32、private boolean m_isOnece;/private UICanvas m_uiCanvase;/private Command cmExit; / Exit midlet/private Command cmOk;/private Command cmBack;/選項的主窗口,多個選項列表private List m_MainList;private Command m_ML_Select;/ 幫助說明框private Form m_Form_Help;private Command m_Frm_Help_Back;private Command m_Frm_About_Ba
33、ck;/游戲畫面一節(jié)結(jié)束后,后游戲一局結(jié)束后,在游戲畫面下面的COMMAND顯示的的:繼續(xù)和退出 命令按鈕private Command m_GUIC_Connitnue;private Command m_GUIC_End;private String strMsg;/*private Form m_frmMain;/主窗口的選項列表private ChoiceGroup cgMain;private Command cmMainMore;*/創(chuàng)建所有的窗口public void CreateForms()m_MainList = new List("Main", Lis
34、t.IMPLICIT);/m_ML_Select = new Command("Dodo",Command.ITEM,0);/m_MainList.addCommand(m_ML_Select);m_MainList.append("開始游戲",null);m_MainList.append("選項",null);m_MainList.append("游戲說明",null);m_MainList.append("關(guān)于",null);m_MainList.append("退出"
35、,null);m_GameCanvas = new GameCanvas(this);new Thread(m_GameCanvas).start();m_GUIC_Connitnue = new Command("繼續(xù)",Command.SCREEN,1);m_GUIC_End = new Command("退出",Command.SCREEN,1);m_MainList.setCommandListener(this);m_GameCanvas.setCommandListener(this);/*m_frmMain = new Form("
36、;Main Form");cmMainMore = new Command("More",Command.ITEM,1);cgMain = new ChoiceGroup("Preferences", Choice.EXCLUSIVE);/MULTIPLE);cgMain.append("No1",null);cgMain.append("No2",null);cgMain.append("No3",null);m_frmMain.addCommand(cmMainMore);m_fr
37、mMain.append(cgMain);*/啟動游戲后釋放所有的窗口信息,節(jié)約內(nèi)存private void FreeForms()public MainMIDP() super();m_isOnece = true;m_display = Display.getDisplay(this);/CreateForms();/m_GUIC_Connitnue = new Command("Continue",Command.ITEM,1);/m_GUIC_End = new Command("Close",Command.ITEM,1);protected
38、void startApp() throws MIDletStateChangeException /m_MainList.getSelectedIndex()/m_MainList.setItemStateListener(this);if (m_isOnece)m_uiCanvas = new UICanvas(this);new Thread(m_uiCanvas).start();m_display.setCurrent(m_uiCanvas);elsem_display.setCurrent(m_MainList);protected void pauseApp() protecte
39、d void destroyApp(boolean arg0)public void commandAction(Command c, Displayable d) int iSelect;char chV,chV2;chV = 0x0d;chV2 = 0x0a;/System.out.println("MIDP commandAction ");if (c = m_ML_Select) | (c = List.SELECT_COMMAND)iSelect = m_MainList.getSelectedIndex();switch(iSelect)case 0:m_isO
40、nece = false;m_GameCanvas.SetCurrentLevel(1);m_display.setCurrent(m_GameCanvas);/m_uiCanvase = null;/System.gc();break;case 1:break;case 2:/游戲說明/m_TextBox_Help;m_TB_Help_Back/m_TextBox_Help = new TextBox("幫助","hehe",100,TextField.ANY);m_Form_Help = new Form("游戲規(guī)則:");str
41、Msg =" 需選擇一對相同的圖形," +/ chV + chV2 +"進(jìn)行連接但此連接是在避" + /chV + chV2 +"開其他圖形后,呈現(xiàn)的路" + /chV + chV2 +"徑以不超過二轉(zhuǎn)彎為條件." + /chV + chV2 +"如符合規(guī)定則消除此一對牌" + /chV + chV2 +"而得分.每一局里玩家需要" + /chV + chV2 +"在規(guī)定的時間內(nèi)消除所有的" + /chV + chV2 +"牌子,當(dāng)完成任務(wù)后,方
42、能" + /chV + chV2 +"進(jìn)行下一關(guān)." + /chV + chV2 +" 游戲結(jié)束后,會出現(xiàn)當(dāng)前" + /chV + chV2 +"的關(guān)數(shù)、金幣數(shù)和所用的時" + /chV + chV2 + "間.這時,可以選擇繼續(xù)玩" + /chV + chV2 +"游戲或結(jié)束游戲." + chV + chV2 + " "m_Form_Help.append(strMsg);m_Frm_Help_Back = new Command("返回",C
43、ommand.SCREEN,1);m_Form_Help.addCommand(m_Frm_Help_Back);m_Form_Help.setCommandListener(this);m_display.setCurrent(m_Form_Help);break;case 3:m_Form_Help = new Form("關(guān)于:");strMsg =" 版本:1.0" + chV + chV2 +" Mopo Soft 2005 " + chV + chV2 +" 版權(quán)所有" + chV + chV2 +&q
44、uot; 程序:周運沖 " + chV + chV2 +" 美工:沈鵬飛、伍海飛" + chV + chV2 +" 策劃:鐘士杰" + chV + chV2 +" 冒泡網(wǎng):" + chV + chV2 +" "m_Form_Help.append(strMsg);m_Frm_About_Back = new Command("返回",Command.SCREEN,1);m_Form_Help.addCommand(m_Frm_About_Back);m_Form_Help.setCom
45、mandListener(this);m_display.setCurrent(m_Form_Help);break;case 4:exitMIDlet();break;default:break; else if (c = m_Frm_Help_Back)m_display.setCurrent(m_MainList);m_Frm_Help_Back = null;m_Form_Help = null; else if (c = m_Frm_About_Back)m_display.setCurrent(m_MainList);m_Frm_About_Back = null;m_Form_H
46、elp = null;else if (c = m_GUIC_Connitnue)ShowGameUICommand(false);m_GameCanvas.SetCurrentLevel(1); else if (c = m_GUIC_End)ShowGameUICommand(false);m_display.setCurrent(m_MainList);public void ShowMainCommand()/System.out.println("MainMIDP ShowMainCommand : ");m_display.setCurrent(m_MainLi
47、st);m_uiCanvas = null;/m_GameCanvas = new GameCanvas(this);/new Thread(m_GameCanvas).start();/System.out.println("MainMIDP ShowMainCommand : ");public void ShowGameUICommand(boolean isShow)if (isShow)m_GameCanvas.addCommand(m_GUIC_Connitnue);m_GameCanvas.addCommand(m_GUIC_End);elsem_GameCa
48、nvas.removeCommand(m_GUIC_Connitnue);m_GameCanvas.removeCommand(m_GUIC_End);public void itemStateChanged(Item item)public void exitMIDlet() destroyApp(true);notifyDestroyed();Gameanvas類/package LLK;import java.util.Timer;import java.util.TimerTask;import javax.microedition.lcdui.*;import java.lang.T
49、hread;class GameCanvas extends Canvas implements Runnable / implements CommandListener private MainMIDP m_midlet;private String m_KeyName;private TimerTask m_TimerTask; private Timer m_timer; /畫游戲屏幕的時間間隔 private int m_paintTime;/玩得時間計數(shù)private int m_timeCount;/一局游戲總共花費的時間private int m_GameTimeCount;/
50、定時次調(diào)用次數(shù)計數(shù)private int m_timeMcount;/顯示地圖裝載效果狀態(tài)計數(shù)private int m_IniGameMapCount;/畫連接線標(biāo)志private boolean m_bPaintCleanFlag;private boolean m_bPaintCleanStart;private int m_iPaintCleanCount; /游戲運行狀態(tài)標(biāo)志: /0: 游戲圖片文件裝載過程,在程序啟動的時候,另外一線程裝載。 /1:游戲地圖文件初始化狀態(tài),出現(xiàn)地圖初始化的效果 /2:游戲進(jìn)行中,檢查剩下時間,調(diào)整狀態(tài)條,顯示分?jǐn)?shù)等信息 /3:單節(jié)游戲結(jié)束,處理是否繼
51、續(xù)游戲、退出游戲、保存記錄;/4:一局游戲結(jié)束,顯示畫面慶祝 private int m_StatusFlag; /游戲地圖信息 private GameMap m_gameMap; public GameCanvas(MainMIDP midlet) this.m_midlet = midlet;m_StatusFlag = 0;m_timeCount = 0;m_gameMap = new GameMap();StartUITimer();m_paintTime = 0;m_timeMcount = 0;m_bPaintCleanFlag = false;m_bPaintCleanStart = false;m_iPaintCleanCount = 0;m_IniGameMapCount = 0;m_GameTimeCount = 0;protected void paint(Graphics g) int iRtn;g.setColor(99, 40, 25);g.fillRect(0, 0,128,160);/getWidth(), getHeight();g.setColor(255, 0, 0);try switch (m_StatusFlag)case 0:break;case 1:m_gameMap.DrawScree
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度高品質(zhì)建筑用木方模板供應(yīng)合同4篇
- 輕板房施工方案
- 圍護(hù)樁破除施工方案
- 2025年度高空作業(yè)平臺外架爬架銷售及售后服務(wù)合同4篇
- 二零二五年度網(wǎng)絡(luò)打印機(jī)集成與維護(hù)協(xié)議4篇
- 2025農(nóng)村土地調(diào)換合同書
- 2025正規(guī)的銷售合同范本
- 2025版大型商場消防系統(tǒng)升級改造合同3篇
- 2025版外賣騎手收入保障及培訓(xùn)合作協(xié)議3篇
- 2025公司合同范文
- 普通高中生物新課程標(biāo)準(zhǔn)
- 茉莉花-附指法鋼琴譜五線譜
- 結(jié)婚函調(diào)報告表
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計規(guī)范-PDF解密
- 冷庫制冷負(fù)荷計算表
- 肩袖損傷護(hù)理查房
- 設(shè)備運維管理安全規(guī)范標(biāo)準(zhǔn)
- 辦文辦會辦事實務(wù)課件
- 大學(xué)宿舍人際關(guān)系
- 2023光明小升初(語文)試卷
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
評論
0/150
提交評論