五子棋人機對弈JAVA源代碼_第1頁
五子棋人機對弈JAVA源代碼_第2頁
五子棋人機對弈JAVA源代碼_第3頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、package resource;/ 整個窗口/ 菜單欄菜單項數(shù)組模式項數(shù)組/ 菜單/ 是否為黑方下子狀態(tài)/ 棋盤數(shù)組/ 當前行/ 當前列public class PlayerVsPC private JFrame frame; private JMenuBar bar; private JMenuItem jit;/ private JMenuItem mode;/ private JMenu jm; public boolean isBlack; private int qipan; private int row; private int col; private int prow; p

2、rivate int pcol;/ 棋盤背景顏色private Color c=new Color(145,125,62);private DrawPanel panel; private JLabel label;private JPanel panel0; private boolean isEnd;private int qixingPC; private int qixingPlayer;private boolean isPC = true; / private boolean cMode = true;/ 棋盤面板/ 棋盤上方的標簽/ 棋盤上方條形面板記錄當前下棋模式/ 記錄選擇的

3、對弈模式public PlayerVsPC() frame=new JFrame(" 五子棋游戲 "); bar=new JMenuBar();jm=new JMenu2;jit=new JMenuItem2; qipan=new int1919; qixingPC = new int1717; qixingPlayer = new int1717;for(int i=0;i<19;i+)for(int j=0;j<19;j+) qipanij=0;for(int i=0;i<17;i+)for(int j=0;j<17;j+) qixingPCij

4、=0; qixingPlayerij=0;label = new JLabel(" 人"+(isPC?"機":"人")+"對弈模式,請按開局開始游戲! "); panel0=new JPanel();addItems();addEventAction(); printqipan(0,0);public void addItems()jm0=new JMenu(" 游戲");jm1=new JMenu(" 選項 ");jit0=new JMenuItem3;jit00=new

5、JMenuItem("開局");jit01=new JMenuItem("重新開始");jit02=new JMenuItem("結(jié)束游戲");jit1=new JMenuItem3;jit10=new JMenu(" 對弈模式 "); mode=new JMenuItem2;mode0 = new JMenuItem(" 人人對弈 "); mode1 = new JMenuItem(" 人機對弈 "); jit10.add(mode0);jit10.add(mode1);j

6、it11=new JMenuItem("悔棋 ");jit12=new JMenuItem("背景顏色 ");for(int i=0;i<jm.length;i+)for(int j=0;j<jiti.length;j+)jmi.add(jitij);panel0.add(label);bar.add(jm0);bar.add(jm1);frame.setJMenuBar(bar);frame.add(panel0,"North");/ 給菜單項設(shè)定事件public void addEventAction()jit00.a

7、ddActionListener(new ActionListener() / 開局public void actionPerformed(ActionEvent e) row=prow=0;col=pcol=0; isPC=cMode; isBlack = true; isEnd = false;for(int i=0;i<19;i+)for(int j=0;j<19;j+)if(i=0|j=0|i=(qipan.length-1)|j=(qipan.length-1)qipanij = -1;elseqipanij=0;if(isPC)/ 人機對弈模式label.setText

8、(" 游戲開始,請玩家先下棋! ");else/ 人人對弈模式label.setText(" 游戲開始,請 "+(isBlack?" 黑":" 白 ")+" 方先下棋! ");printqipan(row,col);addEventHandler(););jit01.addActionListener(new ActionListener() / 重新開始public void actionPerformed(ActionEvent e) row=prow=0;col=pcol=0;isBlac

9、k = true;isEnd = false;for(int i=0;i<19;i+)for(int j=0;j<19;j+)if(i=0|j=0|i=(qipan.length-1)|j=(qipan.length-1)qipanij = -1;elseqipanij=0;if(isPC)/ 人機對弈模式label.setText(" 游戲開始,請玩家先下棋! ");else/ 人人對弈模式label.setText(" 游戲開始,請 "+(isBlack?" 黑":" 白 ")+" 方先下

10、棋! ");printqipan(row,col);addEventHandler(););/ 給模式選項添加事件監(jiān)聽mode0.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) cMode = false;label.setText(" 已選擇人 "+(cMode?" 機":" 人 ")+" 對弈模式,重新開局將生效! "););mode1.addActionListener(new Acti

11、onListener()public void actionPerformed(ActionEvent e) cMode = true;label.setText(" 已選擇人 "+(cMode?" 機":" 人")+" 對弈模式,重新開局將生效! "););jit02.addActionListener(new ActionListener() / 結(jié)束游戲public void actionPerformed(ActionEvent e) label.setText(" 游戲結(jié)束,請按開局開始游戲!

12、");isEnd=true;);jit11.addActionListener(new ActionListener() / 悔棋public void actionPerformed(ActionEvent e) if(!isPC)huiqi();elsepchuiqi(););jit12.addActionListener(new ActionListener() / 背景顏色public void actionPerformed(ActionEvent e) Color cc=JColorChooser.showDialog(frame," 棋盤背景顏色 "

13、, new Color(226,189,0);if(cc!=null)c=cc;panel.setBackground(c););/ 監(jiān)聽鼠標事件,下棋以及判斷本盤是否結(jié)束,電腦是白方,玩家是黑方public void addEventHandler()panel.addMouseListener(new MouseAdapter()public void mousePressed(MouseEvent e) if(!isEnd)int x=(e.getX()-5)/30;int y=(e.getY()-5)/30;if(qipany+1x+1=0)load(x+1,y+1);elselabe

14、l.setText(" 此處已經(jīng)有棋子,請重新下子! "););/ 電腦下棋public void pcLoad()qixing();int count = 0;int hang = 0;int lie = 0;for(int i=0;i<17;i+)for(int j=0;j<17;j+)if(qixingPCij>count)count = qixingPCij;hang = i+1;lie = j+1; if(qixingPlayerij>count)count = qixingPlayerij;hang = i+1;lie = j+1;if(

15、qipanhanglie=0)load(lie,hang);return;/ 下棋子public void load(int x,int y)col=x;row=y;if(isBlack)prow=row;pcol=col;qipanrowcol=1;isBlack = false;elseqipanrowcol=2;isBlack = true;printqipan(row,col);if(panduan(row-1,col-1)if(isPC)label.setText(" 本局結(jié)束,恭喜 "+(isBlack?" 電腦":" 玩家&quo

16、t;)+" 獲勝! "); isEnd = true;elselabel.setText(" 本局結(jié)束,恭喜 "+(isBlack?" 黑":" 白 ")+" 方獲勝! "); isEnd = true;elseif(isPC)label.setText(isBlack?" 電腦":" 玩家 ")+" 在("+row+":"+col+")處下子,"+"現(xiàn)在"+(isBlack?

17、" 玩家":"電腦")+"下子! ”);白":" 黑")+" 方在("+處下子,"+"現(xiàn)在"+(isBlack?" 黑":"白 ")+" 下子! ");elselabel.setText(isBlack?" row+":"+col+")if(!isBlack) if(isPC) pcLoad();/ 刷新棋盤 public void printqipan(int n,

18、int m) panel=new DrawPanel(qipan,n,m); panel.setBackground(c); frame.add(panel,"Center");/ 人人對弈悔棋public void huiqi() if(isEnd)label.setText(" 游戲已經(jīng)結(jié)束不能悔棋,請重新開局! "); return;isBlack=!isBlack;qipanrowcol=0;printqipan(row,col);label.setText(isBlack?" 黑":" 白")+"

19、; 方悔棋,請重新下棋! ");/ 人機對弈悔棋public void pchuiqi() if(isEnd)label.setText(" 游戲已經(jīng)結(jié)束不能悔棋,請重新開局! "); return;qipanrowcol=0;qipanprowpcol=0;printqipan(row,col);label.setText(isBlack?" 玩家":" 電腦")+" 悔棋,請重新下棋! ");/ 算出雙方的棋形數(shù)組public void qixing()for(int i=0;i<17;i+)f

20、or(int j=0;j<17;j+)if(qipani+1j+1=0)/ 說明此處沒有棋子 qixingPCijheiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);qixingPlayerij heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);elseqixingPCij = 0; qixingPlayerij = 0;/ 算出黑子橫方向的棋型數(shù)值public int heiheng(int hang,int lie,int num)in

21、t k = 0;/記錄空白處的個數(shù)int count = 1;/ 記錄可以形成幾連int n = hang+1;/對應(yīng)棋盤的行int m = lie+1;/ 對應(yīng)棋盤的列boolean left = false;/判斷左邊是否有黑子boolean liveLeft = false;/判斷左邊是活還是死boolean liveRight = false;/ 判斷右邊是活還是死 while(qipannm-1!=-1)&&(qipannm-1=num|qipannm-1=0) if(qipannm-1=0&&k<1)/ 第一個空白 if(qipannm-2!=

22、num)liveLeft = true;break;k+;m-;else if(qipannm-1=num)/ 黑子left = true;m-;else/ 第二個空白liveLeft = true;break; if(!left) k = 0;m = lie+1;while(qipannm+1!=-1)&&(qipannm+1=num|qipannm+1=0) int t = qipannm+1;if(m=lie)count+;m+;continue;if(t=0&&k<1)/ 第一個空白if(qipannm+2!=num)liveRight = tru

23、e;break;k+;m+;else if(t=0&&k>0)/ 第二個空白liveRight = true;break;else/ 黑子m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/ 算出黑子豎方向的棋型數(shù)值public int heishu(int hang,int lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/ 記錄可以形成幾連int n = hang+1;/對應(yīng)棋盤的行int m = lie+1;/ 對應(yīng)棋盤的列boolean top = false;

24、/判斷上邊是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m!=-1)&&(qipann-1m=num|qipann-1m=0) if(qipann-1m=0&&k<1)/ 第一個空白 if(qipann-2m!=num)liveLeft = true;break;k+;n-;else if(qipann-1m=num)/ 黑子top = true;n-;else/ 第二個空白liveLeft = true; break;if(!top)k = 0;n = hang

25、+1; while(qipann+1m!=-1)&&(qipann+1m=num|qipann+1m=0) int t = qipann+1m;if(n=hang) count+; n+; continue;if(t=0&&k<1)/ 第一個空白 if(qipann+2m!=num) liveRight = true; break;k+;n+;else if(t=0&&k>0)/ 第二個空白liveRight = true; break;else/ 黑子n+; count+;/return jieguo(k=0,count);retu

26、rn jieguo(liveLeft,liveRight,count,k,num);/ 算出黑子左斜方向的棋型數(shù)值public int heizuoxie(int hang,int lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/ 記錄可以形成幾連int n = hang+1;/對應(yīng)棋盤的行int m = lie+1;/ 對應(yīng)棋盤的列boolean top = false;/判斷上邊是否有黑子boolean liveLeft = false;boolean liveRight = false; while(qipann+1m-1!=-1)&&

27、amp;(qipann+1m-1=num|qipann+1m-1=0) if(qipann+1m-1=0&&k<1)/ 第一個空白 if(qipann+2m-2!=num)liveLeft = true; break;k+;n+;m-;else if(qipann+1m-1=num)/ 黑子top = true;n+;m-;else/ 第二個空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1; while(qipann-1m+1!=-1)&&(qipann-1m+1=num|qipann-1

28、m+1=0) int t = qipann-1m+1;if(n=(hang+2)&&m=lie)count+;n-;m+;continue; if(t=0&&k<1)/ 第一個空白 if(qipann-2m+2!=num) liveRight = true; break;k+;n-;m+;liveRight = true;break;else/ 黑子n-;m+;count+;return jieguo(liveLeft,liveRight,count,k,num);/ 算出黑子右斜方向的棋型數(shù)值public int heiyouxie(int hang,i

29、nt lie,int num)int k = 0;/記錄空白處的個數(shù)int count = 1;/ 記錄可以形成幾連int n = hang+1;/對應(yīng)棋盤的行int m = lie+1;/ 對應(yīng)棋盤的列boolean top = false;/判斷上邊是否有黑子boolean liveLeft = false;boolean liveRight = false;while(qipann-1m-1!=-1)&&(qipann-1m-1=num|qipann-1m-1=0) if(qipann-1m-1=0&&k<1)/ 第一個空白 if(qipann-2m

30、-2!=num)liveLeft = true;break;k+;n-;m-;else if(qipann-1m-1=num)/ 黑子top = true;n-;m-;else/ 第二個空白liveLeft = true;break;if(!top)k = 0;n = hang+1;m = lie+1;while(qipann+1m+1!=-1)&&(qipann+1m+1=num|qipann+1m+1=0)int t = qipann+1m+1;if(n=hang&&m=lie)count+;n+;m+; continue;if(t=0&&k

31、<1)/ 第一個空白 if(qipann+2m+2!=num) liveRight = true; break;k+;n+;m+;else if(t=0&&k>0)/ 第二個空白 liveRight = true; break;else/ 黑子n+;m+; count+;return jieguo(liveLeft,liveRight,count,k,num);public int jieguo(boolean left,boolean right,int count,int k,int num) if(count=1)return 0;else if(count=

32、2)if(left&&right) if(k=0)if(num=2)return 60;elsereturn 50;elseif(num=2)return 40;elsereturn 35;else if(!left&&!right)return 0;elsereturn 10;else if(count=3)if(left&&right)if(k=0) if(num=2) return 950;elsereturn 700;elseif(num=2) return 900;elsereturn 650; else if(!left&&a

33、mp;!right)return 0;elsereturn 100;else if(count=4)if(left&&right)if(k=0)if(num=2) return 6000;elsereturn 3500; elseif(num=2) return 5000;elsereturn 3000; else if(!left&&!right)return 0;elseif(k=0)if(num=2)return 4000;elsereturn 800;elseif(num=2)return 3600;elsereturn 750;elseif(k=0)if(num=2)return 20000;elsereturn 15000;elseif(num=2)return 10000;elsereturn 3300;public void showMe()frame.setSize(530,600);Toolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize = kit.getScreenSiz

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論