版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 五子棋小游戲</b></p><p> 1.課程設(shè)計(jì)的目的 </p><p> 通過(guò)此次課程設(shè)計(jì),鞏固所學(xué)Java語(yǔ)言基本知識(shí),增進(jìn)Java語(yǔ)言編輯基本功,掌握J(rèn)DK、Editplus、Eclipse、JCreator等開(kāi)發(fā)工具的運(yùn)用,拓寬常用類庫(kù)的應(yīng)用。使我們通過(guò)該教學(xué)環(huán)節(jié)與手段,把所學(xué)課程及相關(guān)知識(shí)加以融會(huì)貫通,全面掌握J(rèn)ava語(yǔ)
2、言的編程思想及面向?qū)ο蟪绦蛟O(shè)計(jì)的方法,為今后從事實(shí)際工作打下堅(jiān)實(shí)的基礎(chǔ)。</p><p><b> 2.設(shè)計(jì)方案論證</b></p><p><b> 2.1設(shè)計(jì)思路</b></p><p><b> (1)界面棋盤設(shè)計(jì)</b></p><p> 在對(duì)棋盤界面設(shè)計(jì)方面要
3、考慮簡(jiǎn)潔友好,符合游戲者需求。棋子的設(shè)計(jì)方面系統(tǒng)中設(shè)置了兩種棋子顏色,white或者black, 游戲者可自行選擇。棋子怎樣畫出來(lái),怎樣使棋子按我們所想的方式來(lái)繪制出來(lái)是設(shè)計(jì)的主要難題。運(yùn)行時(shí)要求當(dāng)每次點(diǎn)擊鼠標(biāo)的時(shí)候就在點(diǎn)擊鼠標(biāo)的地方畫一個(gè)棋子,所以得定義一個(gè)棋子的類使點(diǎn)擊鼠標(biāo)時(shí)系統(tǒng)把棋子繪制出來(lái)。這樣主界面里的棋子就確定了,而且也確定了幾個(gè)所需要的類。可以先定義好這些類了。</p><p> 有了以上的準(zhǔn)備就
4、可以把棋盤繪制出來(lái)了,下棋時(shí)每次在適當(dāng)位置點(diǎn)擊鼠標(biāo)的時(shí)候就在所點(diǎn)擊的位置上畫出你這個(gè)角色的顏色,然后計(jì)算機(jī)會(huì)自動(dòng)的下棋,計(jì)算機(jī)自動(dòng)下棋要有一個(gè)控制變量來(lái)控制能不能下棋。人可以隨意的下子,可是計(jì)算機(jī)就要計(jì)算在哪個(gè)位置下子了。這里由計(jì)算機(jī)下子的算法來(lái)確定,人人對(duì)戰(zhàn)的話就不象單機(jī)游戲一樣,要計(jì)算機(jī)來(lái)判斷人下子之后計(jì)算機(jī)下那一個(gè)地方了,人人對(duì)戰(zhàn)只要在雙方下子的時(shí)候判斷贏棋情況,當(dāng)然還要同步的控制兩個(gè)人下棋的順序,這樣的話就要用到線程了,各自都繼
5、承或?qū)崿F(xiàn)線程類或接口,以便各自能隨時(shí)單獨(dú)控制接發(fā)消息。</p><p><b> (2)算法設(shè)計(jì)</b></p><p> 對(duì)于五子棋游戲,無(wú)論人機(jī)對(duì)戰(zhàn),還是雙人對(duì)戰(zhàn),都需要判斷棋盤上是否存在五子連珠情況,這既是游戲名字的由來(lái),也是游戲結(jié)束的標(biāo)志。判斷五子連珠的原理是從橫,豎,左斜線,右斜線4條線上判斷是否存在5個(gè)相連的同類棋子。</p><p
6、> 對(duì)戰(zhàn)一方落子后,在該處向8個(gè)方向檢測(cè)連續(xù)的同類棋子,如果檢測(cè)到直線方向上存在5個(gè)連續(xù)的同類棋子(包含本位置棋子),則判斷為“連五”并結(jié)束檢測(cè)循環(huán)?;跈z測(cè)結(jié)果,可以判斷游戲是否結(jié)束,并根據(jù)獲勝方的落子代碼判斷獲勝方是誰(shuí)。</p><p> 由于不考慮禁手問(wèn)題,在實(shí)現(xiàn)“連五”過(guò)程中,我們可以考慮完成“雙四”,“四三”,“雙三”,“沖四”,“活三”,“活四”來(lái)實(shí)現(xiàn)目的。</p><p
7、> 活四:有兩個(gè)點(diǎn)能形成“連五”的四就是活四;</p><p> 沖四:只有一個(gè)點(diǎn)能形成“連五”的四叫做“沖四”,或者叫做“單四”;</p><p> 活三:己方在落一子就能形成“活四”的三叫做“活三”?!盎钊狈譃椤斑B活三”和“跳活三”。連活三:在棋盤某一條陽(yáng)線或陰線上有同色三子相連,且在此三子兩端延長(zhǎng)線上有一端至少有一個(gè),另一端至少有兩個(gè)無(wú)子的交叉點(diǎn)與此三子緊密相連。跳活三
8、:中間僅間隔一個(gè)無(wú)子交叉點(diǎn)的連三,但兩端延長(zhǎng)線均至少有一個(gè)無(wú)子的交叉點(diǎn)與此三子相連。</p><p> 雙三:由于黑方走一著在無(wú)子交叉點(diǎn)上同時(shí)形成二個(gè)或二個(gè)以上黑方 " 活 " 的局面。</p><p> 雙四:由于黑方走一著在無(wú)子交叉點(diǎn)上同時(shí)形成二個(gè)或二個(gè)以上黑方 " 四 " 的局面。 </p><p> 四三:指某一
9、方同時(shí)具備兩個(gè)先手,其中一個(gè)是 " 四 " ,一個(gè)是 " 活三 " 。</p><p> 在實(shí)現(xiàn)上面這些高級(jí)算法的時(shí)候,我們需要一個(gè)基礎(chǔ),就是對(duì)制定位置周圍情況進(jìn)行檢測(cè)。在棋盤上面,棋子存在8個(gè)移動(dòng)方向,檢測(cè)時(shí)需要對(duì)每個(gè)方向進(jìn)行檢測(cè)。為了簡(jiǎn)單直觀,這里將每步棋子的移動(dòng)生成一個(gè)新的棋子。</p><p><b> 2.2需求分析</
10、b></p><p> 一款小游戲的確立是建立在各種各樣的需求上面的,這種需求往往來(lái)自于玩家的實(shí)際需求,其中玩家的實(shí)際需求最為重要.面對(duì)游戲擁有不同知識(shí)和理解層面的玩家,游戲制作人對(duì)玩家需求的理解程度,在很大程度上決定了此類游戲開(kāi)發(fā)的成敗.因此如何更好地的了解,分析,明確玩家需求,并且能夠準(zhǔn)確,清晰以文檔的形式表達(dá)給游戲制作人,保證開(kāi)發(fā)過(guò)程按照滿足玩家需求為目的正確開(kāi)發(fā)方向進(jìn)行,是每游戲游戲制作人需要面對(duì)
11、的問(wèn)題。</p><p> 作為五子棋的設(shè)計(jì)需要考慮到的最基本的需求莫過(guò)于人機(jī)對(duì)戰(zhàn)與人人對(duì)戰(zhàn)功能的實(shí)現(xiàn),當(dāng)然還有下棋過(guò)程中的下棋悔棋功能以及判斷游戲的勝負(fù)等方面的要求。當(dāng)然最好是要考慮到界面的友好性,作為一個(gè)娛樂(lè)軟件,還應(yīng)該考慮到玩家在游戲時(shí)的舒適性。</p><p><b> 2.3功能模塊圖</b></p><p><b>
12、 2.4設(shè)計(jì)方法</b></p><p> 2.4.1 ChessFrame主要功能</p><p> 類ChessFrame主要功能是創(chuàng)建五子棋游戲主窗體和菜單,主要代碼如下:</p><p> class ChessFrame extends JFrame implements ActionListener {</p><p
13、> private String[] strsize={"20x15","30x20","40x30"};</p><p> private String[] strmode={"人機(jī)對(duì)弈","人人對(duì)弈"};</p><p> public static boolean isco
14、mputer=true,checkcomputer=true;</p><p> private int width,height;</p><p> private ChessModel cm;</p><p> private MainPanel mp;</p><p> 2.4.2 游戲主窗體</p><p&
15、gt; 構(gòu)造五子棋游戲的主窗體,主要代碼如下:</p><p> public ChessFrame() {</p><p> this.setTitle("五子棋游戲");</p><p> cm=new ChessModel(1);</p><p> mp=new MainPanel(cm);</p&g
16、t;<p> Container con=this.getContentPane();</p><p> con.add(mp,"Center");</p><p> this.setResizable(false);</p><p> this.addWindowListener(new ChessWindowEvent(
17、));</p><p> MapSize(20,15);</p><p> JMenuBar mbar = new JMenuBar();</p><p> this.setJMenuBar(mbar);</p><p> JMenu gameMenu = new JMenu("游戲");</p>&
18、lt;p> mbar.add(makeMenu(gameMenu, new Object[] {</p><p> "開(kāi)局", "棋盤","模式", null, "退出"</p><p> }, this));</p><p> JMenu lookMenu =new JM
19、enu("視圖");</p><p> mbar.add(makeMenu(lookMenu,new Object[] {</p><p> "Metal","Motif","Windows"</p><p><b> },this));</b></p&
20、gt;<p> JMenu helpMenu = new JMenu("幫助");</p><p> mbar.add(makeMenu(helpMenu, new Object[] {</p><p><b> "關(guān)于"</b></p><p> }, this));</p&
21、gt;<p><b> }</b></p><p><b> 2.4.3 主菜單</b></p><p> 構(gòu)造五子棋游戲的主菜單,代碼如下:</p><p> public JMenu makeMenu(Object parent, Object items[], Object target){&l
22、t;/p><p> JMenu m = null;</p><p> if(parent instanceof JMenu)</p><p> m = (JMenu)parent;</p><p> else if(parent instanceof String)</p><p> m = new JMenu(
23、(String)parent);</p><p><b> else</b></p><p> return null;</p><p> for(int i = 0; i < items.length; i++)</p><p> if(items[i] == null)</p><p
24、> m.addSeparator();</p><p> else if(items[i] == "棋盤"){</p><p> JMenu jm = new JMenu("棋盤");</p><p> ButtonGroup group=new ButtonGroup();</p><p&g
25、t; JRadioButtonMenuItem rmenu;</p><p> for (int j=0;j<strsize.length;j++){</p><p> rmenu=makeRadioButtonMenuItem(strsize[j],target);</p><p><b> if (j==0)</b></
26、p><p> rmenu.setSelected(true);</p><p> jm.add(rmenu);</p><p> group.add(rmenu);</p><p><b> }</b></p><p> m.add(jm);</p><p> }e
27、lse if(items[i] == "模式"){</p><p> JMenu jm = new JMenu("模式");</p><p> ButtonGroup group=new ButtonGroup();</p><p> JRadioButtonMenuItem rmenu;</p><
28、p> for (int h=0;h<strmode.length;h++){</p><p> rmenu=makeRadioButtonMenuItem(strmode[h],target);</p><p><b> if(h==0)</b></p><p> rmenu.setSelected(true);</p
29、><p> jm.add(rmenu);</p><p> group.add(rmenu);</p><p><b> }</b></p><p> m.add(jm);</p><p><b> }else</b></p><p> m.a
30、dd(makeMenuItem(items[i], target));</p><p><b> return m;</b></p><p><b> }</b></p><p><b> 3.設(shè)計(jì)結(jié)果與分析</b></p><p> (1)五子棋游戲的主界面,如圖2所
31、示。</p><p><b> 圖2 程序主界面</b></p><p> (2)五子棋游戲的結(jié)束界面,如圖3所示。</p><p><b> 圖3 游戲結(jié)束界面</b></p><p> (3)游戲游戲欄中的各個(gè)選項(xiàng),如圖4所示。</p><p> 圖4 Game
32、欄中的選項(xiàng)</p><p> (4)視圖設(shè)置欄中的各個(gè)選項(xiàng),如圖5所示。</p><p> 圖5 Configure欄中的各個(gè)選項(xiàng)</p><p> (5)Help幫助欄中的選項(xiàng),如圖6所示。</p><p> 圖6 Help欄中的選項(xiàng)</p><p> (6)點(diǎn)擊Help欄中的About選項(xiàng)彈出的界面,如圖
33、7所示。</p><p> 圖7 About選項(xiàng)彈出時(shí)的界面</p><p><b> 4.設(shè)計(jì)體會(huì)</b></p><p> 通過(guò)這次課程設(shè)計(jì),我進(jìn)一步加深對(duì)基礎(chǔ)理論的理解,擴(kuò)大專業(yè)知識(shí)面,對(duì)收集資料、查閱文獻(xiàn)、方案制定等實(shí)踐方面得到了很好的鍛練,促進(jìn)對(duì)所學(xué)知識(shí)應(yīng)用能力的提高。同時(shí)我漸漸的復(fù)習(xí)了Java使用方法和編程語(yǔ)法,之后的編程過(guò)程
34、也相對(duì)得心應(yīng)手,基本完成了預(yù)期計(jì)劃的要求。在此感謝我的指導(dǎo)老師—馮云老師,她在課題的研究上不遺余力的給予指導(dǎo)。她嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度深深的影響了我,使我受益匪淺!</p><p><b> 5.參考文獻(xiàn)</b></p><p> [1]耿祥義.JAVA大學(xué)實(shí)用教程.北京:電子工業(yè)出版社.2005.3:85-113</p><p> [2]朱戰(zhàn)立
35、,沈偉.Java程序設(shè)計(jì)實(shí)用指南.北京:電子工業(yè)出版社,2005.1:48-135</p><p> [3] 唐大仕.Java程序設(shè)計(jì)[M]. 北京:北方交通大學(xué)出版社:2007.05:56-92 </p><p> [4]葉核亞. JAVA2程序設(shè)計(jì)實(shí)用教程[M].北京:電子工業(yè)出版社;2008.4:64-98</p><p> [5]邢素萍. JAVA辦
36、公自動(dòng)化項(xiàng)目方案精解[M].北京:航空工業(yè)出版社, 2006.9:35-120</p><p><b> 附錄</b></p><p> //Java編程:五子棋游戲源代碼</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p>
37、;<p> import java.applet.*;</p><p> import javax.swing.*;</p><p> import java.io.PrintStream;</p><p> import javax.swing.JComponent;</p><p> import javax.sw
38、ing.JPanel;</p><p><b> /*</b></p><p> *main方法創(chuàng)建了ChessFrame類的一個(gè)實(shí)例對(duì)象(cf),</p><p> *并啟動(dòng)屏幕顯示顯示該實(shí)例對(duì)象。</p><p><b> **/</b></p><p> pu
39、blic class FiveChessAppletDemo {</p><p> public static void main(String args[]){</p><p> ChessFrame cf = new ChessFrame();</p><p> cf.show();</p><p><b> }<
40、/b></p><p><b> }</b></p><p><b> /*</b></p><p> *類ChessFrame主要功能是創(chuàng)建五子棋游戲主窗體和菜單</p><p><b> **/</b></p><p> class
41、ChessFrame extends JFrame implements ActionListener {</p><p> private String[] strsize={"20x15","30x20","40x30"};</p><p> private String[] strmode={"人機(jī)對(duì)弈&quo
42、t;,"人人對(duì)弈"};</p><p> public static boolean iscomputer=true,checkcomputer=true;</p><p> private int width,height;</p><p> private ChessModel cm;</p><p> pri
43、vate MainPanel mp;</p><p> //構(gòu)造五子棋游戲的主窗體</p><p> public ChessFrame() {</p><p> this.setTitle("五子棋游戲");</p><p> cm=new ChessModel(1);</p><p>
44、 mp=new MainPanel(cm);</p><p> Container con=this.getContentPane();</p><p> con.add(mp,"Center");</p><p> this.setResizable(false);</p><p> this.addWindow
45、Listener(new ChessWindowEvent());</p><p> MapSize(20,15);</p><p> JMenuBar mbar = new JMenuBar();</p><p> this.setJMenuBar(mbar);</p><p> JMenu gameMenu = new JMenu
46、("游戲");</p><p> mbar.add(makeMenu(gameMenu, new Object[] {</p><p> "開(kāi)局", "棋盤","模式", null, "退出"</p><p> }, this));</p><
47、;p> JMenu lookMenu =new JMenu("視圖");</p><p> mbar.add(makeMenu(lookMenu,new Object[] {</p><p> "Metal","Motif","Windows"</p><p><b&g
48、t; },this));</b></p><p> JMenu helpMenu = new JMenu("幫助");</p><p> mbar.add(makeMenu(helpMenu, new Object[] {</p><p><b> "關(guān)于"</b></p>
49、<p> }, this));</p><p><b> }</b></p><p> //構(gòu)造五子棋游戲的主菜單</p><p> public JMenu makeMenu(Object parent, Object items[], Object target){</p><p> JMen
50、u m = null;</p><p> if(parent instanceof JMenu)</p><p> m = (JMenu)parent;</p><p> else if(parent instanceof String)</p><p> m = new JMenu((String)parent);</p>
51、;<p><b> else</b></p><p> return null;</p><p> for(int i = 0; i < items.length; i++)</p><p> if(items[i] == null)</p><p> m.addSeparator();&l
52、t;/p><p> else if(items[i] == "棋盤"){</p><p> JMenu jm = new JMenu("棋盤");</p><p> ButtonGroup group=new ButtonGroup();</p><p> JRadioButtonMenuItem
53、rmenu;</p><p> for (int j=0;j<strsize.length;j++){</p><p> rmenu=makeRadioButtonMenuItem(strsize[j],target);</p><p><b> if (j==0)</b></p><p> rmenu.s
54、etSelected(true);</p><p> jm.add(rmenu);</p><p> group.add(rmenu);</p><p><b> }</b></p><p> m.add(jm);</p><p> }else if(items[i] == "
55、模式"){</p><p> JMenu jm = new JMenu("模式");</p><p> ButtonGroup group=new ButtonGroup();</p><p> JRadioButtonMenuItem rmenu;</p><p> for (int h=0;h<
56、strmode.length;h++){</p><p> rmenu=makeRadioButtonMenuItem(strmode[h],target);</p><p><b> if(h==0)</b></p><p> rmenu.setSelected(true);</p><p> jm.add(r
57、menu);</p><p> group.add(rmenu);</p><p><b> }</b></p><p> m.add(jm);</p><p><b> }else</b></p><p> m.add(makeMenuItem(items[i],
58、 target));</p><p><b> return m;</b></p><p><b> }</b></p><p> //構(gòu)造五子棋游戲的菜單項(xiàng)</p><p> public JMenuItem makeMenuItem(Object item, Object target)
59、{</p><p> JMenuItem r = null;</p><p> if(item instanceof String)</p><p> r = new JMenuItem((String)item);</p><p> else if(item instanceof JMenuItem)</p><
60、p> r = (JMenuItem)item;</p><p><b> else</b></p><p> return null;</p><p> if(target instanceof ActionListener)</p><p> r.addActionListener((ActionLis
61、tener)target);</p><p><b> return r;</b></p><p><b> }</b></p><p> //構(gòu)造五子棋游戲的單選按鈕式菜單項(xiàng)</p><p> public JRadioButtonMenuItem makeRadioButtonMenuI
62、tem(</p><p> Object item, Object target){</p><p> JRadioButtonMenuItem r = null;</p><p> if(item instanceof String)</p><p> r = new JRadioButtonMenuItem((String)ite
63、m);</p><p> else if(item instanceof JRadioButtonMenuItem)</p><p> r = (JRadioButtonMenuItem)item;</p><p><b> else</b></p><p> return null;</p>&l
64、t;p> if(target instanceof ActionListener)</p><p> r.addActionListener((ActionListener)target);</p><p><b> return r;</b></p><p><b> }</b></p>&l
65、t;p> public void MapSize(int w,int h){</p><p> setSize(w * 20+50 , h * 20+100 );</p><p> if(this.checkcomputer)</p><p> this.iscomputer=true;</p><p><b> e
66、lse</b></p><p> this.iscomputer=false;</p><p> mp.setModel(cm);</p><p> mp.repaint();</p><p><b> }</b></p><p> public boolean getisc
67、omputer(){</p><p> return this.iscomputer;</p><p><b> }</b></p><p> public void restart(){</p><p> int modeChess = cm.getModeChess();</p><p&g
68、t; if(modeChess <= 3 && modeChess >= 1){</p><p> cm = new ChessModel(modeChess);</p><p> MapSize(cm.getWidth(),cm.getHeight());</p><p><b> }else{</b>&l
69、t;/p><p> System.out.println("\u81EA\u5B9A\u4E49");</p><p><b> }</b></p><p><b> }</b></p><p> public void actionPerformed(ActionEvent
70、 e){</p><p> String arg=e.getActionCommand();</p><p><b> try{</b></p><p> if (arg.equals("Windows"))</p><p> UIManager.setLookAndFeel(</p&g
71、t;<p> "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");</p><p> else if(arg.equals("Motif"))</p><p> UIManager.setLookAndFeel(</p><p> "com
72、.sun.java.swing.plaf.motif.MotifLookAndFeel");</p><p><b> else</b></p><p> UIManager.setLookAndFeel(</p><p> "javax.swing.plaf.metal.MetalLookAndFeel"
73、);</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p> }catch(Exception ee){}</p><p> if(arg.equals("20x15")){</p><p> this.width=20;</p>&
74、lt;p> this.height=15;</p><p> cm=new ChessModel(1);</p><p> MapSize(this.width,this.height);</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p><b>
75、 }</b></p><p> if(arg.equals("30x20")){</p><p> this.width=30;</p><p> this.height=20;</p><p> cm=new ChessModel(2);</p><p> MapSize(
76、this.width,this.height);</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p><b> }</b></p><p> if(arg.equals("40x30")){</p><p> this.wi
77、dth=40;</p><p> this.height=30;</p><p> cm=new ChessModel(3);</p><p> MapSize(this.width,this.height);</p><p> SwingUtilities.updateComponentTreeUI(this);</p>
78、<p><b> }</b></p><p> if(arg.equals("人機(jī)對(duì)弈")){</p><p> this.checkcomputer=true;</p><p> this.iscomputer=true;</p><p> cm=new ChessModel
79、(cm.getModeChess());</p><p> MapSize(cm.getWidth(),cm.getHeight());</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p><b> }</b></p><p> if(arg.
80、equals("人人對(duì)弈")){</p><p> this.checkcomputer=false;</p><p> this.iscomputer=false;</p><p> cm=new ChessModel(cm.getModeChess());</p><p> MapSize(cm.getWidt
81、h(),cm.getHeight());</p><p> SwingUtilities.updateComponentTreeUI(this);</p><p><b> }</b></p><p> if(arg.equals("開(kāi)局")){</p><p> restart();<
82、/p><p><b> }</b></p><p> if(arg.equals("關(guān)于"))</p><p> JOptionPane.showMessageDialog(this, "五子棋游戲測(cè)試版本", "關(guān)于", 0);</p><p> if(a
83、rg.equals("退出"))</p><p> System.exit(0);</p><p><b> }</b></p><p><b> }</b></p><p><b> /*</b></p><p> *類C
84、hessModel實(shí)現(xiàn)了整個(gè)五子棋程序算法的核心</p><p><b> */</b></p><p> class ChessModel {</p><p> //棋盤的寬度、高度、棋盤的模式(如20×15)</p><p> private int width,height,modeChess;&
85、lt;/p><p> //棋盤方格的橫向、縱向坐標(biāo)</p><p> private int x=0,y=0;</p><p> //棋盤方格的橫向、縱向坐標(biāo)所對(duì)應(yīng)的棋子顏色,</p><p> //數(shù)組arrMapShow只有3個(gè)值:1,2,3,-5,</p><p> //其中1代表該棋盤方格上下的棋子為黑子
86、,</p><p> //2代表該棋盤方格上下的棋子為白子,</p><p> //3代表為該棋盤方格上沒(méi)有棋子,</p><p> //-5代表該棋盤方格不能夠下棋子</p><p> private int[][] arrMapShow;</p><p> //交換棋手的標(biāo)識(shí),棋盤方格上是否有棋子的標(biāo)識(shí)符
87、</p><p> private boolean isOdd,isExist;</p><p> public ChessModel() {}</p><p> //該構(gòu)造方法根據(jù)不同的棋盤模式(modeChess)來(lái)構(gòu)建對(duì)應(yīng)大小的棋盤</p><p> public ChessModel(int modeChess){</p
88、><p> this.isOdd=true;</p><p> if(modeChess == 1){</p><p> PanelInit(20, 15, modeChess);</p><p><b> }</b></p><p> if(modeChess == 2){</p&g
89、t;<p> PanelInit(30, 20, modeChess);</p><p><b> }</b></p><p> if(modeChess == 3){</p><p> PanelInit(40, 30, modeChess);</p><p><b> }</b
90、></p><p><b> }</b></p><p> //按照棋盤模式構(gòu)建棋盤大小</p><p> private void PanelInit(int width, int height, int modeChess){</p><p> this.width = width;</p>
91、<p> this.height = height;</p><p> this.modeChess = modeChess;</p><p> arrMapShow = new int[width+1][height+1];</p><p> for(int i = 0; i <= width; i++){</p><
92、;p> for(int j = 0; j <= height; j++){</p><p> arrMapShow[i][j] = -5;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&l
93、t;/p><p> //獲取是否交換棋手的標(biāo)識(shí)符</p><p> public boolean getisOdd(){</p><p> return this.isOdd;</p><p><b> }</b></p><p> //設(shè)置交換棋手的標(biāo)識(shí)符</p><p
94、> public void setisOdd(boolean isodd){</p><p><b> if(isodd)</b></p><p> this.isOdd=true;</p><p><b> else</b></p><p> this.isOdd=false;&l
95、t;/p><p><b> }</b></p><p> //獲取某棋盤方格是否有棋子的標(biāo)識(shí)值</p><p> public boolean getisExist(){</p><p> return this.isExist;</p><p><b> }</b>&
96、lt;/p><p><b> //獲取棋盤寬度</b></p><p> public int getWidth(){</p><p> return this.width;</p><p><b> }</b></p><p><b> //獲取棋盤高度&l
97、t;/b></p><p> public int getHeight(){</p><p> return this.height;</p><p><b> }</b></p><p><b> //獲取棋盤模式</b></p><p> public i
98、nt getModeChess(){</p><p> return this.modeChess;</p><p><b> }</b></p><p> //獲取棋盤方格上棋子的信息</p><p> public int[][] getarrMapShow(){</p><p>
99、return arrMapShow;</p><p><b> }</b></p><p> //判斷下子的橫向、縱向坐標(biāo)是否越界</p><p> private boolean badxy(int x, int y){</p><p> if(x >= width+20 || x < 0)<
100、/p><p> return true;</p><p> return y >= height+20 || y < 0;</p><p><b> }</b></p><p> //計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,</p><p> //這八個(gè)方向分別是:左、右、上、
101、下、左上、左下、右上、右下</p><p> public boolean chessExist(int i,int j){</p><p> if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)</p><p> return true;</p><p> return f
102、alse;</p><p><b> }</b></p><p> //判斷該坐標(biāo)位置是否可下棋子</p><p> public void readyplay(int x,int y){</p><p> if(badxy(x,y))</p><p><b> return;
103、</b></p><p> if (chessExist(x,y))</p><p><b> return;</b></p><p> this.arrMapShow[x][y]=3;</p><p><b> }</b></p><p> //在該坐
104、標(biāo)位置下棋子</p><p> public void play(int x,int y){</p><p> if(badxy(x,y))</p><p><b> return;</b></p><p> if(chessExist(x,y)){</p><p> this.isEx
105、ist=true;</p><p><b> return;</b></p><p><b> }else</b></p><p> this.isExist=false;</p><p> if(getisOdd()){</p><p> setisOdd(fal
106、se);</p><p> this.arrMapShow[x][y]=1;</p><p><b> }else{</b></p><p> setisOdd(true);</p><p> this.arrMapShow[x][y]=2;</p><p><b> }<
107、;/b></p><p><b> }</b></p><p><b> //計(jì)算機(jī)走棋</b></p><p><b> /*</b></p><p> *說(shuō)明:用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的四個(gè)方向的的最大棋子數(shù),</p><p> *最
108、后得出棋子數(shù)最大值的坐標(biāo),下子</p><p><b> **/</b></p><p> public void computerDo(int width,int height){</p><p> int max_black,max_white,max_temp,max=0;</p><p> setisOd
109、d(true);</p><p> System.out.println("計(jì)算機(jī)走棋 ...");</p><p> for(int i = 0; i <= width; i++){</p><p> for(int j = 0; j <= height; j++){</p><p> if(!che
110、ssExist(i,j)){//算法判斷是否下子</p><p> max_white=checkMax(i,j,2);//判斷白子的最大值</p><p> max_black=checkMax(i,j,1);//判斷黑子的最大值</p><p> max_temp=Math.max(max_white,max_black);</p><
111、p> if(max_temp>max){</p><p> max=max_temp;</p><p><b> this.x=i;</b></p><p><b> this.y=j;</b></p><p><b> }</b></p>
112、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> setX(this.x);</p><p> setY(this.y);</p><p> this.arr
113、MapShow[this.x][this.y]=2;</p><p><b> }</b></p><p> //記錄電腦下子后的橫向坐標(biāo)</p><p> public void setX(int x){</p><p><b> this.x=x;</b></p><
114、p><b> }</b></p><p> //記錄電腦下子后的縱向坐標(biāo)</p><p> public void setY(int y){</p><p><b> this.y=y;</b></p><p><b> }</b></p><
115、;p> //獲取電腦下子的橫向坐標(biāo)</p><p> public int getX(){</p><p> return this.x;</p><p><b> }</b></p><p> //獲取電腦下子的縱向坐標(biāo)</p><p> public int getY(){&
116、lt;/p><p> return this.y;</p><p><b> }</b></p><p> //計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,</p><p> //這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下</p><p> public int checkMax
117、(int x, int y,int black_or_white){</p><p> int num=0,max_num,max_temp=0;</p><p> int x_temp=x,y_temp=y;</p><p> int x_temp1=x_temp,y_temp1=y_temp;</p><p> //judge r
118、ight</p><p> for(int i=1;i<5;i++){</p><p> x_temp1+=1;</p><p> if(x_temp1>this.width)</p><p><b> break;</b></p><p> if(this.arrMapSh
119、ow[x_temp1][y_temp1]==black_or_white)</p><p><b> num++;</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b&g
120、t;</p><p> //judge left</p><p> x_temp1=x_temp;</p><p> for(int i=1;i<5;i++){</p><p> x_temp1-=1;</p><p> if(x_temp1<0)</p><p><
121、b> break;</b></p><p> if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)</p><p><b> num++;</b></p><p><b> else</b></p><p><b&
122、gt; break;</b></p><p><b> }</b></p><p><b> if(num<5)</b></p><p> max_temp=num;</p><p> //judge up</p><p> x_temp1=x_
123、temp;</p><p> y_temp1=y_temp;</p><p><b> num=0;</b></p><p> for(int i=1;i<5;i++){</p><p> y_temp1-=1;</p><p> if(y_temp1<0)</p>
124、;<p><b> break;</b></p><p> if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)</p><p><b> num++;</b></p><p><b> else</b></p>
125、<p><b> break;</b></p><p><b> }</b></p><p> //judge down</p><p> y_temp1=y_temp;</p><p> for(int i=1;i<5;i++){</p><p>
126、; y_temp1+=1;</p><p> if(y_temp1>this.height)</p><p><b> break;</b></p><p> if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)</p><p><b> n
127、um++;</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> if(num>max_temp&&num<5)</p&g
128、t;<p> max_temp=num;</p><p> //judge left_up</p><p> x_temp1=x_temp;</p><p> y_temp1=y_temp;</p><p><b> num=0;</b></p><p> for(int
129、 i=1;i<5;i++){</p><p> x_temp1-=1;</p><p> y_temp1-=1;</p><p> if(y_temp1<0 || x_temp1<0)</p><p><b> break;</b></p><p> if(this.a
130、rrMapShow[x_temp1][y_temp1]==black_or_white)</p><p><b> num++;</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }&
131、lt;/b></p><p> //judge right_down</p><p> x_temp1=x_temp;</p><p> y_temp1=y_temp;</p><p> for(int i=1;i<5;i++){</p><p> x_temp1+=1;</p>&
132、lt;p> y_temp1+=1;</p><p> if(y_temp1>this.height || x_temp1>this.width)</p><p><b> break;</b></p><p> if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)&
133、lt;/p><p><b> num++;</b></p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> if(num>max
134、_temp&&num<5)</p><p> max_temp=num;</p><p> //judge right_up</p><p> x_temp1=x_temp;</p><p> y_temp1=y_temp;</p><p><b> num=0;</b&
135、gt;</p><p> for(int i=1;i<5;i++){</p><p> x_temp1+=1;</p><p> y_temp1-=1;</p><p> if(y_temp1<0 || x_temp1>this.width)</p><p><b> break;
136、</b></p><p> if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)</p><p><b> num++;</b></p><p><b> else</b></p><p><b> break;&l
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋小游戲課程設(shè)計(jì)
- java課程設(shè)計(jì)--五子棋游戲
- 《java程序設(shè)計(jì)》課程設(shè)計(jì)-五子棋小游戲
- java課程設(shè)計(jì)-五子棋游戲
- 基于java的五子棋小游戲
- java課程設(shè)計(jì)報(bào)告---java 五子棋游戲設(shè)計(jì)
- java五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)--五子棋
- 五子棋java課程設(shè)計(jì)
- 五子棋java課程設(shè)計(jì)
- java課程設(shè)計(jì)--對(duì)戰(zhàn)五子棋
- java課程設(shè)計(jì)報(bào)告-五子棋
- 五子棋游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--人機(jī)對(duì)弈五子棋
- 五子棋java語(yǔ)言課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)五子棋游戲設(shè)計(jì)(內(nèi)附完整代碼)
- 基于java的五子棋游戲設(shè)計(jì)
- 五子棋游戲課程設(shè)計(jì)word格式
- 課程設(shè)計(jì)---五子棋游戲的實(shí)現(xiàn)
- 五子棋課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論