版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、/Java編程:五子棋游戲源代碼import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;/*main方法創(chuàng)建了ChessFrame類的一個(gè)實(shí)例對(duì)象(cf),*并啟動(dòng)屏幕顯示顯示該實(shí)例對(duì)象。*/public class FiveChessAppletDemo public static void main(String a
2、rgs) ChessFrame cf = new ChessFrame(); cf.show();/*類ChessFrame主要功能是創(chuàng)建五子棋游戲主窗體和菜單*/class ChessFrame extends JFrame implements ActionListener private String strsize="20x15","30x20","40x30"private String strmode="人機(jī)對(duì)弈","人人對(duì)弈"public static boolean iscomp
3、uter=true,checkcomputer=true;private int width,height;private ChessModel cm;private MainPanel mp;/構(gòu)造五子棋游戲的主窗體public ChessFrame() this.setTitle("五子棋游戲"); cm=new ChessModel(1); mp=new MainPanel(cm); Container con=this.getContentPane(); con.add(mp,"Center"); this.setResizable(false)
4、; this.addWindowListener(new ChessWindowEvent(); MapSize(20,15); JMenuBar mbar = new JMenuBar(); this.setJMenuBar(mbar); JMenu gameMenu = new JMenu("游戲"); mbar.add(makeMenu(gameMenu, new Object "開局", "棋盤","模式", null, "退出" , this); JMenu lookMenu =new
5、 JMenu("視圖"); mbar.add(makeMenu(lookMenu,new Object "Metal","Motif","Windows" ,this); JMenu helpMenu = new JMenu("幫助"); mbar.add(makeMenu(helpMenu, new Object "關(guān)于" , this);/構(gòu)造五子棋游戲的主菜單public JMenu makeMenu(Object parent, Object items, Objec
6、t target) JMenu m = null; if(parent instanceof JMenu) m = (JMenu)parent; else if(parent instanceof String) m = new JMenu(String)parent); else return null; for(int i = 0; i < items.length; i+) if(itemsi = null) m.addSeparator(); else if(itemsi = "棋盤") JMenu jm = new JMenu("棋盤")
7、; ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for (int j=0;j<strsize.length;j+) rmenu=makeRadioButtonMenuItem(strsizej,target); if (j=0) rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else if(itemsi = "模式") JMenu jm = new JMenu("模式");
8、 ButtonGroup group=new ButtonGroup(); JRadioButtonMenuItem rmenu; for (int h=0;h<strmode.length;h+) rmenu=makeRadioButtonMenuItem(strmodeh,target); if(h=0) rmenu.setSelected(true); jm.add(rmenu); group.add(rmenu); m.add(jm); else m.add(makeMenuItem(itemsi, target); return m;/構(gòu)造五子棋游戲的菜單項(xiàng)public JMe
9、nuItem makeMenuItem(Object item, Object target) JMenuItem r = null; if(item instanceof String) r = new JMenuItem(String)item); else if(item instanceof JMenuItem) r = (JMenuItem)item; else return null; if(target instanceof ActionListener) r.addActionListener(ActionListener)target); return r;/構(gòu)造五子棋游戲的
10、單選按鈕式菜單項(xiàng)public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target) JRadioButtonMenuItem r = null; if(item instanceof String) r = new JRadioButtonMenuItem(String)item); else if(item instanceof JRadioButtonMenuItem) r = (JRadioButtonMenuItem)item; else return null; if(target inst
11、anceof ActionListener) r.addActionListener(ActionListener)target); return r; public void MapSize(int w,int h) setSize(w * 20+50 , h * 20+100 ); if(this.checkcomputer) this.iscomputer=true; else this.iscomputer=false; mp.setModel(cm); mp.repaint(); public boolean getiscomputer() return this.iscompute
12、r; public void restart() int modeChess = cm.getModeChess(); if(modeChess <= 3 && modeChess >= 1) cm = new ChessModel(modeChess); MapSize(cm.getWidth(),cm.getHeight(); else System.out.println("u81EAu5B9Au4E49"); public void actionPerformed(ActionEvent e) String arg=e.getAction
13、Command(); try if (arg.equals("Windows") UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); else if(arg.equals("Motif") UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); else UIManager.setLookAndFeel( &q
14、uot;javax.swing.plaf.metal.MetalLookAndFeel" ); SwingUtilities.updateComponentTreeUI(this); catch(Exception ee) if(arg.equals("20x15") this.width=20; this.height=15; cm=new ChessModel(1); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("
15、30x20") this.width=30; this.height=20; cm=new ChessModel(2); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("40x30") this.width=40; this.height=30; cm=new ChessModel(3); MapSize(this.width,this.height); SwingUtilities.updateComponentTreeUI(t
16、his); if(arg.equals("人機(jī)對(duì)弈") this.checkcomputer=true; this.iscomputer=true; cm=new ChessModel(cm.getModeChess(); MapSize(cm.getWidth(),cm.getHeight(); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("人人對(duì)弈") this.checkcomputer=false; this.iscomputer=false; cm=new ChessMod
17、el(cm.getModeChess(); MapSize(cm.getWidth(),cm.getHeight(); SwingUtilities.updateComponentTreeUI(this); if(arg.equals("開局") restart(); if(arg.equals("關(guān)于") JOptionPane.showMessageDialog(this, "五子棋游戲測(cè)試版本", "關(guān)于", 0); if(arg.equals("退出") System.exit(0);/
18、*類ChessModel實(shí)現(xiàn)了整個(gè)五子棋程序算法的核心*/class ChessModel /棋盤的寬度、高度、棋盤的模式(如20×15)private int width,height,modeChess;/棋盤方格的橫向、縱向坐標(biāo)private int x=0,y=0;/棋盤方格的橫向、縱向坐標(biāo)所對(duì)應(yīng)的棋子顏色,/數(shù)組arrMapShow只有3個(gè)值:1,2,3,-5,/其中1代表該棋盤方格上下的棋子為黑子,/2代表該棋盤方格上下的棋子為白子,/3代表為該棋盤方格上沒有棋子,/-5代表該棋盤方格不能夠下棋子private int arrMapShow;/交換棋手的標(biāo)識(shí),棋盤方格上是
19、否有棋子的標(biāo)識(shí)符private boolean isOdd,isExist;public ChessModel() /該構(gòu)造方法根據(jù)不同的棋盤模式(modeChess)來構(gòu)建對(duì)應(yīng)大小的棋盤public ChessModel(int modeChess) this.isOdd=true; if(modeChess = 1) PanelInit(20, 15, modeChess); if(modeChess = 2) PanelInit(30, 20, modeChess); if(modeChess = 3) PanelInit(40, 30, modeChess); /按照棋盤模式構(gòu)建棋盤大
20、小private void PanelInit(int width, int height, int modeChess) this.width = width; this.height = height; this.modeChess = modeChess; arrMapShow = new intwidth+1height+1; for(int i = 0; i <= width; i+) for(int j = 0; j <= height; j+) arrMapShowij = -5; /獲取是否交換棋手的標(biāo)識(shí)符public boolean getisOdd() retu
21、rn this.isOdd;/設(shè)置交換棋手的標(biāo)識(shí)符public void setisOdd(boolean isodd) if(isodd) this.isOdd=true; else this.isOdd=false;/獲取某棋盤方格是否有棋子的標(biāo)識(shí)值public boolean getisExist() return this.isExist;/獲取棋盤寬度public int getWidth() return this.width;/獲取棋盤高度public int getHeight() return this.height;/獲取棋盤模式public int getModeChes
22、s() return this.modeChess;/獲取棋盤方格上棋子的信息public int getarrMapShow() return arrMapShow;/判斷下子的橫向、縱向坐標(biāo)是否越界private boolean badxy(int x, int y) if(x >= width+20 | x < 0) return true; return y >= height+20 | y < 0;/計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,/這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i
23、,int j) if(this.arrMapShowij=1 | this.arrMapShowij=2) return true; return false;/判斷該坐標(biāo)位置是否可下棋子public void readyplay(int x,int y) if(badxy(x,y) return; if (chessExist(x,y) return; this.arrMapShowxy=3;/在該坐標(biāo)位置下棋子public void play(int x,int y) if(badxy(x,y) return; if(chessExist(x,y) this.isExist=true; r
24、eturn; else this.isExist=false; if(getisOdd() setisOdd(false); this.arrMapShowxy=1; else setisOdd(true); this.arrMapShowxy=2; /計(jì)算機(jī)走棋/*說明:用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的四個(gè)方向的的最大棋子數(shù),*最后得出棋子數(shù)最大值的坐標(biāo),下子*/public void computerDo(int width,int height) int max_black,max_white,max_temp,max=0; setisOdd(true); System.out.println
25、("計(jì)算機(jī)走棋 ."); for(int i = 0; i <= width; i+) for(int j = 0; j <= height; j+) if(!chessExist(i,j)/算法判斷是否下子 max_white=checkMax(i,j,2);/判斷白子的最大值 max_black=checkMax(i,j,1);/判斷黑子的最大值 max_temp=Math.max(max_white,max_black); if(max_temp>max) max=max_temp; this.x=i; this.y=j; setX(this.x);
26、 setY(this.y); this.arrMapShowthis.xthis.y=2;/記錄電腦下子后的橫向坐標(biāo)public void setX(int x) this.x=x;/記錄電腦下子后的縱向坐標(biāo)public void setY(int y) this.y=y;/獲取電腦下子的橫向坐標(biāo)public int getX() return this.x;/獲取電腦下子的縱向坐標(biāo)public int getY() return this.y;/計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,/這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下public int checkMax(int
27、x, int y,int black_or_white) int num=0,max_num,max_temp=0; int x_temp=x,y_temp=y; int x_temp1=x_temp,y_temp1=y_temp; /judge right for(int i=1;i<5;i+) x_temp1+=1; if(x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge left x_temp1=x_temp; for(int
28、 i=1;i<5;i+) x_temp1-=1; if(x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num<5) max_temp=num; /judge up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i<5;i+) y_temp1-=1; if(y_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_whit
29、e) num+; else break; /judge down y_temp1=y_temp; for(int i=1;i<5;i+) y_temp1+=1; if(y_temp1>this.height) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; /judge left_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i
30、=1;i<5;i+) x_temp1-=1; y_temp1-=1; if(y_temp1<0 | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; /judge right_down x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<5;i+) x_temp1+=1; y_temp1+=1; if(y_temp1>this.height | x_temp1>this.width) break; i
31、f(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; /judge right_up x_temp1=x_temp; y_temp1=y_temp; num=0; for(int i=1;i<5;i+) x_temp1+=1; y_temp1-=1; if(y_temp1<0 | x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1
32、=black_or_white) num+; else break; /judge left_down x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<5;i+) x_temp1-=1; y_temp1+=1; if(y_temp1>this.height | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=black_or_white) num+; else break; if(num>max_temp&&num<5) max_temp=num; m
33、ax_num=max_temp; return max_num;/判斷勝負(fù)public boolean judgeSuccess(int x,int y,boolean isodd) int num=1; int arrvalue; int x_temp=x,y_temp=y; if(isodd) arrvalue=2; else arrvalue=1; int x_temp1=x_temp,y_temp1=y_temp; /判斷右邊 for(int i=1;i<6;i+) x_temp1+=1; if(x_temp1>this.width) break; if(this.arrM
34、apShowx_temp1y_temp1=arrvalue) num+; else break; /判斷左邊 x_temp1=x_temp; for(int i=1;i<6;i+) x_temp1-=1; if(x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判斷上方 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i+) y_temp1-=1; if(y_t
35、emp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷下方 y_temp1=y_temp; for(int i=1;i<6;i+) y_temp1+=1; if(y_temp1>this.height) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判斷左上 x_temp1=x_temp; y_temp1=y_temp; num=1; f
36、or(int i=1;i<6;i+) x_temp1-=1; y_temp1-=1; if(y_temp1<0 | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷右下 x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<6;i+) x_temp1+=1; y_temp1+=1; if(y_temp1>this.height | x_temp1>this.width) break; if(this.arr
37、MapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; /判斷右上 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i+) x_temp1+=1; y_temp1-=1; if(y_temp1<0 | x_temp1>this.width) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; /判斷左下 x_temp1=x_temp; y_te
38、mp1=y_temp; for(int i=1;i<6;i+) x_temp1-=1; y_temp1+=1; if(y_temp1>this.height | x_temp1<0) break; if(this.arrMapShowx_temp1y_temp1=arrvalue) num+; else break; if(num=5) return true; return false;/贏棋后的提示public void showSuccess(JPanel jp) JOptionPane.showMessageDialog(jp,"你贏了,好厲害!"
39、,"win", JOptionPane.INFORMATION_MESSAGE);/輸棋后的提示public void showDefeat(JPanel jp) JOptionPane.showMessageDialog(jp,"你輸了,請(qǐng)重新開始!","lost", JOptionPane.INFORMATION_MESSAGE);/*類MainPanel主要完成如下功能:*1、構(gòu)建一個(gè)面板,在該面板上畫上棋盤;*2、處理在該棋盤上的鼠標(biāo)事件(如鼠標(biāo)左鍵點(diǎn)擊、鼠標(biāo)右鍵點(diǎn)擊、鼠標(biāo)拖動(dòng)等)*/class MainPanel exten
40、ds JPanel implements MouseListener,MouseMotionListenerprivate int width,height;/棋盤的寬度和高度private ChessModel cm;/根據(jù)棋盤模式設(shè)定面板的大小MainPanel(ChessModel mm) cm=mm; width=cm.getWidth(); height=cm.getHeight(); addMouseListener(this); /根據(jù)棋盤模式設(shè)定棋盤的寬度和高度public void setModel(ChessModel mm) cm = mm; width = cm.get
41、Width(); height = cm.getHeight();/根據(jù)坐標(biāo)計(jì)算出棋盤方格棋子的信息(如白子還是黑子),/然后調(diào)用draw方法在棋盤上畫出相應(yīng)的棋子public void paintComponent(Graphics g) super.paintComponent(g); for(int j = 0; j <= height; j+) for(int i = 0; i <= width; i+) int v = cm.getarrMapShow()ij; draw(g, i, j, v); /根據(jù)提供的棋子信息(顏色、坐標(biāo))畫棋子public void draw(Graphics g, int i, int j, int v) int x = 20 * i+20; int y = 20 * j+20; /畫棋盤 if(i!=width && j!=height) g.setColor(Color.white); g.drawRect(x,y,20,20); /畫黑色棋子 if(v = 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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-2030年中國(guó)潤(rùn)滑油添加劑行業(yè)市場(chǎng)發(fā)展規(guī)模及投資可行性分析報(bào)告
- 2024-2030年中國(guó)流式細(xì)胞儀行業(yè)深度調(diào)查及投資策略分析報(bào)告
- 2024-2030年中國(guó)潔具行業(yè)市場(chǎng)營(yíng)銷模式及投資商機(jī)分析報(bào)告版
- 2024-2030年中國(guó)汽車噴涂行業(yè)市場(chǎng)運(yùn)營(yíng)模式及未來發(fā)展動(dòng)向預(yù)測(cè)報(bào)告
- 2024年低碳小鎮(zhèn)項(xiàng)目提案報(bào)告
- 2022年大學(xué)林業(yè)工程專業(yè)大學(xué)物理下冊(cè)模擬考試試題-附解析
- 2022-2023學(xué)年七臺(tái)河市重點(diǎn)中學(xué)九年級(jí)數(shù)學(xué)第一學(xué)期期末經(jīng)典模擬試題含解析
- 2023年高考全一輪微專題34-雪線(解析版)
- 2023年高考全一輪微專題14-熱力環(huán)流(解析版)
- 2023年高考一輪多維練小題-常見天氣系統(tǒng)(解析版)
- 天津市和平區(qū)2024-2025學(xué)年七年級(jí)上期中考試數(shù)學(xué)試題
- 2024-2025學(xué)年廣東省珠海市香洲區(qū)九洲中學(xué)教育集團(tuán)七年級(jí)(上)期中數(shù)學(xué)試卷(含答案)
- 資本經(jīng)營(yíng)-終結(jié)性考試-國(guó)開(SC)-參考資料
- 商務(wù)禮儀課件教學(xué)課件
- 【天潤(rùn)乳業(yè)資本結(jié)構(gòu)問題及優(yōu)化對(duì)策分析案例10000字】
- 住院醫(yī)師規(guī)范化培訓(xùn)責(zé)任導(dǎo)師制管理制度
- 2024-2025學(xué)年高中物理必修 第三冊(cè)人教版(2019)教學(xué)設(shè)計(jì)合集
- 2024年連鎖奶茶店員工工作協(xié)議版
- DB34T 1835-2022 高速公路收費(fèi)人員微笑服務(wù)規(guī)范
- 全國(guó)民族團(tuán)結(jié)進(jìn)步表彰大會(huì)全文
- 2024年事業(yè)單位體檢告知書
評(píng)論
0/150
提交評(píng)論