版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
/4.系統(tǒng)總體設(shè)計(jì)和實(shí)現(xiàn)4.1總體設(shè)計(jì)分析總體設(shè)計(jì)是軟件開(kāi)發(fā)過(guò)程中的另一個(gè)重要階段,在這一階段中將依據(jù)需求分析中提出的邏輯模型,科學(xué)合理地進(jìn)行物理模型的設(shè)計(jì)。這個(gè)階段的主要目標(biāo)是將反映用戶信息需求的邏輯方案轉(zhuǎn)換成物理方案,并為下一階段供應(yīng)必要的技術(shù)資料。4.1.1總體設(shè)計(jì)原則(1)整體性:軟件是作為統(tǒng)一整體而存在的。因此,在總體設(shè)計(jì)中要從整個(gè)軟件的角度進(jìn)行考慮。(2)敏捷性:為保持軟件許久的生命力,要求該手機(jī)嬉戲軟件具有很強(qiáng)的環(huán)境適應(yīng)性。為此,嬉戲軟件應(yīng)具有較好的開(kāi)放性和結(jié)構(gòu)的可變性。(3)牢靠性:牢靠性是指軟件抵擋外界干擾的實(shí)力及受外界干擾時(shí)的復(fù)原實(shí)力。(4)經(jīng)濟(jì)性:經(jīng)濟(jì)性是指在滿意嬉戲軟件需求的前提下,盡可能地減小嬉戲軟件的開(kāi)銷。4.1.2軟件模塊總體設(shè)計(jì)軟件中各模塊之間的關(guān)系通常利用層次圖來(lái)表示。它是一種一系列多層次的用樹(shù)形結(jié)構(gòu)的矩形框描繪數(shù)據(jù)的層次結(jié)構(gòu)框圖。一個(gè)單獨(dú)的矩形框作為樹(shù)形結(jié)構(gòu)的頂層,各個(gè)數(shù)據(jù)的子集由下面的各層矩形框代表,最底層的各個(gè)矩形框代表組成這個(gè)數(shù)據(jù)的實(shí)際數(shù)據(jù)元素(不能再分割的元素),它代表完整的數(shù)據(jù)結(jié)構(gòu)。這模式特別適合于需求分析階段的須要,層次方框圖對(duì)數(shù)據(jù)結(jié)構(gòu)描繪隨著結(jié)構(gòu)精細(xì)化也越來(lái)越具體。反復(fù)細(xì)化沿著圖中每條路徑,從對(duì)頂層信息的分類起先,直到確定了數(shù)據(jù)結(jié)構(gòu)的全部細(xì)微環(huán)節(jié)為止。圖4-1嬉戲功能結(jié)構(gòu)本探討中將嬉戲軟件分為三大模塊,如圖4-1所示,包括:嬉戲選項(xiàng)、嬉戲設(shè)置和幫助。依據(jù)在調(diào)研中搜集的資料對(duì)每個(gè)模塊的功能進(jìn)行編排制作。依據(jù)上述功能的分析,本探討中,將嬉戲軟件在三大模塊的基礎(chǔ)上又對(duì)每一大模塊又分為幾個(gè)子模塊:嬉戲選項(xiàng)包括六個(gè)模塊:起先嬉戲、重新嬉戲、悔棋、認(rèn)輸、背景音樂(lè)和退出嬉戲。嬉戲設(shè)置包括三個(gè)模塊:先后手設(shè)置、棋盤(pán)底紋顏色設(shè)置和棋盤(pán)大小設(shè)置。幫助包括兩個(gè)模塊:嬉戲幫助和關(guān)于。4.2嬉戲設(shè)計(jì)4.2.1嬉戲前的打算本嬉戲在開(kāi)發(fā)之前須要做一些前期打算工作,尤其是對(duì)于精通五子棋嬉戲的Java嬉戲開(kāi)發(fā)者來(lái)說(shuō)。通常狀況下,一款運(yùn)用起來(lái)比較嫻熟地J2ME開(kāi)發(fā)工具是必不行少的。本嬉戲運(yùn)用的是J2ME的簡(jiǎn)化開(kāi)發(fā)工具SunJava(TM)WirelessToolkit2.5.2forCLDC,他需先將Java虛擬機(jī)安裝調(diào)試好之后才能運(yùn)用。WTK2.5.2不帶有文本編輯功能,所以須要另尋搭配運(yùn)用。本嬉戲采納UltraEdit進(jìn)行編輯。本嬉戲須要幾張后綴名為.png格式的卡通圖,除了一張用作五子棋嬉戲的Logo外,其余的都將在嬉戲中運(yùn)用。4.2.2嬉戲界面和事務(wù)驅(qū)動(dòng)設(shè)計(jì)嬉戲的界面設(shè)計(jì)實(shí)行傳統(tǒng)嬉戲界面風(fēng)格,如圖4-2所示。嬉戲設(shè)計(jì)中采納傳統(tǒng)界面嬉戲風(fēng)格,首先啟動(dòng)嬉戲,然后進(jìn)入嬉戲起先界面,界面中放置“設(shè)置”、“開(kāi)局”、“幫助”、“關(guān)于”四個(gè)選項(xiàng)供玩家選擇。其中“設(shè)置”選項(xiàng)主要是對(duì)嬉戲的相關(guān)功能進(jìn)行設(shè)置,如嬉戲難度設(shè)置。另外還有“悔棋”、“重玩”等項(xiàng)目的設(shè)置。除此之外還包括查看嬉戲幫助、嬉戲介紹等。圖4-2嬉戲界面設(shè)計(jì)所謂事務(wù)驅(qū)動(dòng),簡(jiǎn)潔地說(shuō)就是你點(diǎn)什么按鈕(即產(chǎn)生什么事務(wù)),電腦執(zhí)行什么操作(即調(diào)用什么函數(shù))。當(dāng)然事務(wù)不僅限于用戶的操作。我們知道,事務(wù)是事務(wù)驅(qū)動(dòng)的核心自然是。從事務(wù)角度說(shuō),一個(gè)事務(wù)收集器、一個(gè)事務(wù)發(fā)送器和一個(gè)事務(wù)處理器組成了事務(wù)驅(qū)動(dòng)程序的基本結(jié)構(gòu)。事務(wù)收集器特地負(fù)責(zé)收集包括來(lái)自硬件的(如時(shí)鐘事務(wù)等)、來(lái)自用戶的(如鍵盤(pán)、鼠標(biāo)事務(wù)等)及來(lái)自軟件的(如應(yīng)用程序本身、操作系統(tǒng)等)的全部事務(wù)。將收集器收集到的事務(wù)分發(fā)到目標(biāo)對(duì)象中則由事務(wù)發(fā)送器負(fù)責(zé)完成。具體的事務(wù)響應(yīng)工作則由事務(wù)處理器完成,它須要運(yùn)用虛函數(shù)機(jī)制(函數(shù)名取為類似于HandleMsg的一個(gè)名字),它往往要到實(shí)現(xiàn)階段才完全確定。事務(wù)處理器對(duì)于框架的運(yùn)用者來(lái)說(shuō)是他們唯一能夠看到的。棋類嬉戲通常具備兩個(gè)重要特性,首先是對(duì)戰(zhàn)雙方輪番落子,其次是落子間隔通常是不確定的,尤其是對(duì)戰(zhàn)后期,可能每一步棋都要經(jīng)過(guò)深思熟慮,無(wú)論是人還是計(jì)算機(jī),都無(wú)法對(duì)時(shí)間間隔有事先的預(yù)期?;谝陨蟽蓚€(gè)特性,本嬉戲摒棄了大多數(shù)嬉戲采納的線程或定時(shí)器驅(qū)動(dòng)嬉戲的方法,而采納了事務(wù)驅(qū)動(dòng)的方法,即玩家的鍵盤(pán)或觸摸筆觸發(fā)嬉戲的下一個(gè)動(dòng)作。事務(wù)驅(qū)動(dòng)大大削減了不必要的工作量,只有玩家發(fā)出消息時(shí),計(jì)算機(jī)才啟動(dòng)運(yùn)算,而在玩家思索期間,計(jì)算機(jī)不做任何運(yùn)算和重繪操作。4.2.3嬉戲的類設(shè)計(jì)五子棋嬉戲?qū)儆诙S棋類嬉戲,因此可以定義一個(gè)Chesses類來(lái)表示棋子,用一個(gè)Chess類型的二維數(shù)組來(lái)包含棋盤(pán)上的全部棋子,對(duì)于該棋子玩家的區(qū)分運(yùn)用Chesses的boolean型的變量isPlayer1來(lái)區(qū)分??梢钥紤]干脆生成數(shù)組的每一個(gè)對(duì)象而不是在數(shù)組建立后,而是把每一個(gè)棋子對(duì)象(Chesses)放在嬉戲的進(jìn)行中生成,這主要是考慮到移動(dòng)設(shè)備的資源有限,盡可能削減系統(tǒng)資源占用。這樣在嬉戲進(jìn)行時(shí),可以避開(kāi)還沒(méi)有下的棋子在一起先就占用了系統(tǒng)內(nèi)存,玩家每下一步棋,在數(shù)組相應(yīng)位置生成該棋子的對(duì)象。對(duì)于嬉戲中的每一類的設(shè)計(jì),首先就是一個(gè)MIDlet類,Gobang類繼承自MIDlet類,通過(guò)方法startApp,pauseApp,destroyApp來(lái)通知嬉戲的起先,暫停和銷毀結(jié)束,用于連接設(shè)備的應(yīng)用程序管理器(ApplicationManager)。本嬉戲共由7個(gè)類組成,它們各自的功能如下:(1)GobangMIDlet類負(fù)責(zé)程序的啟動(dòng)和屏幕之間的切換;(2)GobangCanvas類玩家的對(duì)戰(zhàn)平臺(tái),他繼承于Canvas類;(3)Setting類用于創(chuàng)建嬉戲的各項(xiàng)設(shè)置參數(shù)表單;(4)GobangLogic類嬉戲的邏輯類,負(fù)責(zé)輸贏推斷和計(jì)算機(jī)落子;(5)Dot類棋子類,包含了棋子的位置信息;(6)Help類嬉戲的幫助類,包含五子棋的一些常識(shí)信息和五子棋教學(xué)內(nèi)容;(7)About類嬉戲的關(guān)于類,包含嬉戲的版本、版權(quán)等信息。各個(gè)類之間的關(guān)系如圖4-3所示:圖4-3嬉戲類設(shè)計(jì)4.2.4嬉戲的流程設(shè)計(jì)對(duì)于棋盤(pán)界面的更新,嬉戲進(jìn)行繪制棋子時(shí)是依據(jù)棋子的二維數(shù)組來(lái)完成的,玩家下棋后,設(shè)置isPlayer1值,程序修改數(shù)組相應(yīng)位置,然后重新繪制(repaint)。為了使嬉戲的操作盡可能的簡(jiǎn)便,本文設(shè)計(jì)上不在嬉戲進(jìn)入時(shí)設(shè)計(jì)菜單,玩家可以干脆起先對(duì)戰(zhàn),而是在起先嬉戲的過(guò)程中設(shè)置重新起先和退出的按鈕。即一鍵起先,運(yùn)行即玩,重來(lái)或退出都運(yùn)用一鍵操作。嬉戲流程的設(shè)計(jì)依據(jù)主要是嬉戲的界面設(shè)計(jì)和嬉戲的類的設(shè)計(jì)。嬉戲啟動(dòng)時(shí),GobangMIDlet對(duì)象先顯示嬉戲的主屏幕,在屏幕下方一側(cè)是出軟鍵(軟鍵指描述抽象客戶端設(shè)備如何顯示),另一側(cè)是用軟件構(gòu)成的菜單,菜單元素主要有“開(kāi)局”、“嬉戲設(shè)置”、“嬉戲幫助”、“關(guān)于”選項(xiàng)。當(dāng)玩家選擇“嬉戲設(shè)置”軟鍵時(shí),則顯示嬉戲參數(shù)設(shè)置表單;當(dāng)玩家選擇“開(kāi)局”軟鍵時(shí),則顯示嬉戲?qū)?zhàn)主界面;當(dāng)玩家選擇“嬉戲幫助”軟鍵時(shí),則顯示嬉戲幫助表單;當(dāng)玩家選擇“關(guān)于”軟鍵時(shí),則顯示嬉戲關(guān)于表單。玩家進(jìn)入嬉戲參數(shù)設(shè)置表單,當(dāng)玩家按下“確定”軟鍵時(shí),則確認(rèn)當(dāng)前嬉戲參數(shù),返回嬉戲主屏幕;當(dāng)玩家按下“取消”軟鍵時(shí),則放棄此次對(duì)嬉戲的修改,干脆返回嬉戲主屏幕。玩家進(jìn)入嬉戲?qū)?zhàn)畫(huà)布,對(duì)戰(zhàn)中畫(huà)布有兩個(gè)軟鍵,當(dāng)玩家按下“返回主菜單”軟鍵時(shí),則退出嬉戲到達(dá)嬉戲主菜單;當(dāng)玩家按下“悔棋”軟鍵時(shí),則進(jìn)行悔棋操作;當(dāng)嬉戲結(jié)束時(shí),“悔棋”軟鍵被換成了“重玩”軟鍵。玩家進(jìn)入嬉戲介紹表單,當(dāng)玩家按下“確定”軟鍵時(shí),返回嬉戲主屏幕。4.2.5嬉戲算法的設(shè)計(jì)1、五子棋的獲勝組合有哪些獲勝組合是在一場(chǎng)五子棋的嬉戲中計(jì)算機(jī)必須要知道的,因此,獲勝組合的總數(shù)必須要求得。在本文中我們假定當(dāng)前的棋盤(pán)為15*15:(1)每一列的獲勝組合是11,共15列,計(jì)算水平方向的獲勝組合數(shù),所以水平方向的獲勝組合數(shù)為:11*15=165。(2)每一行的獲勝組合是11,共15列,則可計(jì)算垂直方向的獲勝組合總數(shù),垂直方向的獲勝組合數(shù)為:11*15=165。(3)同理,可計(jì)算正對(duì)角線方向的獲勝組合總數(shù),正對(duì)角線上的獲勝組合總數(shù)為11+(10+9+8+7+6+5+4+3+2+1)*2=121。(4)計(jì)算反對(duì)角線上的獲勝組合總數(shù)。計(jì)算反對(duì)角線方向的獲勝組合總數(shù)可計(jì)算為11+(10+9+8+7+6+5+4+3+2+1)*2=121。這樣可計(jì)算得全部的獲勝組合數(shù)為:165+165+121+121=572。2、設(shè)計(jì)獲勝棋型通過(guò)上面的計(jì)算,一個(gè)15*15的屋子棋盤(pán)在此已經(jīng)計(jì)算出了會(huì)有572中獲勝方式,因此,我們就可以利用數(shù)組建立一些常規(guī)棋型,棋型的主要作用是:(1)推斷是否有任何一方獲勝;(2)依據(jù)當(dāng)前格局推斷最可能的落子方式。然而在現(xiàn)實(shí)中,高手留給我們的閱歷就是把握前奏,如“沖四”、“活三”,除了“連五”以外,這些也是同向成功的捷徑。3、攻擊和防守獲勝棋型的算法是中性的,不區(qū)分計(jì)算機(jī)和玩家,這就涉及到攻擊和防守何者優(yōu)先的問(wèn)題。而很多高手都認(rèn)為五子棋的根本是“防守”,“攻擊”是靈魂。進(jìn)攻是取勝的手段,是防守的持續(xù)和發(fā)展。很多閱歷和探討表明,一個(gè)棋手只要駕馭了全面的、基本的防守原理和技巧,就能和比自己棋力高一個(gè)等級(jí)的進(jìn)攻型選手對(duì)抗,至少能立于不敗之地。對(duì)手進(jìn)過(guò)越偏激,則防守的效果越好。沒(méi)有進(jìn)攻的防守就像只開(kāi)花不結(jié)果,沒(méi)有實(shí)際意義,堅(jiān)韌的防守是反攻的前奏,沒(méi)有進(jìn)攻的持續(xù),防守也失去了價(jià)值。而這缺一不行。依據(jù)以上原理,計(jì)算機(jī)在接受最佳的攻擊位置之前,還要計(jì)算當(dāng)前玩家的最佳攻擊位置。假如玩家存在最佳攻擊位置,那么計(jì)算機(jī)就將下一步的棋子擺在玩家的最佳攻擊位置上以阻擋玩家的進(jìn)攻,否則計(jì)算機(jī)便將棋子下在自己的最佳攻擊位置上進(jìn)行攻擊。4、用到的典型算法(1)坐標(biāo)變換算法嬉戲的實(shí)質(zhì)其實(shí)是對(duì)所下棋子的位置進(jìn)行操作和推斷,因此將己方、對(duì)方以及棋盤(pán)上空點(diǎn)的位置坐標(biāo)存儲(chǔ)在相應(yīng)的List中。我對(duì)所下棋子的坐標(biāo)進(jìn)行了處理,因?yàn)槲宜杉{的棋盤(pán)為15*15,所以棋子橫坐標(biāo)為0到14的整數(shù),縱坐標(biāo)也為0到14的整數(shù)。因此,每次在棋盤(pán)上下子之后,計(jì)算機(jī)在存儲(chǔ)該點(diǎn)的坐標(biāo)時(shí),便要對(duì)坐標(biāo)進(jìn)行加工。假設(shè)左上角點(diǎn)為firstPoint,它的實(shí)際坐標(biāo)為(x1,y1),而我是將它作為(0,0)存儲(chǔ)的,其它的坐標(biāo),其它點(diǎn)都是以該點(diǎn)為標(biāo)準(zhǔn)進(jìn)行變換的,假設(shè)棋盤(pán)上每個(gè)格子的寬度為w,某實(shí)際點(diǎn)為(x2,y2),變換后的坐標(biāo)為(x,y),x=(x2-x1)/w,y=(y2-y1)/w。(2)輸贏推斷算法輸贏推斷的規(guī)則很簡(jiǎn)潔,就是推斷嬉戲雙方的棋子在同一條水平線、同一條豎線或是同一條斜線上誰(shuí)先出現(xiàn)5個(gè)連續(xù)的棋子,誰(shuí)先達(dá)到這樣的目標(biāo),誰(shuí)就獲得成功。在本設(shè)計(jì)中,是在每次下完一個(gè)子后進(jìn)行推斷,看己方是否達(dá)到了成功的標(biāo)準(zhǔn),若成功嬉戲便結(jié)束;否則,嬉戲接著。(3)人工智能算法人工智能算法的主體思想分為以下三個(gè)步驟:第一步:依據(jù)雙方的當(dāng)前的形勢(shì)循環(huán)地假設(shè)性的分別給自己和對(duì)方下一子(在某個(gè)范圍內(nèi)下子),并推斷此棋子能帶來(lái)的形勢(shì)上的變更,如能不能沖4,能不能形成我方或敵方雙3等。其次步:依據(jù)上一步結(jié)果,組合每一步棋子所帶來(lái)的全部結(jié)果(如某一步棋子可能形成我方1個(gè)活3,1個(gè)沖4(我叫它半活4)等),包括敵方和我方的。第三步:依據(jù)用戶給的規(guī)則對(duì)上一步結(jié)果進(jìn)行排序,并選子(有進(jìn)攻形、防守形規(guī)則)。5、典型類的具體設(shè)計(jì)(1)應(yīng)用程序類Gobang類用于連接設(shè)備的應(yīng)用程序管理器(ApplicationManager),Gobang類繼承自MIDlet類,通過(guò)Gobang類的方法startApp,pauseApp,destroyApp來(lái)通知嬉戲的起先,暫停和銷毀結(jié)束。源代碼如下:packagecom.occo.j2me.game.gobang;importjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;publicclassGobangextendsMIDlet//定義嬉戲界面的Canvas類GobangCanvas的對(duì)象Gobangpublic{GobangCanvasgobang;Gobang(){super();gobang=newGobangCanvas(this);//生成GobangCanvas類的對(duì)象gobang}protectedvoidstartApp(){Display.getDisplay(this).setCurrent(gobang);}protectedvoidpauseApp(){}protectedvoiddestroyApp(booleanarg0){}}//在屏幕上繪出嬉戲見(jiàn)面gobang(2)嬉戲界面類GobangCanvas類繼承自Canvas,嬉戲的核心類是GobangCanvas類,此類將完成嬉戲的繪圖、互動(dòng)、限制、邏輯、等全部功能,此類的框架代碼如下:Packagecom.occo.j2me.game.gobang;importjavax.microedition.lcdui.Displayable;importjavax.microedition.lcdui.Command;importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.CommandListener;publicGobangCanvas(Gobanggobang){this.gobang=gobang;}protectedvoidpaint(Graphicsg){}importjavax.microedition.lcdui.Graphics;publicclassGobangCanvasextendsCanvasimplementsCommandListener{protectedGobanggobang;publicGobangCanvas(){}}(3)棋子類整個(gè)棋盤(pán)是一個(gè)Chesses類型的二維數(shù)組,棋盤(pán)上的每一個(gè)棋子都對(duì)應(yīng)著一個(gè)Chesses的對(duì)象,此類定義了一個(gè)棋子,源代碼如下:packagecom.occo.j2me.game.gobang;publicChesses(){}publicclassChesses{booleanisPlayer1;publicChesses(booleanisPlayer1){this.isPlayer1=isPlayer1;}}4.3嬉戲?qū)崿F(xiàn)4.3.1主類的實(shí)現(xiàn)YpkWuZiQiActivity類是五子棋嬉戲的主類,同時(shí)也是五子棋嬉戲的入口,它繼承自Activity類。進(jìn)入程序后,首先調(diào)用init()方法,init()方法通過(guò)調(diào)用setContentView(R.layout.welcomeview)顯示登錄該嬉戲的第一個(gè)界面。welcomeview.xml是一個(gè)布局文件,里面存儲(chǔ)了界面信息。該界面中有四個(gè)Button,分別為welButton1、welButton12、welButton3、welButton4,點(diǎn)擊每個(gè)Button都會(huì)觸發(fā)一個(gè)事務(wù),其中點(diǎn)擊welButton1和welButton2還會(huì)給它的成員變量FIGHTINGMODE賦值,因?yàn)樵谌巳藢?duì)戰(zhàn)和人機(jī)對(duì)戰(zhàn)是寫(xiě)在同一個(gè)ChessBoard類中的,所以須要通過(guò)FIGHTINGMODE的值來(lái)區(qū)分是人人對(duì)戰(zhàn)還是人機(jī)對(duì)戰(zhàn)。點(diǎn)擊welButton1時(shí),F(xiàn)IGHTINGMODE=1,然后會(huì)調(diào)用initTwo()方法,該方法通過(guò)調(diào)用setContentView(R.layout.chess)方法,來(lái)顯示對(duì)戰(zhàn)的界面。chess.xml文件存儲(chǔ)了對(duì)戰(zhàn)界面的信息。在chess.xml文件中調(diào)用了ChessBoard類,該類中主要定義了棋盤(pán)的信息,下文會(huì)對(duì)該類做具體的介紹的。在對(duì)戰(zhàn)界面中也有四個(gè)Button,分別是b1、b2、b3、b4。首先來(lái)介紹一下b2,該Button的功能是返回主頁(yè),調(diào)用init()方法就可以實(shí)現(xiàn)。b3的功能是重新起先,這個(gè)也只須要調(diào)用initTwo()方法。b3的功能是退出,調(diào)用了系統(tǒng)方法:System.exit(1)。下面重點(diǎn)介紹一下b1,該Button的功能是悔棋。該Button設(shè)定的點(diǎn)擊事務(wù)具體內(nèi)容如下:b1.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){ChessBoardchess=(ChessBoard)findViewById(R.id.chess);Pointtemp=null;if(chess.whoRun==1){ if(chess.firstPlayer.getMyPoints().size()>=1&&chess.secondPlayer!=null){temp=chess.secondPlayer.getMyPoints().get(chess.secondPlayer.getMyPoints().size()-1);chess.secondPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);temp=chess.firstPlayer.getMyPoints().get(chess.firstPlayer.getMyPoints().size()-1);chess.firstPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);chess.freshCanvas(); } }if(chess.whoRun==2){if(chess.firstPlayer.getMyPoints().size()>=1&&chess.secondPlayer!=null){temp=chess.firstPlayer.getMyPoints().get(chess.firstPlayer.getMyPoints().size()-1);chess.firstPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);temp=chess.secondPlayer.getMyPoints().get(chess.secondPlayer.getMyPoints().size()-1);chess.secondPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);chess.freshCanvas(); } }}})首先獲得ChessBoard對(duì)象,該對(duì)象繼承自View,具體的定義了棋盤(pán)信息,主要負(fù)責(zé)顯示棋盤(pán)的內(nèi)容。接下來(lái)推斷一下觸發(fā)悔棋事務(wù)的是哪一個(gè)玩家,再推斷是否符合悔棋的條件,這個(gè)條件很簡(jiǎn)潔,就是棋盤(pán)上至少要有兩個(gè)棋子。之后便進(jìn)行悔棋操作,分別將兩個(gè)玩家最終下的棋子取出,程序?qū)崿F(xiàn)就是將兩個(gè)ArrayList的最終一個(gè)元素remove出來(lái),再分別放到記錄棋盤(pán)中沒(méi)有棋子的點(diǎn)的集合中,最終更新一下畫(huà)布,主要是調(diào)用ChessBoard的invalidate()方法。通過(guò)以上步驟之后,呈現(xiàn)在我們面前的便是悔完棋的畫(huà)面了。點(diǎn)擊welButton2時(shí),F(xiàn)IGHTINGMODE=2,之后的步驟便會(huì)點(diǎn)擊welButton1是相同的了,不同的是,由于對(duì)戰(zhàn)模式的變更,從人人對(duì)戰(zhàn)變成了人機(jī)對(duì)戰(zhàn)。點(diǎn)擊welButton3時(shí),通過(guò)initThree()方法調(diào)用setContentView(R.chess)方法實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn)。具體的對(duì)戰(zhàn)實(shí)現(xiàn)細(xì)微環(huán)節(jié)將會(huì)在下文一一介紹。在這個(gè)界面中只保留了兩個(gè)Button:b2和b4。這兩個(gè)Button所實(shí)現(xiàn)的功能和上面的b2和b4是相同的。最終,welButton4比較簡(jiǎn)潔。它所實(shí)現(xiàn)的功能為退出應(yīng)用程序,調(diào)用System.exit(1)方法。4.3.2嬉戲設(shè)置類的實(shí)現(xiàn)嬉戲設(shè)置表單用來(lái)對(duì)嬉戲參數(shù)進(jìn)行設(shè)置,包括棋盤(pán)大小、先手選擇、智能級(jí)別。表單中運(yùn)用了Gauge和ChoiceGroup兩種高級(jí)用戶界面組件。1、棋盤(pán)尺寸選擇標(biāo)準(zhǔn)的五子棋棋盤(pán)為15*15,但為了滿意不同玩家的需求,這里供應(yīng)了大小為10*10到20*20的棋盤(pán),用戶可以通過(guò)Gauge組件變更。棋盤(pán)的最小值為10,而Gauge組件的最小值為0,所以當(dāng)前的Gauge值須要角上10才是當(dāng)前棋盤(pán)大小。創(chuàng)建Gauge組件的代碼如下:form=newForm("嬉戲設(shè)置");//創(chuàng)建參數(shù)設(shè)置表單并添加標(biāo)簽gaugeSize=newGauge("棋盤(pán)規(guī)格:"+boardSize+"X"+boardSize,true,10,boardSize-10);//棋盤(pán)規(guī)格form.append(gaugeSize);圖4-4棋盤(pán)尺寸的設(shè)計(jì)在Gauge交互模式下可以為Gauge對(duì)象所在的表單對(duì)象綁定一個(gè)ItemStateListener事務(wù)監(jiān)聽(tīng)器,并在監(jiān)聽(tīng)器上捕獲Gauge對(duì)象的事務(wù),當(dāng)Gauge的值發(fā)生變更時(shí)就會(huì)觸發(fā)事務(wù)。這里將依據(jù)Gauge的當(dāng)前值變更標(biāo)簽,顯示當(dāng)前的棋盤(pán)大小。其代碼如下:publicvoiditemStateChanged(Itemitem){if(item==gaugeSize)//當(dāng)Gauge組件發(fā)生變更時(shí){intbs=gaugeSize.getValue()+10;//獲得當(dāng)前的Gauge值并計(jì)算棋盤(pán)大?。?0)gaugeSize.setLabel("棋盤(pán)規(guī)格:"+bs+"X"+bs);//變更Gauge組件的標(biāo)簽}}2、難度選擇嬉戲的難易程度依據(jù)計(jì)算機(jī)的智能級(jí)別來(lái)限制,創(chuàng)建及添加選項(xiàng)的方法和復(fù)選框一樣,所不同的是在創(chuàng)建ChoiceGroup對(duì)象時(shí),類型設(shè)置為1(單選)。對(duì)于單選框,setSelectedIndex只能用來(lái)指定某個(gè)選項(xiàng)被選中,因此,布爾值selected的值必定為true,否則便沒(méi)有意義。嬉戲共有3個(gè)難度級(jí)別,分別是:拜師學(xué)藝、棋行天下、誰(shuí)和爭(zhēng)鋒(此嬉戲中并未作出區(qū)分),初始狀況下為拜師學(xué)藝,該選項(xiàng)的索引值為0。創(chuàng)建難度選擇單選框的代碼如下:level=1;//默認(rèn)狀況下的難度級(jí)別choicelevel=newChoiceGroup("電腦智能級(jí)別:",1);//創(chuàng)建難度級(jí)別選項(xiàng)組choicelevel.append("拜師學(xué)藝",null);//難度1choicelevel.append("棋行天下",null);//難度2choicelevel.append("誰(shuí)和爭(zhēng)鋒",null);//難度3choicelevel.setSelectedIndex(level-1,true);//設(shè)置默認(rèn)狀況犯難度1,索引值為0form.append(choicelevel);//將選項(xiàng)組添加到主表單中嬉戲設(shè)置選項(xiàng)表單還有兩個(gè)Command對(duì)象,分別用于玩家卻熱和取消,所以表單須要監(jiān)聽(tīng)軟鍵事務(wù)和組件事務(wù):publicclassSettingimplementsCommandListener,ItemStateListener3、棋手選擇選擇先手和難度等級(jí)用ChoiceGroup組件來(lái)實(shí)現(xiàn)。ChoiceGroup組件用來(lái)構(gòu)造選擇框,其構(gòu)造函數(shù)如下:ChoiceGroup(Stringlabel,intchoiceType)選擇先手的選項(xiàng)框?yàn)檫x擇組件,屬性為復(fù)選框,標(biāo)簽名為空。創(chuàng)建好選擇組件后,逐條添加選項(xiàng)元素。添加選項(xiàng)的方法如下:intappend(StringstringPart,ImageimagePart)該方法追加一個(gè)選項(xiàng)元素到選擇組中,追加的選項(xiàng)為選擇組中的最終一個(gè)元素,選擇組的大小加1。對(duì)于多選類型的ChoiceGroup,還可以設(shè)置個(gè)別選項(xiàng)的選擇狀態(tài)。設(shè)置初始選擇狀態(tài)的方法如下:voidsetSelectedIndex(intelementNum,Booleanselected)這里創(chuàng)建一個(gè)只有一個(gè)選項(xiàng)元素的多選框用于玩家設(shè)置是否計(jì)算機(jī)先行,在默認(rèn)狀況下為true,創(chuàng)建完成多選框后將其添加到主表單中,代碼如下:ComputerFirst=true;//在默認(rèn)狀況下為計(jì)算機(jī)先行choiceFirst=newChoiceGroup(null,2);//創(chuàng)建復(fù)選框choiceFirst.append("電腦先手",null);//添加選項(xiàng)元素choiceFirst.setSelectedIndex(0,ComputerFirst);//設(shè)置多選框的默認(rèn)狀態(tài)form.append(choiceFirst);//將多選框添加到主表單中4.3.3棋子類的實(shí)現(xiàn)1、棋子的行列位置此五子棋嬉戲是一個(gè)二維棋類嬉戲,所以定了了一個(gè)Dot類來(lái)表示棋子。由于移動(dòng)設(shè)備的局限性,所以程序不在下每一步棋時(shí)生成一個(gè)對(duì)象,而是在嬉戲進(jìn)行時(shí),玩家或者計(jì)算機(jī)沒(méi)下一步棋,在數(shù)組相應(yīng)位置生成該棋子的對(duì)象,而將已經(jīng)下過(guò)的棋子保存到數(shù)組中隨時(shí)檢索,這樣可以避開(kāi)過(guò)多棋子對(duì)象占用系統(tǒng)內(nèi)存。Dot類的UML圖如圖4-5所示:圖4-5棋子行列設(shè)計(jì)Dot類主要有兩個(gè)變量row和col,分別表示行和列:publicintrow;//行publicintcol;//列2、檢查越位棋子的位置并非是隨意的,玩家和計(jì)算機(jī)每走一步棋之前都要線檢查該位置的合法性,即棋子是否在棋盤(pán)上,否則判為無(wú)效落子。檢查是否越界的代碼如下:publicbooleanisInBoard(intboardSize)//推斷棋子是否越界(超出棋盤(pán)){returnrow>=0&&row<boardSize&&col>=0&&col<boardSize;}3、修改棋子位置在創(chuàng)建好Dot對(duì)象后,Dot類供應(yīng)了兩種方法更改棋子位置,包括設(shè)置行列位置和從已有棋子中復(fù)制參數(shù)。publicvoidsetRowCol(intr,intc)//設(shè)置棋子位置{row=r;col=c;}publicvoidcopyFrom(Dotd)//復(fù)制已有的棋子{row=d.row;col=d.col;}4.3.4對(duì)戰(zhàn)邏輯類的實(shí)現(xiàn)1、建立數(shù)據(jù)結(jié)構(gòu)本程序以數(shù)組保存當(dāng)前盤(pán)面的狀況,每個(gè)位置可能有三種狀態(tài):空、玩家的落子、計(jì)算機(jī)的落子,分別用0、1、2來(lái)表示。代碼如下:publicstaticintPLAYER_NONE=0;//該位置為空publicstaticintPLAYER_COMPUTER=1;//該位置有電腦的落子publicstaticintPLAYER_HUMAN=2;//該位置有玩家的落子棋盤(pán)在初始狀況下為空,即棋子上沒(méi)有任何棋子,在GobangLogic類的構(gòu)造函數(shù)中對(duì)棋盤(pán)進(jìn)行初始化:table=newint[boardSize][boardSize];//創(chuàng)建棋盤(pán)數(shù)組for(intr=0;r<boardSize;r++){for(intc=0;c<boardSize;c++)table[r][c]=0;//初始化盤(pán)面為空}除了記錄棋盤(pán)上每個(gè)位置的落子狀態(tài)外,程序還將對(duì)每種狀態(tài)的位置個(gè)數(shù)進(jìn)行統(tǒng)計(jì),以對(duì)算法進(jìn)行簡(jiǎn)化。對(duì)三種狀態(tài)的統(tǒng)計(jì)存儲(chǔ)在整型數(shù)組中,該數(shù)組為全局變量。privateintplayerCounter[];在GobangLogic類的構(gòu)造函數(shù)中對(duì)三種狀態(tài)的計(jì)數(shù)進(jìn)行初始化,即棋盤(pán)上都是空、計(jì)算機(jī)的落子或玩家的落子狀態(tài)的個(gè)數(shù)為0,在數(shù)據(jù)結(jié)構(gòu)上,把空也當(dāng)做某一特別玩家。初始化代碼如下:playerCounter=newint[3];//落子狀態(tài)計(jì)數(shù)器playerCounter[0]=boardSize*boardSize;//整個(gè)棋盤(pán)都是空的狀態(tài)playerCounter[1]=0;//電腦落子0playerCounter[2]=0;//玩家落子02、落子和悔棋這里運(yùn)用了一個(gè)Dot類棋子對(duì)象來(lái)記錄最終一步棋的位置,當(dāng)玩家下了一步棋后須要將上一步重新繪制,以消退旗子上的引導(dǎo)框。另外,還是用了堆棧來(lái)存儲(chǔ)最近的幾步落子,以便玩家悔棋。privateDotlastDot;//棋子對(duì)象,存儲(chǔ)最終一步落子privateStacksteps;//棋子對(duì)象的堆棧最終一步棋子和棋子堆棧在GobangLogic類的構(gòu)造函數(shù)中進(jìn)行初始化;lastDot=newDot(boardSize);//創(chuàng)建棋子對(duì)象用來(lái)存儲(chǔ)最終一步棋,初始化位置為棋盤(pán)中心steps=newStack();//堆棧對(duì)象,用來(lái)存儲(chǔ)最近的幾部棋在棋盤(pán)上落子的代碼如下:privatevoidgoAt(introw,intcol,intplayer)//電腦或人在row、col位置上走{intlastRow=lastDot.row;//記錄上一步的行坐標(biāo)intlastCol=lastDot.col;//記錄上一步的列坐標(biāo)table[row][col]=player;//當(dāng)前位置填充玩家代碼lastDot
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024高考地理一輪復(fù)習(xí)第五章第1講自然地理環(huán)境的整體性教案含解析新人教版
- 校長(zhǎng)在寒假散學(xué)典禮上講話:擁抱寒假開(kāi)啟多元成長(zhǎng)之旅
- 小學(xué)一年級(jí)美術(shù)教學(xué)計(jì)劃
- 《在細(xì)雨中呼喊》
- 施工防火安全控制措施
- 2024年湄洲灣職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 二零二五年度施工單位與監(jiān)理人員勞動(dòng)合同范本3篇
- 二零二五版二手汽車(chē)買(mǎi)賣(mài)合同附帶保險(xiǎn)及保養(yǎng)服務(wù)樣本3篇
- 《科幻小說(shuō)賞析與寫(xiě)作》 課件 第5、6章 “反烏托邦”的警示與預(yù)言-《一九八四》;“外星文明”的善意與惡行-《安德的游戲》
- 二零二五年度船員勞動(dòng)合同與船舶航行安全應(yīng)急演練服務(wù)合同3篇
- 網(wǎng)吧企業(yè)章程范本
- 安徽省書(shū)法家協(xié)會(huì)會(huì)員登記表
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 五格數(shù)理解釋及吉兇對(duì)照
- 婚姻狀況聲明書(shū)
- 新課程理念下的班主任工作藝術(shù)
- (完整版)企業(yè)破產(chǎn)流程圖(四張)
- 領(lǐng)導(dǎo)激勵(lì)藝術(shù)教材
- 化肥對(duì)土壤的影響
- 水泥罐抗傾覆驗(yàn)算7頁(yè)
- 可行性研究報(bào)告 范文“母親水窖”建設(shè)項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論