一、序言
昨天在網上閒逛,發現一篇講解用delphi實現華容道游戲的文章,頗受啟發.於是,產生了將華容道游戲移植到手機中去的沖動.現在手機游戲琳琅滿目,不一而足,華容道的實現版本也很多.正巧不久前筆者對J2ME下了一番功夫,正想借這個機會小試牛刀。選用J2ME的原因還有一個就是目前Java開發大行其到,無線增殖業務迅猛發展,J2ME的應用日漸活躍起來,也希望我的這篇文章能夠為J2ME知識的普及和開發團隊的壯大推波助瀾。由於長期受ISO規范的影響,這次小試牛刀我也打算遵照軟件工程的要求,並采取瀑布式的開發模式來規劃項目,也希望借此機會向各位沒有機會參與正式項目開發的讀者介紹一下軟件開發的流程。
這裡我們先定義項目組的人員體制(其實只有我一個人):技術調研、需求分析、概要設計、詳細設計、編碼、測試均有筆者一人擔任;美工這裡我找了個捷徑,盜用網上現成的圖片,然後用ACDSee把它由BMP轉換成PNG格式(我出於講座的目的,未做商業應用,應該不算侵權吧);至於發布工作,由於缺少OTA服務器,此項工作不做(但是我會介紹這步如何做)。
接下來,我們規劃一下項目實現的時間表,以我個人經驗,設想如下:技術調研用2天(這部分解決項目的可行性和重大技術問題,時間會長一些),需求分析用半天(畢竟有現成的東東可以參照,只要理清思路就行了,況且還有很多以前用過的設計模式和寫好的代碼),概要設計再用半天(有了需求,概要只不夠是照方抓藥),詳細設計要用2天(這一步要把所有的問題想清楚,還要盡可能的准確描述出來),編碼用2天(其實1天就夠了,技術已經不是問題,多計劃出一天來應付突發事件),測試用2天(測試應該至少占全部項目的四分之一,不過這個項目只是一個Demo,也太簡單了),發布也要用上半天(盡管我們不去實際發布它,但是還要花點時間搞清楚應該如何做),最後就是項目總結和開慶功會(時間待定)。
二.利其器
“公欲善其事,必先利其器”,做項目之前第一步是前期調研.我們要做的華容道這個東東隨處可見,我們要調研的是兩個方面:
1、游戲的內容:游戲本身很簡單,就是有幾個格子,曹操占據其中一個較大的格子,然後被幾個格子包圍,這些格子形狀不一定相同,但是擋住了曹操移動的方向.游戲者需要挪動這些格子最終把曹操移動到一個指定的位置才算是過關.更具體的分析我們放在後面需求分析和概要設計中討論。
2、技術儲備:談到技術,這裡簡單介紹一下J2ME.Java有三個版本,分別是J2ME(微型版).J2SE(標准版).J2EE(企業版).J2ME是一個標准,采用3層結構設計.最低層是配置層(Configuration)也就是設備層,其上是簡表層(Profile),再上是應用層(Application).MIDP就是移動信息設備簡表,目前主流手機支持MIDP1.0,最新的是MIDP2.0,它比前一個版本增加了對游戲的支持,在javax.microedition.lcdui.game包中提供了一些類來處理游戲中的技術,比如我們後面會用到的Sprite類,它是用來翻轉圖片的.權衡再三,筆者決定使用MIDP2.0來做開發.首先需要安裝一個J2ME的模擬器,我們就用Sun公司的WTK2.0,我覺得Sun的東西最權威.當然你也可以使用Nokia.Siemens或是Motolora等其他模擬器,但是他們的JDK不盡相同,寫出來的程序移植是比較麻煩的.
Sun公司的WTK2.0可以到搜索引擎尋找下載,當然要想成功下載的前提是你要先注冊成為Sun的會員(其實這樣對你是有好處的).當下來之後就是按照提示一步一步的安裝.安裝好了之後,我們用一個"Hello World"程序開始你的J2ME之旅.我們啟動WTK2.0工具集中的KToolBar,然後點擊New Project按鈕,在彈出的輸入框中輸入Project Name為HelloWorld,MIDlet Class Name為Hello,然後點擊Create Project,開始生成項目,工具會彈出MIDP配置簡表,這裡接受生成的默認值(以後還可以修改)點擊OK,工具提示我們把寫好的Java源程序放到[WTK_HOME]\apps\HelloWorld\src目錄之下.我們編輯如下代碼,並保存在上述目錄之下,文件名為Hello.java。
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Hello extends MIDlet
{
private Display display;
public Hello(){
display =Display.getDisplay(this);
}
public void startApp(){
TextBox t = new TextBox("Hello","Hello",256,0);
display.setCurrent(t);
}
public void pauseApp(){
}
public void destroyApp(boolean unconditional){
}
}