基于J2ME的MOTO手機的五子棋游戲開發(fā)_第1頁
基于J2ME的MOTO手機的五子棋游戲開發(fā)_第2頁
基于J2ME的MOTO手機的五子棋游戲開發(fā)_第3頁
基于J2ME的MOTO手機的五子棋游戲開發(fā)_第4頁
基于J2ME的MOTO手機的五子棋游戲開發(fā)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、西安文理學院計算機科學系本科畢業(yè)設(shè)計 ( 論文) (2009 屆) 設(shè)計題目基于 motorola手機的五子棋游戲開發(fā) the development of five son chess based on motorola cellular phone 系別計算機科學與技術(shù)專業(yè)軟件工程班級軟工( 2)學號 05413425 作者姓名 xxx 指導老師xxx完稿時間 2009-3-25成績i 摘要j2me(java 2 micro edition) 是近年來隨著各種不同設(shè)備,尤其是移動通信設(shè)備的飛速發(fā)展而誕生的一項新的開發(fā)技術(shù)。它定位在消費性電子產(chǎn)品的應(yīng)用上,對設(shè)備的智能化、多樣化,提供了革命性

2、的解決方案,并因其“write once, run anywhere”的 java特性而提高開發(fā)的效率。隨著手機的日益普及、 java功能在移動設(shè)備上的實現(xiàn),java 應(yīng)用程序產(chǎn)生的手機增值服務(wù)逐漸體現(xiàn)出其影響力,對豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。特別是手機性能的逐漸增強,手機作為一個游戲平臺越來越成熟了。本論文著眼于j2me 技術(shù)的應(yīng)用,開發(fā)一款可用的手機游戲程序五子棋。本論文介紹了 j2me 的相關(guān)技術(shù)及本程序的結(jié)構(gòu)分析和具體功能的實現(xiàn)。關(guān)鍵詞: j2me;手機游戲;五子棋ii abstract j2me is a kind of fast developing te

3、chnology implemented on various devices especially mobile communication equipments. it focuses on application for consumptive electronic products, providing revolutionary solution to the intelligence and diversification of the equipment. it improves the efficiency of the development process thanks t

4、o its “write once, run anywhere” nature.when mobile phone is getting ever more popular nowadays, with the implementation of java technology on mobile equipment, increment of capital on communication service exhibits its force on people s everyday life, providing them ever fast information just in ha

5、nd. mobile phone whose capability is greater is more and more mature for game. this dissertation focuses on implementation of j2me technology and has developed a commercial game suite run on mobile phones gobang. this dissertation introduces j2me and its relative technology as well as this program s

6、 structure and analysis of implementation in details. keywords: j2me; mobile game; gobang iii 目 錄第一章背景與意義 . - 1 - 1.1 手機業(yè)的情況. - 1 - 1.2 java 手機的優(yōu)點 . - 1 - 1.3 java 手機發(fā)展現(xiàn)狀. - 2 - 1.4 論文組織 . - 4 - 第二章 j2me綜述 . - 5 - 2.1 j2me 簡介 . - 5 - 2.2 j2me 的相關(guān)特性 . - 5 - 第三章需求分析 . - 7 - 3.1 基本需求分析. - 7 - 3.2 游戲玩法及

7、規(guī)則. - 7 - 第四章游戲設(shè)計分析. - 8 - 4.1 軟件總體框架圖. - 8 - 4.2 單機挑戰(zhàn)版 . - 10 - 4.3 雙人對戰(zhàn)版 . - 20 - 4.4 藍牙終極版 . - 22 - 4.5 游戲主類介紹及實現(xiàn). - 23 - 第五章總結(jié)與展望 . - 29 - 參考資料 . - 30 - 致謝 . - 31 - - 1 - 第一章背景與意義1.1 手機業(yè)的情況2007年全球共銷售了大約11.5億部手機, 手機市場主要靠非洲和亞洲手機銷量上升拉動,歐洲的手機銷量保持穩(wěn)定。2007 年中國的手機年銷售量達到1.9 億部,手機的普及率是39%,擁有 5.25億用戶。中國在手機

8、生產(chǎn)制造領(lǐng)域的優(yōu)勢不斷加強,手機在中國自身的信息技術(shù)市場扮演的角色也越來越重要。經(jīng)過五年的規(guī)模化發(fā)展,中國手機市場已進入成熟期,2007年銷量將達 1.5億部,同比增長 23.1%;銷售額將達 1661 億元,受低端手機份額擴大的影響,銷售額同比下降 0.3%。2007 年,諾基亞生產(chǎn)了4 億 3710萬手機,三星生產(chǎn)了1 億6120 萬部手機, 摩托羅拉生產(chǎn)了 1 億 5900萬,緊挨著的是索尼愛立信, 生產(chǎn)了 1億 340萬部手機, 而且 lg 生產(chǎn)了 8050萬。其他公司生產(chǎn)了1 億 8430萬部手機,所有的公司將總共出售12億 4 千萬部手機。2007 年,各大手機廠商采用不同策略推動

9、市場發(fā)展,導致品牌競爭激烈。諾基亞推動娛樂市場戰(zhàn)略并涉足互聯(lián)網(wǎng)服務(wù)領(lǐng)域;索尼愛立信彌補智能手機軟肋;三星放下架子攻低端;摩托羅拉發(fā)展受阻,其他國外品牌如lg、飛利浦等表現(xiàn)不佳。多普達鋒芒畢露,其他國產(chǎn)品牌在生死線上掙扎。手機市場再現(xiàn)黑馬,蘋果高調(diào)入市,魅族、紐曼先后進入手機市場。預計到 2011年,全球市場售出的手機中有四分之一的產(chǎn)品將是超低價手機。未來五年,印度將是超低價手機的最大市場,其超低價手機年銷量將從2006年的900 萬部增加到 2011年的 1.16 億部。1.2 java 手機的優(yōu)點java 手機軟件平臺采用的基本java 平臺是cldc (connected limited

10、device configuration)和 midp (mobile information device profile) ,是 j2me (java 2 micro edition)的一部分,在中國一般稱為 “ 無線 java”技術(shù)。 此前, 有人把它叫做 “k-java”;其實, k-java 的叫法只是 sun 公司在開發(fā) kvm java 虛擬機時的項目代號,在該技術(shù)被正式命名為kvm 后,就不再用 k-java了。kjava即 j2me (java 2 micro edition) , 是 sun公司專門用于嵌入式設(shè)備的java軟件。以 kjava 編程語言為手機開發(fā)應(yīng)用程序,可

11、以為手機用戶提供游戲、個人信息處理、 電子地圖、股票等服務(wù)程序。 j2me(java 2 micro edition)是致力于消費產(chǎn)品和嵌入式設(shè)備的最佳解決方案。j2me 在設(shè)計其規(guī)格的時候,遵循著“ 對于各種不同的裝置而造出一個單一的開發(fā)系統(tǒng)是沒有意義的事” 這個基本原則。于是j2me 先將所有的嵌入式裝置大體上區(qū)分為兩種:一種是運算功能有限、電力供應(yīng)也有限的嵌入式裝置 (比方說 pda、手機 );另外一種是運算能力相對較佳、并且在電力供應(yīng)上相對比較充足的嵌入式裝置(比方說冷氣機、電冰箱)。因為這兩種區(qū)分,所以 java引入了一個叫做 configuration 的概念,然后把上述運算功能有

12、限、電力有限的嵌入式裝置定義在connected limited device configuration(cldc)- 2 - 規(guī)格之中;而另外一種裝置則規(guī)范為connected device configuration(cdc)規(guī)格。也就是說, j2me 先把所有的嵌入式裝置利用configuration 的概念區(qū)隔成兩種抽象的型態(tài)。java技術(shù)的開放性、安全性和龐大的社會已有資源,以及其跨平臺性,即“ 編寫一次,到處運行 ” 的特點,使java 技術(shù)成為智能手機軟件平臺的事實標準。采用 java技術(shù)后,編寫應(yīng)用程序和提供服務(wù)的人就不必關(guān)心接受其服務(wù)的手機采用的是什么操作系統(tǒng)和芯片,只要按

13、照java的要求去寫程序就好了;同樣,生產(chǎn)手機的廠商也不必顧慮將來誰來提供增值服務(wù)。可以看出,采用java技術(shù),可以建立完整、高效的無線數(shù)據(jù)增值服務(wù)產(chǎn)業(yè)鏈,從而為用戶提供靈活、個性化、內(nèi)容方式多樣的服務(wù)。1.3 java手機發(fā)展現(xiàn)狀到今年 6 月,全世界已經(jīng)有大約1 億部 java手機在使用,除中國大陸外共有53 個移動運行商正式推出了基于java技術(shù)的無線數(shù)據(jù)增值服務(wù)。 中國移動通信集團已經(jīng)建立了無線java增值服務(wù)體系,并推出了 “ 百寶箱 ” 等服務(wù)品牌,包括游戲百寶箱、娛樂百寶箱、商務(wù)百寶箱、生活百寶箱等,已經(jīng)于2003 年 7 月 10 日開始正式商用。手機游戲開發(fā)一般都是開放式的開

14、發(fā)平臺,例如流行的開發(fā)平臺,如j2me。開發(fā)人員能夠從網(wǎng)絡(luò)方便的得到相應(yīng)的開發(fā)資料,不論你的資金實力如何,只要你有興趣,就能夠邁入這個新興的行業(yè)。而相關(guān)的廠商,例如通信設(shè)備廠家對于手機游戲開發(fā)秉承一種開發(fā)的態(tài)度,鼓勵開發(fā)者在手機設(shè)備上開發(fā)游戲,通常都在網(wǎng)絡(luò)中提供了自己手機的技術(shù)資料。下文對目前市面上流行的手機游戲平臺做一個簡單的介紹。嵌入/內(nèi)置式游戲早期的手機功能簡單、屏幕也僅僅是單色,手機廠商能做的,就是在手機內(nèi)置一些簡單的游戲。這些游戲都是廠商以自己的專屬平臺所開發(fā)的,這些發(fā)售時就內(nèi)置的游戲在手機預存了多少就是多少,用戶無法自己新增或刪除。in-fusio exen 娛樂平臺即使是手機屏幕

15、變成了彩色,內(nèi)置游戲如何好玩,但總而也有玩膩的時候。因此用戶們也希望能夠玩新的游戲或者象下載圖片、鈴聲那樣通過無線網(wǎng)絡(luò)下載新的游戲。法國 in-fusio 公司看中了這個市場, 在 2001 年推出了 exen (execution engine)游戲平臺。通過把專屬的exen 芯片加入手機內(nèi),賦予手機彩色畫面與流暢的執(zhí)行速度,讓手機也有掌上游戲機那樣的效果。j2me 平臺j2me(java 2 micro edition )平臺是目前最火暴的手機游戲平臺,盡管它還可以下載和安裝一些小的應(yīng)用程序。j2me 簡單的可以理解為java的移動版本,其 midp(mobile information

16、device profile ,移動信息裝置簡表)架構(gòu)就是專門- 3 - 為手機與 pda 而設(shè)計。目前 midp 有 1.0 和 2.0 之分, 后者在兼容性以及游戲的多媒體表現(xiàn)力如音效和振動方面有更好的效果,此外通過測試軟件顯示,支持midp2.0 的 java 游戲在圖形運行能力對比1.0 版本也有更優(yōu)秀的表現(xiàn)。由于 j2me 的技術(shù)先進,而且又能跨平臺運行, 因此受到了眾多手機廠家的支持,甚至成為現(xiàn)在用戶購買手機的一項比較重要的技術(shù)指標。所以到目前為止,手機的游戲應(yīng)用平臺中,以支持j2me 的最多,而且 j2me 軟件開發(fā)商也有越來越多的趨勢, j2me 已成為 2002 年下半年之后

17、的行動游戲平臺主流。synergenix mophun平臺mophun 是瑞典 synergenix公司于 2002 年開發(fā)出的全新移動游戲娛樂平臺。mophun 的發(fā)音類似 more fun,主要就是針對游戲平臺而設(shè)計的游戲語言,采用c 程序代碼來開發(fā)游戲,運行起來最穩(wěn)定,速度上也比java vm 快許多倍(廠商宣稱快 100倍) ,可發(fā)揮出手機硬件的極限。同時,mophun 游戲平臺能在極其有限的硬件資源上運作,其最低硬件需求是以12mhz 運行的 8 位處理器,因而適用于現(xiàn)有的 2g 手機。由于 mophun 的 api 功能齊全,加上是采用本地代碼,運行速度快的優(yōu)勢顯而易見,這點對于支

18、持mophun 和 java雙游戲平臺的索愛手機尤其明顯。通常情況下排除其他因素, 索愛手機在運行 mophun 游戲時速度遠遠超過手機的java游戲運行時的速度。另外, mophun 游戲在一次下載后就不須再付費(這點跟exen的理念一樣),同時 mophun 還具備安全機制(防盜版) ,主游戲程序無法從手機中拷出,只提供游戲存盤轉(zhuǎn)存到電腦中。mophun 游戲平臺因為具備在極其有限的硬件資源上運行高效性能,可說是目前手機最佳的游戲平臺之一。brew 游戲平臺brew 是無線二進制運行環(huán)境 (binary runtime environment for wireless) 的縮寫。是高通公司

19、2001 年推出的基于 cdma 網(wǎng)絡(luò)的一個增值業(yè)務(wù)開發(fā)運行的基本平臺。相對 java,brew 是一個更底層的技術(shù)。嚴格的說游戲僅僅是brew 的一部分內(nèi)容而已。brew 提供的功能環(huán)境就好像pc 機上的操作系統(tǒng)一樣,可以通過服務(wù)提供商下載指定類型的應(yīng)用程序或游戲來使用。對于支持 brew 的手機終端, 在手機出廠時已經(jīng)預安裝了兩個應(yīng)用。分別為應(yīng)用管理器 (application manager)和移動商店( mobileshop) 。未來手機游戲趨勢未來的手機游戲平臺因為ati 和 nvidia 兩大 pc 顯示芯片廠商專業(yè)級水準的加入而更為熱鬧。在ati 推出手機和 pda 手機 3d

20、多媒體芯片 (包含專用的媒體處理器 media processor及 3d 加速器 3d accelerator)后,老對頭 nvida 也毫不示弱,公布了他們的 3d 多媒體芯片, 并且應(yīng)用于三菱和神達mitac 的智能手機上。這些芯片在植入手機后能夠有效的提升圖形顯示性能,使手機在進行多媒體演示和游戲時更夠有出色顯示效果。不過這些廠家提供的都是硬件芯片,要完全發(fā)揮其在3d 圖形的表現(xiàn)能力還- 4 - 需要相應(yīng)支持的api 才能相輔相成,而目前主要的api 包括 2003 年 7 月發(fā)表的opengl es (opengl for embedded systems ) ,就是 opengl

21、的嵌入式版本,是為嵌入系統(tǒng)而開發(fā)的小型標準三維(3d)圖形應(yīng)用編程接口 (api),并受到那些意圖將3d 游戲引入移動設(shè)備的游戲開發(fā)商、手機廠商、游戲引擎供應(yīng)商和3d 圖形芯片公司的熱烈追捧。目前已知nvidia ar10 與 ati imageon 23xx 3d 芯片,已符合opengl es 1.0 的標準。而最新 symbian os 8.0版本也將支援 opengl es api。相信不久后,手機上也能玩像是cs、doom、quake的 fps游戲了。1.4 論文組織本論文的組織如下:第一章 介紹了課題的開發(fā)背景和意義,以及國內(nèi)外狀況。第二章 j2me綜述。第三章 需求分析。第四章

22、游戲設(shè)計分析。第五章 總結(jié)與展望。- 5 - 第二章 j2me綜述2.1 j2me 簡介j2me 即 java 2 micro edition ,它是 java 2的組成部分, 與 j2se、j2ee并稱。j2me 是一種高度優(yōu)化的 java運行環(huán)境,應(yīng)用于大量的消費類電子設(shè)備, 如 cellular phones( 蜂窩電話 )、screen phones( 可視電話 )、digital set-top boxes(數(shù)字機頂盒 )、car navigation systems( 汽車導向系統(tǒng) )等,同時也廣泛被移動通信設(shè)備所采用,如移動電話、雙向?qū)ず魴C、智能卡、個人電腦記事本(persona

23、l organizer) 和掌上電腦(palmtop)等。j2me 技術(shù)將 java語言的與平臺無關(guān)的特性移植到小型電子設(shè)備上,允許移動無線設(shè)備之間共享應(yīng)用程序。j2me 使用配置和簡表定制java 運行時環(huán)境 (jre)。作為一個完整的jre,j2me 由配置和簡表組成, 配置決定了使用的 jvm,而簡表通過添加特定于域的類來定義應(yīng)用程序。與以前 sun 公司推出的 j2ee (java 2 enterprise edition , java 2企業(yè)版 )、j2se (java 2 standard edition ,java 2標準版 )規(guī)范相比, j2me 不是一個單獨的技術(shù)規(guī)范,而是一

24、系列技術(shù)規(guī)范總稱。這些規(guī)范定義了java 技術(shù)在資源限制的設(shè)備中的表現(xiàn)形式。 j2me 主要適用于小型嵌入式設(shè)備,這些設(shè)備與pc 或是服務(wù)器設(shè)備相比沒有統(tǒng)一的硬件標準、 外觀與操作方式, 其功用也是千差萬別。 但是 j2me 在適用于這些設(shè)備的同時也保留了java 的傳統(tǒng)特性,即任何時間和任何地點的代碼具有可移植性、部署靈活性、安全的網(wǎng)絡(luò)傳輸性,以及代碼穩(wěn)定性。正是因為如此,開發(fā)人員才可以借助j2me 力量讓編寫的程序能夠運行在其他型號或廠商的設(shè)備上。2.2 j2me 的相關(guān)特性2.2.1 configuration簡介j2me 在設(shè)計其規(guī)格的時候, 遵循著對于各種不同的裝置而造出一個單一的開

25、發(fā)系統(tǒng)是沒有意義的事 這個基本原則。 于是 j2me 先將所有的嵌入式裝置大體上區(qū)分為兩種:一種是運算功能有限、電力供應(yīng)也有限的嵌入式裝置(比方說pda 、手機 );另外一種則是運算能力相對較佳、并請在電力供應(yīng)上相對比較充足的嵌入式裝置(比方說冷氣機、電冰箱、電視機上盒(set-top box)。因為這兩種型態(tài)的嵌入式裝置,所以java 引入了一個叫做configuration 的概念,然后把上述運算功能有限、電力有限的嵌入式裝置定義在connected limited device configuration(cldc) 規(guī)格之中;而另外一種裝置則規(guī)范為connected device co

26、nfiguration(cdc) 規(guī) 格。 也 就 是說 ,j2me 先 把所 有 的 嵌 入 式 裝 置 利 用configuration 的概念區(qū)隔成兩種抽象的型態(tài)。其實在這里大家可以把configuration 當作是 j2me 對於兩種類型嵌入式裝置的規(guī)格,而這些規(guī)格之中定義了這些裝置至少要符合的運算能力、供電能力、記憶體大小等規(guī)范,同時也定了一組在這些裝置上執(zhí)行的java 程序所能使用的- 6 - 類別函式庫、這些規(guī)范之中所定義的類別函式庫為java 標準核心類別函式庫的子集合以及與該型態(tài)裝置特性相符的擴充類別函式庫。比方就cldc 的規(guī)范來說,可以支援的核心類別函式庫為java.l

27、ang.* 、java.io.*、java.util.* ,而支援的擴充類別函式庫為java.microedition.io.* 。區(qū)分出兩種主要的configuration 之後,j2me 接著在定義出 profile 的概念。profile 是架構(gòu)在 configuration 之上的規(guī)格。之所以有 profile 的概念,是為了要更明確地區(qū)分出各種嵌入式裝置上java 程序該如何開發(fā)以及它們應(yīng)該具有哪些功能。因此 profile 之中定義了與特定嵌入式裝置非常相關(guān)的擴充類別函式庫,而java 程序在各種嵌入式裝置上的使用者介面該如何呈現(xiàn)就是定義在profile 里頭。 profile 之

28、中所定義的擴充類別函式庫是根據(jù)底層 configuration 內(nèi)所定義的核心類別函式庫所建立。2.2.2 profile簡介profile 是建立在某個 configuration 之上的特定 api 集合。一個 configuration只定義虛擬機和基本的api 集合,不定義建立應(yīng)用程序的細節(jié)。因此profiles 往往包括應(yīng)用程序生命周期的api,用戶界面 api 以及存儲 api。一個 profile 既可直接建立在 configuration 上,也可建立在另一個profile 之上。為了在不改動 profile 的前提下增加設(shè)備的功能, 在 profile 之外又提出了可選包,可

29、將它們看成profile 的擴展,每個可選包對某個或某些profiles 增加特定的功能。當對某個 profile 需要增加一個新的 api 時首先將它定義為可選包。 如果隨著時間的推移該可選包被廣泛采用,它則可能成為某個或某些profiles 的一部分。某些廠家特定的api 與可選包起相似功能。j2me 的這種結(jié)構(gòu)很好的適應(yīng)了嵌入設(shè)備的巨大多樣性。從低到高,您可根據(jù)設(shè)備的情況可采用不同的configuration,在同一 configuration中您又可根據(jù)設(shè)備的用途選用不同的profile ,在您的設(shè)備中您還可采用多個profile ,如果您還嫌功能不夠,尚有可選包可用。 j2me 中第

30、一個正式發(fā)布的profile 是 midp, 而且隨后比較長的時間內(nèi)未有其它 profile 發(fā)布, 以至有人把 midp 等同于 j2me 了, 有人把 wtk 等同于 j2me sdk(由于 j2me 包含的范圍很廣,所以不太可能有廠商推出能支持各種profile 的開發(fā)工具) 。midp 只是 j2me 中的一員,我們來看看到寫本文為止有哪些profile。由于每個 profile 是建立在特定的configuration 之上的,所以我們在profile 后注明其基于的 configuration。目前已有的基于 cldc 的 profile 有 midp,基于 cdc的 profil

31、e 有 fp、pbp。- 7 - 第三章需求分析3.1 基本需求分析手機屏幕尺寸分為物理尺寸和顯示分辨率兩個概念。物理尺寸是指屏幕的實際大小。大的屏幕同時,要配備高分辨率,也就是在這個尺寸下可以顯示多少個像素,顯示的像素越多,可以表現(xiàn)的余地自然越大?,F(xiàn)在手機行業(yè)發(fā)展迅速,不同大小屏幕的手機迅速發(fā)展,鑒于不同手機屏幕尺寸不同,我們在設(shè)計游戲的時候有一下一些要求:一 軟件的界面簡潔明了,操作簡單容易。受手機屏幕大小和顯示的影響,我們設(shè)計的軟件界面必須是簡潔的;手機鍵盤的不方便,游戲需要設(shè)計得易操作。二 軟件具有人工智能算法原理要簡單,并且運行快速。游戲是需要快速反應(yīng)的。手機處理器的頻率直接要求我們

32、需要使用簡單實用的智能算法。三 游戲要設(shè)置幾個難度, 便于不同玩家選擇 . 玩家的游戲水平不一樣, 我們設(shè)置不同難度供各個水平的玩家選擇。四 游戲棋盤的大小要靈活,根據(jù)不同手機屏幕可以調(diào)節(jié)。3.2 游戲玩法及規(guī)則現(xiàn)代五子棋專用棋盤為十五路(15x15) ,共 225 個交叉點。棋盤正中一點為天元。對局開始時,先由執(zhí)黑棋一方將一枚棋子落在天元點上,然后由執(zhí)白棋一方在黑棋周圍的交叉點上落子。但是,為了尊重對方和禮貌起見,持白棋的一方通常將盤面的第二著棋布在自己河界的一側(cè),即直止或斜止。此后黑白雙方輪流落子,直到某一方首先在棋盤的橫線、縱線或斜線上形成連續(xù)五子或五子以上僅對白棋而言,則該方就算獲勝。

33、連珠五子棋的一個特點是先行的一方優(yōu)勢很大,因此在職業(yè)比賽中對黑方做了種種限制,以利公平競爭。 五子棋的比賽規(guī)則如下:1 黑先、白后,從天元開始相互順序落子;2 最先在棋盤橫向、縱向或斜向形成連續(xù)的同色五個棋子的一方為勝;3 黑棋禁手判負、白棋無禁手。黑棋禁手有“ 三、三 ” 、“ 四、四 ” 和“ 長連” ,包括“ 四、三、三 ” 和“ 四、四、三 ” 。黑棋只能以 “ 四、三 ” 取勝;4 如分不出勝負,則到為平局;5 五連與禁手同時形成,判勝;6 黑方禁手形成時,白方應(yīng)立即指出。若白方未發(fā)現(xiàn)或發(fā)現(xiàn)后不立即指出,反而繼續(xù)落子,則禁手失效,不再判黑方負。在本游戲中,沒有采用職業(yè)比賽的規(guī)則,直接

34、采用明間規(guī)則,一人一手棋,先成 5 為勝。另外,我們把游戲棋盤設(shè)置為可以調(diào)節(jié)大小,設(shè)置游戲難度以便適用不同手機。- 8 - 第四章游戲設(shè)計分析4.1 軟件總體框架圖4.1.1 驅(qū)動循環(huán)及類圖圖 1 驅(qū)動循環(huán)圖棋類游戲通常具備兩個重要特性,首先是對戰(zhàn)雙方輪流落子,其次是落子間隔通常是不確定的,尤其是對戰(zhàn)后期,可能每一步都需要經(jīng)過深思熟慮,無論是人方還是計算機方,都無法對間隔時間有事先的預期。開始玩家落子判 斷 落 子合法性判 斷 游 戲是否結(jié)束計算機落子判 斷 游 戲是否結(jié)束等待用戶輸入結(jié)束- 9 - 基于以上兩個特性,本游戲摒棄了大多游戲采用的線程或者定時器驅(qū)動游戲的方法,而采用了事件驅(qū)動方法

35、, 即玩家的鍵盤或觸摸筆出發(fā)游戲的下一步動作。事件驅(qū)動大大減少了不必要的工作量。軟件的類結(jié)構(gòu):圖 2 軟件類結(jié)構(gòu)整個游戲由 11 個類組成。這個游戲共有三個版本: 單機挑戰(zhàn)版, 雙人對戰(zhàn)版,藍牙終極版。 單機挑戰(zhàn)版由 gobang1canvas類和 chesses類組成,gobang1canvas類負責游戲界面的繪制,游戲落棋的控制,游戲規(guī)則的控制,游戲算法的控制,游戲勝負的控制。 chesses類是棋子類,提供棋子,每當下一個棋子的話,就生成一個棋子對象。雙人對戰(zhàn)版由 gobangcanvas類和 chesses類組成。 gobangcanvas類負責游戲界面的繪制,游戲落棋的控制,游戲規(guī)則

36、的控制,游戲算法的控制,游戲勝負的控制。chesses類是棋子類,提供棋子,每當下一個棋子的話,就生成一個棋子對象。藍牙終極版是由 chess類、client 類、connection類、control 類、gameworld類和 server 類組成, chess類提供藍牙版的棋子,每當下一個棋子的時候,生成一個棋子對象。 client 類和 server 類是建立藍牙協(xié)議的客戶端和服務(wù)端,當服務(wù)canvas midlet gobang1canvas gobangcanvas mycanvas gobang chesses connection control gameworld serve

37、r chess client - 10 - 端啟動后,不斷地監(jiān)聽來自客戶端的請求,如果監(jiān)聽到,則連接協(xié)議,準備進行通信,客戶端則在啟動后向服務(wù)器端發(fā)送連接請求,如果被服務(wù)端監(jiān)聽到,則配合服務(wù)器端連接。 connection類是負責連接客戶端和服務(wù)器端的。control 類負責判斷是啟動服務(wù)器端還是客戶端,對應(yīng)游戲中的正方和反方。gameworld類是負責繪制棋盤,游戲規(guī)則的控制,以及游戲勝負的控制,游戲進行的控制。4.2 單機挑戰(zhàn)版4.2.1 單機挑戰(zhàn)版的程序分析與具體實現(xiàn)進入游戲前的選擇畫面。游戲前我們要選擇游戲的版本,這里有三個版本,單機挑戰(zhàn)版,雙人對戰(zhàn)版,藍牙終極版,可以操作手機的上下左

38、右鍵進行選擇。圖 3 開機選擇版本單機挑戰(zhàn)版有三個等級的游戲,分別是初級、中級、高級。由于時間的原因,目前只完成了初級的開發(fā),中級和高級留作日后進一步開發(fā)。圖 4 進行等級的選擇進入游戲,開始單機挑戰(zhàn)版的游戲。- 11 - 圖 5 開始游戲4.2.2 單機挑戰(zhàn)版的核心類及邏輯實現(xiàn)gobang1canvas類是主要的實現(xiàn)類。以下是在游戲中需要用到的變量設(shè)置:int empty;/游戲界面到屏幕邊緣的留空int canvasw,canvash;/畫布的長和寬int chesslength;/棋子的直徑int chessmaplength,chessmapgrid,chessgridlength;

39、/棋盤的邊長,棋盤一邊格子數(shù),每格寬度int chessmapx,chessmapy;/棋盤左上角 x,y 坐標int selectedx,selectedy;/選擇框在棋盤格局上的 x,y 位置boolean isplayer1;/是否是玩家 1 chesses chesses;/棋子數(shù)組boolean newgame;/是否是新的游戲boolean iswin=false;/是否已經(jīng)勝利?int chessespoint;/存放要走的棋子的位置- 12 - staticintchessesnum = 3;/判斷有幾個棋子就開始堵了下面這個構(gòu)造函數(shù)對游戲進行初始化,包括棋盤的大小, 界面的繪

40、制, 游戲的加載:主要程序如下:public gobang1canvas(gobang gobang) this.gobang=gobang; newgame=true; empty=10; canvasw=getwidth()-empty;canvash=getheight()-empty; chessmapgrid=15; chesses=new chesseschessmapgrid+1chessmapgrid+1; if(canvaswcanvash) chessmaplength=canvash-canvash%chessmapgrid; chessmapx=(canvasw-che

41、ssmaplength)/2+empty/2; chessmapy=(canvash%chessmapgrid)/2+empty/2; else chessmaplength=canvasw-canvasw%chessmapgrid; chessmapx=(canvasw%chessmapgrid)/2+empty/2; chessmapy=(canvash-chessmaplength)/2+empty/2; chessgridlength=chessmaplength/chessmapgrid; chesslength=chessgridlength-1; selectedx=select

42、edy=chessmapgrid/2; isplayer1=true; restartcmd = new command(重新開始 , command.screen , 0); exitcmd = new command(退出, command.exit , 0); addcommand(restartcmd); addcommand(exitcmd); setcommandlistener(this); 對游戲的勝負進行判斷, 每當下一個棋子的時候, 會激活這個方法, 進行判斷,在橫、縱、正對角線、反對角線上,如果有連續(xù)的同色的五棋子,則判斷出該色的玩家獲勝。privateboolean c

43、heckwin(int x,int y,int chessesvalue) int value = chessesvalue; int xx = x;/循環(huán)變量的值int yy = y;/循環(huán)變量的值- 13 - int tempx=x,tempy=y;/存儲當前傳入的值,便于以后從這個點開始進行判斷/* * 縱向判斷 */ xx=tempx; yy=tempy;/讓目前的值與傳入的值保持一致int count = 0;/用來計算當前某一方的棋子是否夠五個while(yy=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()

44、=value) count+; yy-; if (yy0)break ; yy=tempy+1; while(yychessmapgrid)break ; if (count = 5) returntrue; /* * 橫向判斷 */ xx=tempx; yy=tempy;/讓目前的值與傳入的值保持一致count = 0;/用來計算當前某一方的棋子是否夠五個while(xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) - 14 - count+; xx-; if (xx0)break ; xx=tem

45、px+1; while(xxchessmapgrid)break ; if (count = 5) returntrue; /* * 反向?qū)蔷€ */ xx=tempx; yy=tempy;/讓目前的值與傳入的值保持一致count = 0;/用來計算當前某一方的棋子是否夠五個while(xx=0 & yychessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy+; if (xxchessmapgrid)break ; xx=tempx+1; yy=tem

46、py-1; while(yy=0 & xxchessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx+; yy-; if (yychessmapgrid)break ; - 15 - if (count = 5) returntrue; /* * 正向?qū)蔷€ */ xx=tempx; yy=tempy;/讓目前的值與傳入的值保持一致count = 0;/用來計算當前某一方的棋子是否夠五個while(xxchessmapgrid & yychessmapgri

47、d|yychessmapgrid)break ; xx=tempx-1; yy=tempy-1; while(yy=0 & xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy-; if (xx0|yy=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; yy-; if (yy0)break ; pointy1=yy; yy=tempy+1; while(yyche

48、ssmapgrid)break ; pointy2=yy; if (count = chessesnum& chessespointy1xx=null& - 17 - pointy1=0) temp0=xx; temp1=pointy1; return temp; elseif (count = chessesnum & chessespointy2xx=null & pointy2=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; if (xx0)

49、break ; pointx1=xx; xx=tempx+1; while(xxchessmapgrid)break ; pointx2=xx; if (count = chessesnum& chessesyypointx1=null& pointx1=0) temp0=pointx1; - 18 - temp1=yy; return temp; elseif (count = chessesnum & chessesyypointx2=null & pointx2=0 & yychessmapgrid & chessesyyxx!=null

50、& chessesyyxx.getchessesvalue()=value) count+; xx-; yy+; if (xxchessmapgrid)break ; pointx1 = xx; pointy1 = yy; xx=tempx+1; yy=tempy-1; while(yy=0 & xxchessmapgrid & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx+; yy-; if (yychessmapgrid)break ; pointx2 = xx; po

51、inty2 = yy; if (count = chessesnum & chessespointy1pointx1=null & pointx1=0 & pointy1= chessesnum & chessespointy2pointx2=null& pointx2=0) temp0=pointx2; temp1=pointy2; return temp; /* * 正向?qū)蔷€ */ xx=tempx; yy=tempy;/讓目前的值與傳入的值保持一致count = 0;/用來計算當前某一方的棋子是否夠五個while(xxchessmapgrid &

52、amp; yychessmapgrid|yychessmapgrid)break ; pointx1 = xx; pointy1 = yy; xx=tempx-1; yy=tempy-1; while(yy=0 & xx=0 & chessesyyxx!=null & chessesyyxx.getchessesvalue()=value) count+; xx-; yy-; if (xx0|yy= chessesnum & chessespointy1pointx1=null& pointx1=chessmapgrid & pointy1= c

53、hessesnum & chessespointy2pointx2=null& pointx2=0 & pointy2=0) temp0=pointx2; temp1=pointy2; return temp; temp0=88;/目前沒有威脅, 返回一個特殊的值, 讓別的方法隨機生成一個位置temp1=99; return temp; 另外,還有繪制游戲的主繪制方法paint()方法,繪制棋盤的paintmap() 方法,繪制棋子的paintchesses() 方法,繪制哪方可以下棋的paintselected()方法,繪制玩家的paintplayer()方法,觸發(fā)鍵

54、盤的keypressed() 方法,隨機產(chǎn)生棋子的 randomchesses()方法。由于篇幅的原因,此處不再累述,詳見源碼。4.3 雙人對戰(zhàn)版4.3.1 雙人對戰(zhàn)版的程序分析與具體實現(xiàn)和上一個版本一樣,進入選擇菜單里,選擇雙人挑戰(zhàn)版,圖 6 雙人挑戰(zhàn)版- 21 - 同樣,雙人挑戰(zhàn)版也有三個級別,初級、中級、高級三個級別,由于時間的問題,只實現(xiàn)了初級版的,中級版和高級版留作以后擴展開發(fā)。具體操作和單機挑戰(zhàn)版的操作類似,此處不再累述。進入游戲開始對戰(zhàn)。此游戲是兩個人用一部手機進行游戲,電腦不再下棋子,而是控制由哪一方來下棋。比如紅方在下的時候,白方就不能動鍵盤。4.3.2 雙人對戰(zhàn)版的核心類及

55、邏輯實現(xiàn)雙人對戰(zhàn)版的核心類及邏輯實現(xiàn)基本上和單機挑戰(zhàn)版的實現(xiàn)差不多,我把有差異的地方羅列出來。 雙人對戰(zhàn)版的核心類是gobangcanvas 類,此版本游戲不再由電腦來控制一方玩家了,而是完全由人來玩,所以手機只要控制好玩家的游戲順序以及游戲的規(guī)則即可。紅方先下一個棋子的話,進行判斷,在橫、縱、正對角線、反對角線上是否構(gòu)成了連續(xù)的五個紅棋子,如果構(gòu)成,則結(jié)束游戲,得出紅方勝利,否則繼續(xù)游戲,紅方下了后,游戲的權(quán)限交給白方。白方下一個棋子后,判斷如果在橫、縱、正對角線、反對角線上有連續(xù)的五個白色的棋子的話,同樣結(jié)束游戲,得出白方勝利。主要的程序如下:protectedsynchronizedvo

56、id keypressed(int keycode) if(!iswin) int action = getgameaction(keycode); if (action = canvas.left ) selectedx=(-selectedx+chessmapgrid+1)%(chessmapgrid+1); elseif (action = canvas.right) selectedx=(+selectedx)%(chessmapgrid+1); elseif (action = canvas.up) selectedy=(-selectedy+chessmapgrid+1)%(che

57、ssmapgrid+1); elseif (action = canvas.down ) selectedy=(+selectedy)%(chessmapgrid+1); elseif (action = canvas.fire ) if(chessesselectedyselectedx=null) chessesselectedyselectedx=newchesses(this.isplayer1); if (chessesselectedyselectedx.isplayer1) chessesselectedyselectedx.setchessesvalue(11); - 22 -

58、 elseif(!(chessesselectedyselectedx.isplayer1) chessesselectedyselectedx.setchessesvalue(10); iswin = checkwin(selectedx,selectedy,chessesselectedyselectedx.getchessesvalue(); this.isplayer1=!this.isplayer1;/切換下棋方 repaint(); 4.4 藍牙終極版4.4.1 雙人對戰(zhàn)版的程序分析與具體實現(xiàn)進入游戲菜單,選擇藍牙終極版,然后出現(xiàn)如下界面,選擇正方,還是反方。因為藍牙終極版是基于藍

59、牙協(xié)議,用兩部手機,兩個人進行游戲的版本。為了讓兩個玩家不沖突,所以必須要選擇一個正方和一個反方,也就是白方和紅方。圖 7 藍牙終極版選擇了正、反方后,游戲?qū)⑻崾灸闶欠翊蜷_藍牙,你選擇是即可。打開了藍牙后,就可以進行游戲了。因為目前藍牙還不是官方的標準,是不同廠商所提供的,所以又差異。雖說目前正規(guī)的手機廠商基本上統(tǒng)一了藍牙協(xié)議,本游戲是基于 uuid 開發(fā)的,但是不同廠商又在此協(xié)議上進行自己的定義,所以使得這個版本的游戲不能像上面兩個版本一樣,只要能支持java 游戲的手機都可以玩。- 23 - 4.4.2 雙人對戰(zhàn)版的核心類及邏輯實現(xiàn)首先介紹 server類和 client 類,其實藍牙編程

60、類似于scoket編程,先是服務(wù)器端啟動,監(jiān)聽來自客戶端的信息,如果監(jiān)聽到客戶端的連接請求的話,則進行連接,客戶端啟動后,向服務(wù)端發(fā)送連接請求,如果被服務(wù)器端監(jiān)聽到了后,配合服務(wù)器連接。主要代碼如下:string connectionurl = btspp:/localhost:f0e0d0c0b0a000908070605040302010; + authenticate=false;encrypt=false;name=rfcomm server; local = localdevice.getlocaldevice(); local.setdiscoverable(discoveryagent.giac); notifier = (streamconnectionnotifier)connector.open (connectionurl); 這是服務(wù)器端的關(guān)鍵程序,啟動服務(wù)器后服務(wù)器端的標示地址。privatestaticfinal uuid echo_server_uuid = new uuid( f0e0d0c0b

溫馨提示

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

評論

0/150

提交評論