




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 基于j2me五子棋手機游戲開發(fā)摘要 基于j2me 技術(shù),設(shè)計并開發(fā)了一款五子棋手機游戲,程序?qū)嶒炄∮胘ava語言,便于游戲軟件的移植,采用手機模擬器進行模擬測試,便于檢查游戲功能的實現(xiàn)。在構(gòu)建了完善的游戲思維的基礎(chǔ)上,劃分功能模塊,實現(xiàn)整套游戲的開發(fā)。整個程序完成的功能是一個人機對戰(zhàn)的五子棋游戲,游戲的重點與難點在于計算機人工智能算法,總的來說就是根據(jù)棋型選擇最優(yōu)的點下子。關(guān)鍵詞 j2me;手機游戲;人工智能 abstract based on j2me technology, we designed and developed a mobile game backgammon, proce
2、dures, experimental access to java language, to facilitate the transplant games, mobile simulator used to simulate the test, easy to check the function of the realization of the game. construction of a perfect game in mind, based on division of function modules, to achieve complete game development.
3、 complete the whole process is the function of a human-computer play against a backgammon game, the game is important and difficult computer ai algorithms, in general is to choose the best according to point type chess erupted.key words j2me;games of mobile;artificial intelligence3目錄1. 前 言12.相關(guān)介紹22.
4、1 j2me簡介22.2 configuration和cldc22.3 手機游戲特點33.棋類游戲的相關(guān)探討43.1 邏輯層和表現(xiàn)層的分離43.2 自適應(yīng)尺寸和可移植性44.五子棋游戲的架構(gòu)54.1 事件驅(qū)動游戲54.2 游戲的類結(jié)構(gòu)54.3 游戲的流程74.4 五子棋的人工智能84.4.1 五子棋的獲勝組合84.4.2 設(shè)計獲勝棋型95.游戲設(shè)計與實現(xiàn)95.1 midlet簡介95.1.1 midlet生命周期105.1.3 firmidlet類代碼片斷125.2 游戲介紹表單的實現(xiàn)125.3 游戲設(shè)置表單的實現(xiàn)135.3.1 gauge與choicegroup組件介紹135.3.2 opt
5、ion類設(shè)計145.3.3 option類代碼片斷155.4 棋子dot類的實現(xiàn)165.5 對戰(zhàn)邏輯firlogic類的實現(xiàn)175.5.1 落子與悔棋175.5.2 棋型檢測的實現(xiàn)175.5.3 firlogic類代碼片斷195.6 游戲畫布205.6.1 canvas類介紹205.6.2 fircanvas類實現(xiàn)215.6.3 用戶輸入236. 結(jié)束語24參考文獻25致謝27基于j2me的五子棋手機游戲開發(fā)1. 前 言隨著手機網(wǎng)絡(luò)的日益進化,手機硬件性能的不斷提升,手機功能越來越多, 人們對于掌上數(shù)字娛樂的追求與日俱增,隨著越來越多的智能手機的上市,手機的功能已經(jīng)不再局限于收發(fā)短信、接聽電話
6、等人們的基本通信需求,手機的游戲功能得以彰顯。對于多媒體的支持,使得在手機上開發(fā)游戲應(yīng)用程序更加得心應(yīng)手,而且游戲的表現(xiàn)力也得到了極大的發(fā)揮。隨著計算機軟件技術(shù)的不斷發(fā)展,嵌入手機等移動設(shè)備的軟件開發(fā)逐漸出現(xiàn)了新的突破。java 技術(shù)的興起,解決了移動設(shè)備軟件開發(fā)固有的一些弊端,也使高級手機游戲的開發(fā)成為現(xiàn)實,其良好的跨平臺特性和面向?qū)ο蟮膬?yōu)勢在嵌入移動設(shè)備的軟件開發(fā)中顯示出了巨大的威力。而j2me(java 2 micro edition) 的誕生給高級手機游戲的開發(fā)又帶來了新的生機。j2me 技術(shù)用于手機游戲開發(fā),不但便于查看游戲運行過程中內(nèi)存的占用量和程序的每一部分代碼消耗了多少處理器時
7、間,而且可以不斷地優(yōu)化代碼,使用j2me 和midp 進行手機游戲開發(fā)已越來越受到人們的關(guān)注。忙碌的人們,在等車時、在公交車上、在偶爾的閑暇時間,掏出口袋中的手機,玩起手機游戲,短暫的娛樂使緊張的神經(jīng)得以放松,從而以更加良好的狀態(tài)投入到學(xué)習工作中去。本游戲主要的內(nèi)容是人機對戰(zhàn),先達到五子連株者為勝,棋盤大小范圍是10x10至20x20,游戲難度分為三等級(初階、中階和高階),玩家自行設(shè)置。玩家使用四個方向鍵的上(2)、下(8)、左(4)、右(6)來移動落子點位,移動到空白位置使用確定鍵(5)來落子,游戲過程中允許悔棋(最多連續(xù)悔5步)。整個程序完成的功能是一個人機對戰(zhàn)的五子棋游戲,游戲重點與難
8、點在于如何設(shè)計一套快速有效的人工智能算法,盡可能增加游戲的可玩性。本程序取用根據(jù)盤面形勢,判斷在某個位置落子后會形成什么棋型(如“五連”、“沖四”、“活三”等),然后通覽全盤選出最佳落子點的方法。2.相關(guān)介紹本次畢業(yè)設(shè)計采用了j2me技術(shù),java是目前占據(jù)優(yōu)勢的手機軟件開發(fā)技術(shù),并且它是一種開放平臺,這意味著可以開發(fā)一組代碼并使其在眾多的移動設(shè)備上運行。下面將述j2me的一些相關(guān)知識。2.1 j2me簡介sun公司將j2me(java 2 micro edition,java2微型版)定義為“一種以廣泛的消費性產(chǎn)品為目標、高度優(yōu)化的java運行時環(huán)境”。j2me是為了那些使用有限能源、有限網(wǎng)
9、絡(luò)連接(常常是無線連接),以及有限圖形用戶界面的設(shè)備而開發(fā)的。從1999年6月在java one developer conference上聲明之后,j2me便進入了小型設(shè)備開發(fā)的行列。當時,由于分布式編程深受java開發(fā)者團體的歡迎,大多數(shù)與會者都只對j2ee的功能感興趣。富有戲劇性的是,在隨后的兩年里,開發(fā)者意識到了運行java的小型組件同樣具有很高的價值,j2me逐步流行。j2me不只是一個單獨的技術(shù)規(guī)范,而是一系列技術(shù)規(guī)范的總稱。這些規(guī)范定義了java技術(shù)在資源限制的設(shè)備中的表現(xiàn)形式,而且新規(guī)范在不斷制訂當中,并且這些規(guī)范的制訂是完全向公眾開放的。目前所說的手機游戲其實是其中規(guī)范的一種
10、,即midp(移動信息設(shè)備規(guī)范),該規(guī)范應(yīng)用最為普通,因此習慣上也被人們籠統(tǒng)地稱為j2me技術(shù)。j2me主要應(yīng)用于手機等小型嵌入式設(shè)備,這些設(shè)備由不同的廠商設(shè)計生產(chǎn),功千差萬別。j2me在應(yīng)用于這些設(shè)備的同時也保留了java的傳統(tǒng)特性,即任何時間和任何地點的代碼都具有可移值性、部署靈活性、安全的網(wǎng)絡(luò)傳輸性,以及代碼穩(wěn)定性。2.2 configuration和cldcj2me 平臺是由配置(configuration) 和簡表( pro2 file) 構(gòu)成的。配置是提供給最大范圍設(shè)備使用的最小類庫集合,在配置中同時包含java 虛擬機。簡表是針對一系列設(shè)備提供的開發(fā)包集合。在j2me 中還有一個
11、重要的概念是可選包(optional package) ,它是針對特定設(shè)備提供的類庫,比如某些設(shè)備是支持藍牙的,針對此功能j2me 中制定了jsr82 (bluetoothapi) 提供了對藍牙的支持。目前,j2me 中有2 個最主要的配置, 分別是connected limited devices configuration (cldc) 和con2nected devices configuration (cdc) 。cldc 是兩個配置中較小的一個,為具有間斷性聯(lián)網(wǎng)能力、較慢的處理器和有限內(nèi)存的設(shè)備設(shè)計的。這些設(shè)備包括移動電話、雙工呼叫器和入門級的pda ,它們通常具有16 位或32 位
12、的cpu、128kb512kb 可用于java 平臺實現(xiàn)和相關(guān)應(yīng)用程序的內(nèi)存。cdc 是為處理能力較強、內(nèi)存空間更大、聯(lián)網(wǎng)能力更出色的設(shè)備設(shè)計的。這些設(shè)備包括電視機頂盒、車載娛樂系統(tǒng)、高端pda 等。cdc 包含一個具有完備特性的java 虛擬機,比cldc 更大的java se的子集。cdc 的目標設(shè)備通常具有32 位或64 位的處理器,2mb 以上的可用于java 平臺實現(xiàn)和相關(guān)應(yīng)用程序的內(nèi)存空間。2.3 手機游戲特點一個手機游戲應(yīng)該具有以下特征:易于學(xué)習:既然手機游戲面向的是普通消費者而不是計算機專家,那么他們不可能深入的學(xué)習游戲技巧。消費者不會花幾個小時去研究一個3 元的手動操作的游戲
13、。保持游戲的簡單是最基本的要求。可中斷性: 多任務(wù)處理是手機生活方式的基本特征。手機用戶常常在任務(wù)(如等一個電子郵件或者等車) 之間有一小段時間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使用的是同一個設(shè)備。所以一個好的手機游戲應(yīng)該提供短時間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換?;谟嗛?手機游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)和設(shè)計每個游戲都是昂貴的。如果一個手機游戲開發(fā)者要贏利的話,重要的是:同一個游戲引擎,多個標題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法。豐富的社會交互:不管一個游戲設(shè)計得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很
14、快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別的玩家合作以增強所玩游戲的智力和隨機性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會交互的游戲證明是成功的。3.棋類游戲的相關(guān)探討3.1 邏輯層和表現(xiàn)層的分離棋類游戲是移動設(shè)置比較擅長表現(xiàn)的游戲,相對于動作類游戲的快節(jié)奏,棋類游戲的特點就是玩起來速度慢,比較優(yōu)雅,主要來培養(yǎng)玩家在某方面的思考和判斷能力。棋類游戲的開發(fā)常常帶有人工智能算法,因此,需要注重邏輯層和表現(xiàn)層的分離。邏輯層處理所有的判斷、推算,可采用各種比較復(fù)雜的算法,而表現(xiàn)層則只管與玩家交互。3.2 自適應(yīng)尺寸和可移植性midp設(shè)備可能有不同的屏幕尺寸、不同的鍵盤布局以及不同的可用a
15、pi。在設(shè)計游戲時必須考慮這些不同點,以便獲得移值性最好的游戲軟件。游戲中所使用的棋盤大小是用戶設(shè)定的,尺寸也并非固定,而是應(yīng)用程序從系統(tǒng)獲得屏幕的尺寸,并進行計算得出,這些可以避免在屏幕上繪畫時對坐標使用的硬代碼。使用canvas類的getheight和getwidth方法能夠完成上述任務(wù)。此外,一個良好的做法是讓游戲既支持鍵盤操作也支持指針操作,這通常不需要增加太多的代碼,但可以提高游戲的可移值性。4.五子棋游戲的架構(gòu)五子棋游戲的架構(gòu)涉及游戲驅(qū)動、類結(jié)構(gòu)和流程的初步設(shè)計,由于人機對戰(zhàn)五子棋采用了人工智能算法,因此,還對獲勝棋型和攻守策略進行了探討。4.1 事件驅(qū)動游戲棋類游戲通常具備兩個重
16、要特性,首先是對戰(zhàn)雙方輪流落子,其次是落子間隔通常是不確定的,尤其是對戰(zhàn)后期,可能每一步棋都需要經(jīng)過深思熟慮,無論是人方或是計算機方,都無法對間隔時間有實現(xiàn)的預(yù)期?;谝陨蟽蓚€特性,本游戲摒棄了大多數(shù)游戲采用的線程或定時器驅(qū)動游戲的方法,而采用事件驅(qū)動的方法,即玩家的鍵盤或觸摸筆觸發(fā)游戲的下一步動作。事件驅(qū)動大大減少了不必要的工作量,只有玩家發(fā)出消息時,計算機才啟動運算,而在玩家思考期間,計算機不做任何運算和重繪操作。事件驅(qū)動的游戲循環(huán)如圖3.1:4.2 游戲的類結(jié)構(gòu)整個游戲共由六個類組成,如圖3.2所示。游戲的firmidlet類負責保持display對象,并且提供各屏幕之間的切換。整個程序
17、包含四個屏幕:游戲主屏幕表單,實際玩家進行游戲的fircanvas,提供某些關(guān)于游戲選項的option表單,以及一個用來顯示相關(guān)信息的about表單。此外,dot和firlogic類是分別用來構(gòu)造游戲棋子和算法邏輯的。圖4.1 事件驅(qū)動游戲循環(huán)圖4.2 類結(jié)構(gòu)4.3 游戲的流程游戲啟動時,firmidlet對象先顯示游戲主屏,在屏幕下方一側(cè)是退出軟鍵,另一側(cè)是用軟鍵構(gòu)成的菜單,菜單元素主要有“設(shè)置”和“關(guān)于”選項。當玩家選擇“設(shè)置”軟鍵時,則顯示游戲參數(shù)設(shè)置表單;當玩家選擇“開局”軟鍵時,則顯示游戲?qū)?zhàn)主屏;當玩家選擇“關(guān)于”軟鍵時,則顯示游戲介紹表單。玩家進入游戲參數(shù)設(shè)置表單,當玩家按下“確
18、定”軟鍵時,則確認當前游戲參數(shù),返回游戲主屏;當玩家按下“取消”軟鍵時,則放棄此次對游戲的修改,直接返回游戲主屏幕。玩家進入游戲?qū)?zhàn)畫布,對戰(zhàn)中畫布有兩個軟鍵,當玩家按下“退出”軟鍵時,則退出游戲;當玩家按下“悔棋”軟鍵時,則進行悔棋操作;當游戲結(jié)束時,“悔棋”軟鍵被換成“重玩”軟鍵。整個游戲的界面切換流程圖如圖3.3所示。圖4.3 游戲的界面切換游戲圖4.4 五子棋的人工智能人工智能也就是所謂的ai(artificial intelligence),它是一門很抽象的技術(shù)(或者也可以稱之為藝術(shù)),游戲中的ai可以在遵循一定規(guī)則的情況下,依程序設(shè)計者本身的思考邏輯制作。可以這樣認為,人工智能的核
19、心是使計算機具有自動處理事件的能力,而設(shè)計者的所有研究也應(yīng)該圍繞著這一方向進行。最常見的ai游戲就是棋盤式游戲。在這類游戲中,通常的策略類ai程序都是使計算機根據(jù)目前狀況計算所有可走的棋與可能的獲勝狀況,并計算當前計算機可走棋步的獲勝分數(shù)或者玩家可走棋步的獲勝分數(shù),然后再決定出一個最佳法。下面介紹一下五子棋的ai構(gòu)想。4.4.1 五子棋的獲勝組合在一場五子棋的游戲中,計算機必須要知道有哪些獲勝組合,因此我們必須求得獲勝組合的總數(shù)?,F(xiàn)在假定當前的棋盤為15x15:1) 計算水平方向的獲勝組合數(shù),每一列的獲勝組合是11,共15列,所以水平方向的獲勝組合數(shù)為:11x15=165。2) 計算垂直方向的
20、獲勝組合數(shù),每一行的獲勝組合是11,共15列,所以垂直方向的獲勝組合數(shù)為:11x15=165。3) 計算正對角線方向的獲勝組合數(shù),正對角線上的獲勝組合總數(shù)為11+(10+9+8+7+6+5+4+3+2+1)x2=121。 4) 計算反對角線方向的獲勝組合數(shù),反對角線上的獲勝組合總數(shù)為11+(10+9+8+7+6+5+4+3+2+1)x2=121。 這樣所有的獲勝組合數(shù)為:165+165+121+121=572。4.4.2 設(shè)計獲勝棋型我們已經(jīng)計算出了一個15x15的五子棋盤會有572種獲勝方式,這樣我們可以利用數(shù)組建立一些常規(guī)棋型,棋型主要作用是:判斷是否有任何一方獲勝;根據(jù)當前格局判斷最可能
21、的落子方式。然而在現(xiàn)實中,人們總結(jié)了很多能夠構(gòu)成獲勝棋型的“前奏” ,它們是通向勝利的捷徑,如“沖四” 、“活三” 、“雙三”等等。5.游戲設(shè)計與實現(xiàn)5.1 midlet簡介 midlet是用j2me apis開發(fā)的程序,用于移動計算環(huán)境中。midlet需要一個特殊的運行環(huán)境,這個環(huán)境主要包含一個應(yīng)用程序管理器,它為在移動設(shè)備上選擇和運行midlet提供方便。 5.1.1 midlet生命周期所有midlet都繼承自java.microedition.midlet.midlet,該類包含了midp平臺控制應(yīng)用程序執(zhí)行過程的方法。當midlet被初始化后就進入它的生命周期,該生命周期包含三種狀態(tài)
22、:激活態(tài)(active)、暫停態(tài)(paused)和銷毀態(tài)(destroyed),這三種狀態(tài)的控制完全由jam來完成。當出現(xiàn)狀態(tài)遷移時,jam會自動調(diào)用相應(yīng)的方法,midlet狀態(tài)遷移圖如4.1.1所示。圖5.1.1 midlet狀態(tài)遷移觸發(fā)的方法調(diào)用jam加載midlet后,首先進行初始化的工作,然后將狀態(tài)設(shè)置暫停態(tài),如果在初始化過程中沒有出現(xiàn)異常,那么將midlet的狀態(tài)設(shè)置為激活狀態(tài),否則將midlet的狀態(tài)設(shè)置為銷毀狀態(tài)。在每次狀態(tài)轉(zhuǎn)換的時候都要高用相應(yīng)的方法。5.1.2 主類firmidlet類的實現(xiàn)firmidlet類繼承了midlet類,負責程序的啟動和屏幕切換,該類用高級界面中的
23、軟鍵來實現(xiàn)游戲菜單,在不同的手機上,軟鍵可能有不同的分布。firmidlet類的uml圖如圖4.1.2(1)所示,主界面如圖4.1.2(2)與4.1.2(3)所示。圖5.1.2 firmidlet類的uml圖 圖5.1.2 (2) 初屏 圖5.1.2 (3) 按下菜單后的屏幕5.1.3 firmidlet類代碼片斷/構(gòu)建主屏表單public firmidlet() display=display.getdisplay(this); form=new form(null); try imgsplash=image.createimage(/theme.png);/加載屏幕圖片 catch(ioe
24、xception e) imgsplash=image.createimage(1, 1); form.append(imgsplash); cmd_exit=new command(退出,7,1); /創(chuàng)建退出軟鍵 cmd_go=new command(開局,4,2); /創(chuàng)建開局軟鍵 cmd_option=new command(設(shè)置,1,3);/創(chuàng)建設(shè)置軟鍵 cmd_about=new command(關(guān)于,5,3);/創(chuàng)建關(guān)于軟鍵 form.addcommand(cmd_exit); /將退出軟鍵添加到主表單 form.addcommand(cmd_go); /將開局軟鍵添加到主表單
25、form.addcommand(cmd_option); /將設(shè)置軟鍵添加到主表單 form.addcommand(cmd_about); /將關(guān)于軟鍵添加到主表單 form.setcommandlistener(this); /監(jiān)聽主表單軟鍵事件 mycanvas=new fircanvas(this); /創(chuàng)建畫布 options=new options(this); /創(chuàng)建設(shè)置表單 about=new about(this); /創(chuàng)建關(guān)于表單5.2 游戲介紹表單的實現(xiàn) about是游戲介紹表單類,主要是向玩家闡述五子棋的一些信息。其uml圖如4.2(1)所示,游戲截圖如4.2(2)所示。
26、圖5.2(1) about類的uml圖圖5.2(2) 關(guān)于表單界面5.3 游戲設(shè)置表單的實現(xiàn)游戲設(shè)置表單option類用來對游戲的參數(shù)進行設(shè)置,包括棋盤大小,游戲難度,是否先手,過程中使用了gauge和choicegroup兩種高級用戶界面組件。5.3.1 gauge與choicegroup組件介紹gauge組件實現(xiàn)了一個圖形標尺,通常被用來表示一個過程的進展情況或者一些系列數(shù)字的選擇情況。gauge的構(gòu)造方法根據(jù)指定的標簽、交互模式、最大值、初始值生成一個新的gauge對象,原型如下:gauge(string label,boolean interactive,int maxvalue,in
27、t initialvalue)l gauge構(gòu)造方法有4個參數(shù):label、interactive、maxvalue、initialvaluel 參數(shù)label用作label對象的標簽,設(shè)置為null表示標簽為空l 參數(shù)interactive是一個boolean變量,表示這個gauge對象的交互模式,設(shè)置為true表示交互模式,即用戶可以改變gauge對象的值:如果設(shè)置為flase,則表示非交互模式,即用戶不可以改變gauge的值。l 參數(shù)maxvalue是一個大于0的整數(shù),表示gauge對象的最大值(gauge值的范圍為0,maxvalue)。這個值必須大于0,否則會拋出illegaargu
28、mentexception。l 參數(shù)initialvalue是一個整數(shù)值,表示gauge對象的初始值,它的范圍是0,maxvalue。如果initialvalue小于0,則gauge對象的初始值被設(shè)置為0;如果initialvalue大于maxvalue,則被設(shè)置為maxvalue。choicegroup組件用來構(gòu)造選擇框,棋構(gòu)造方法如下:choicegroup(string label,int choicetype)該構(gòu)造方法有兩個參數(shù),其中參數(shù)label用來設(shè)置此選項組的標簽。label可以設(shè)置為null,表示此item對象的標簽為空白。構(gòu)造完成后,還可以使用setlabel方法和getl
29、abel方法來分別設(shè)置和獲取對象的標簽。參數(shù)choicetype用來設(shè)置choicegroup的類型,choicegroup類繼承了choise接口的三種類型:l exclusive,值為1,一次只有一個元素被選擇。l multiple,值為2,一次可以有多個元素被選擇。l implicit,值為3,類似軟鍵菜單或者按鈕,當被選擇時,立即觸發(fā)command事件。l popup,值為4,彈出式菜單,當被選擇時,彈出選項。5.3.2 option類設(shè)計該類實現(xiàn)游戲參數(shù)的設(shè)置,其uml圖如圖4.3.2(1)所示,游戲截圖如4.3.2(2)所示。圖5.3.2 (1) option類的uml圖圖5.3.
30、2 (2) 設(shè)置表單界面5.3.3 option類代碼片斷/保存記錄的方法public void saveoptions() try recordstore rs=recordstore.openrecordstore(options, true);/打開記錄,如果沒有則創(chuàng)建 byte bs=new byte3; bs0=(byte)boardsize; /棋盤大小 bs1=(byte)(iscomputerfirst?1:0); /先手 bs2=(byte)degree; /難度 if(rs.getnumrecords()0) /如果有記錄則id為1的記錄內(nèi)容為當前參數(shù) rs.setreco
31、rd(1,bs,0,3); else rs.addrecord(bs,0,3); /如果不存在記錄,則添加新記錄,內(nèi)容為當前的參數(shù) rs.closerecordstore(); /關(guān)閉記錄 catch(recordstoreexception e) 5.4 棋子dot類的實現(xiàn)dot類代表了現(xiàn)實中的棋子,該類主要和于記錄棋子的位置和檢查落子的合法性(是否越界)。五子棋是一個二維棋類游戲,所以首先想到的是定義一個dot類來表示棋子??紤]到移動設(shè)備的資源有限,以及盡可能減少系統(tǒng)資源占用,程序不在下每一步棋時生成一個對象,而是在游戲進行時,玩家或者計算機每下一步棋,在數(shù)組相應(yīng)位置生成該棋子的對象,而將
32、已經(jīng)下過的棋子保存到數(shù)組中隨時檢索,這樣可以避免過多的棋子對象占用系統(tǒng)內(nèi)存。dot類的uml圖如4.4所示。圖5.4 dot類的uml圖5.5 對戰(zhàn)邏輯firlogic類的實現(xiàn)firlogic類是整個游戲的邏輯類,包含了人工智能算法,這些算法主要體現(xiàn)在對各種棋型的檢測并計算一個最佳的落子點。除此之外,該類還處理雙方落子功能和悔棋功能,判斷是否游戲結(jié)束,誰是勝利者。5.5.1 落子與悔棋當對戰(zhàn)某一方在棋盤上落子時,就將棋盤數(shù)組的相應(yīng)位置設(shè)置為該方代碼(計算機方為1,玩家方為2)。雙方落子后,程序人使用一個dot類棋子對象來記錄最后一步棋的位置,當玩家下了一步棋后需要將上一步重新繪制,以消除棋子上
33、的引導(dǎo)框。此外,還使用堆棧來存儲最近的10步棋,以便玩家悔棋。為了實現(xiàn)悔棋功能,該程序采用了堆棧來存儲最近的棋子,當玩家取用悔棋功能時,程序就會將堆棧里的頭兩步棋的對象移出,這時本來位于第三的棋子對象就變成了棧頂,然后將棧頂?shù)钠遄釉O(shè)置為最后一步,并重新繪制棋盤。5.5.2 棋型檢測的實現(xiàn)connectedin1d方法用于檢測棋盤上任意一點在指定方向上的同類棋子相連個數(shù),傳入落子方標志(區(qū)分計算機還是玩家)、檢測位置的行列坐標和檢測方向,返回在該方向上相連棋子的個數(shù),若檢測到對方棋子或者空白棋面則停止檢測。connectedin8d方法是基于connectedin1d方法的一個升級方法,是對8個
34、方向都進行檢測,最終返回一個整型的數(shù)組,后面用cdi表示。expandedin1d方法跟connectedin1d方法相似,不同的是expandedin1d方法是檢測自己棋子以及空白棋子(最多連續(xù)四空白點)的個數(shù),當遇上敵方棋子,棋子邊緣或連續(xù)5點空白棋子,則停止檢測。expandedin8d方法是基于expandedin1d方法的一個升級方法,是對8個方向都進行檢測,最終返回一個整型的數(shù)組,后面用edi表示。設(shè)計好connectedin8d和expandedin8d方法后,即可輕松地檢測棋型。當執(zhí)行connectedin8d方法得到一個等于5的值時,則檢測到五子連株的棋型,這時游戲結(jié)束,通過
35、連株的落子代碼可以判斷出誰是贏家。“活四”是五子棋中常見的棋型,在下棋的過程中經(jīng)常遇到,有兩個點能形成“連五”的四就是活四。觀察“活四”的棋型,可以發(fā)現(xiàn),如果在某點落子能形成該棋型,那么加上自身落子,同類棋子的連續(xù)數(shù)目將大于等于4(事實上,大于4的情況已經(jīng)被“連五”運算檢測出),并且兩端留有空白區(qū)域,即(edicdi&edi+4cdi+4)。只有一個點可以形成“連五”的四叫做“沖四”,也叫做“單四” 。已方再落一子便能成為“活四”的三叫做“活三” ,分為“連活三”和“跳活三”兩種情況。“雙四” 、“四三”與“雙三” ,其檢測原理為:在某一空白點,如果落下已方的棋子,并且在不同方向分別檢測出“沖
36、四”或者“活三” ,那么判斷為存在“雙四” 、“四三”或“雙三”情況。該程序是通過棋型檢測來作出最佳的落子點,棋型檢測順序為:已方是否存在“五連” ,敵方是否存在“五連” ,已方是否存在“活四” ,敵方是否存在“活四” ,已方是否存在“雙四” ,敵方是否存在“雙四” ,已方是否存在“四三” ,敵方是否存在“四三” ,已方是否存“雙三” ,敵方是否存在“雙三” ,已方是否存在“活三” ,敵方是否存在“活三” 。按上述順序?qū)謩葸M行檢測,若檢測出相應(yīng)的棋型就在該點落子。如果不存在任何棋型,就遵從評分的方式來落子。棋規(guī)則是:計算指定位置在某個方向上的得分,從指定位置向某個方向逐步移動,在移動過程中發(fā)
37、現(xiàn)已方棋了,得分權(quán)重為5;若發(fā)現(xiàn)敵方棋子,得分權(quán)重為3;若發(fā)現(xiàn)空白點,得分權(quán)重為1。該位置的得分還與移動的步長有關(guān),離出發(fā)位置越遠其影響力越小,步長的計算公式為:gain=(boardsize-step)/2,其中boardsize為棋盤的大小,step為步長值。最后得分最高的點為最佳點,則在該點落子。 下面是firlogic類的uml圖。圖5.5.1firlogic類的uml圖5.5.3 firlogic類代碼片斷/檢測連續(xù)棋子數(shù)目的方法private int connectedin1d(int player,int row,int col,int direction) int n=0; d
38、ot d=new dot(row,col); /在當前位置創(chuàng)建棋子 do d.copyfrom(moveonestep(d,direction); /返回在指定方向上移動后的棋子 if(d.isinboard(boardsize) & tabled.rowd.col=player) /移動后依然在棋盤上有同類的棋子 n+; /計數(shù)器加1 else return n; while(true);/檢測連續(xù)棋子與空白點(最多連續(xù)4點)數(shù)目的方法private int expandedin1d(int player,int row,int col,int direction) int n=0; /檢測
39、計數(shù)器 int c=0; /循環(huán)記數(shù)器 dot d=new dot(row,col); /在當前位置創(chuàng)建棋子 while(c4) d.copyfrom(moveonestep(d,direction); /返回在指定方向上移動后的棋子 if(!d.isinboard(boardsize) /如果超出棋盤則終止檢測 break; int p=tabled.rowd.col; /獲取棋盤在該位置的狀態(tài) if(p=0) /如果移動后的位置是空白 c+; /循環(huán)記數(shù)器就加1 if(p!=player&p!=0) /如果遇見對手棋子,則停止檢測 break; n+; return n; 5.6 游戲畫布
40、游戲畫布是人機對戰(zhàn)的交互界面。5.6.1 canvas類介紹canvas類的主要功能在于對低層用戶事件的處理,包括按鍵事件和指針事件,它負責監(jiān)聽這些事件,并做出相應(yīng)的處理。除此之外,canvas類還定義了屏幕屬性、全屏的運行模式以及后臺運行的功能,其主要方法如表4.6.1。表5.6.1 canvas類主要方法方法名稱返回值類型參數(shù)類型含義說明getgameactionintint獲得與游戲鍵相關(guān)的鍵碼getkeycodeintint獲得鍵碼keypressedvoidint按鍵被按下所觸發(fā)的方法keyreleassedvoidint按鍵被釋放時所觸發(fā)的方法keyrepeatedvoidint按
41、鍵被重復(fù)按下時所觸發(fā)的方法painvoidgraphics繪制屏幕的方法canvas類是displayable類的子類,使用setcurrent方法,將canvas類的實例設(shè)置為當前的屏幕。因為canvas類本身并不提供具體繪制屏幕的過程,它需要依靠一個抽象的方法向系統(tǒng)提供一個繪制屏幕的過程,這個方法就是pain,它具體定義了圖形繪制的過程。由此可以canvas類只是屏幕繪制的一個中介,graphic類完成了繪制的過程。5.6.2 fircanvas類實現(xiàn)fircanvas類繼承了canvas類,負責游戲界面的繪制,包括棋盤、棋子和狀態(tài)提示。該類主要負責獲取用戶輸入,根據(jù)屏幕大小計算棋盤,繪制
42、屏幕等。繪制方法:首先是繪制棋盤,在繪制區(qū)域用底色填充,然后逐條繪制行和列線條。根據(jù)是否計算機先行設(shè)置計算機和玩家的顏色,確保先手的棋子為黑色。根據(jù)gettable返回的數(shù)組繪制棋盤的棋子,并在最后一步棋的位置繪制引導(dǎo)框。其uml圖和游戲截圖如下:圖5.6.2 (1)fircanvas類的uml圖 圖5.6.2 (2) 游戲截圖5.6.3 用戶輸入游戲支持鍵盤輸入和指針輸入。當游戲并未結(jié)束且計算機方不在思考當中時,玩家可以選擇空白處落子。落子后,首先將上一步棋子重新繪制,消除引導(dǎo)框。引導(dǎo)框?qū)⒏S玩家的方向移動,當按下確認鍵后,則調(diào)用落子方法,進行玩家落子。按鍵輸入表如下:表5.6.3用戶輸入表
43、按鍵作用left或按鍵4左移right或按鍵6右移up或按鍵2上移down或按鍵8下移fire或按鍵5確認用戶輸入代碼:protected void keypressed(int keycode) if(!logic.isgameover&!logic.isthinking) int bs=boardsize; dot lastdot=logic.lastdot(); int r=lastdot.row; int c=lastdot.col; repaintat(r,c); int input=getgameaction(keycode); /將鍵盤碼轉(zhuǎn)化為游戲動作 if(input=canv
44、as.left|keycode=52) /用戶按下左鍵 if(-cbs-1) /列加1 c=0; lastdot.setrowcol(r, c); repaintat(r,c); else if(input=canvas.up|keycode=50) /用戶按下上鍵 if(-rbs-1) /行加1 r=0; lastdot.setrowcol(r, c); repaintat(r,c); else if(input=canvas.fire|keycode=53) /用戶按下確定鍵 logic.mango(r, c); /玩家落子 6. 結(jié)束語基于j2me 技術(shù),設(shè)計并開發(fā)了一款嵌入式棋牌類手機游戲,最終整套游戲以人機對戰(zhàn)方式完成,先達到五子連株者為贏家。游戲
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆云南省昆明市祿勸縣一中高三二診模擬考試化學(xué)試卷含解析
- 人工智能在智能交通系統(tǒng)中的應(yīng)用
- 黑龍江省哈爾濱市第十九中學(xué)2025屆高三沖刺模擬化學(xué)試卷含解析
- 河南省重點高中2025屆高三3月份模擬考試化學(xué)試題含解析
- 吉林省通榆縣第一中學(xué)2025屆高考沖刺模擬化學(xué)試題含解析
- 2025年醫(yī)用手套項目發(fā)展計劃
- 2025年異環(huán)磷酰胺合作協(xié)議書
- 宣傳防疫知識工作總結(jié)
- 2025年廢舊材料回收加工項目建設(shè)方案
- 四年級數(shù)學(xué)(四則混合運算帶括號)計算題專項練習與答案匯編
- 2023年第十五屆“藍橋杯”科學(xué)素養(yǎng)考試題庫及答案
- GeomagicDesignX教程教學(xué)課件
- 英語:Unit 6 Entertainment and Friendship教案(仁愛英語九年級下)
- 安寧療護個案護理匯報
- 國家智慧教育平臺培訓(xùn)課件
- 正大天虹方矩管鍍鋅方矩管材質(zhì)書
- 高層建筑火災(zāi)自動噴水滅火系統(tǒng)
- 高超聲速飛行技術(shù)
- 小學(xué)教育課件教案中國文化名人與他們的故事
- 中層競聘的演講課件
- 非煤礦山頂板分級管理制度范本
評論
0/150
提交評論