java井字棋源代码.doc_第1页
java井字棋源代码.doc_第2页
java井字棋源代码.doc_第3页
java井字棋源代码.doc_第4页
java井字棋源代码.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.lang.*;import java.util.*;/import com.borland.jbcl.layout.*;public class ChessFrame extends JFrame/游戏界面参数private Container contentPane;private JPanel upPanel;private JPanel leftPanel;private JPanel centerPanel;private JPanel rightPanel;private JPanel downPanel;private JComboBox level; /游戏级别private JComboBox size; /棋盘大小private JRadioButton cb1; /单选按钮,玩家先手private JRadioButton cb2; /单选按钮,电脑先手private JButton b4; /开始private JButton b5; /结束private JButton b6; /退出按钮private JButton b; /棋盘按钮private JLabel b1; /欢迎词private JLabel b11; private JLabel b12; private JLabel b2; /棋局状况private JLabel b3; /棋局结果private JLabel b31; private JLabel b32; /程序参数private int startturn; /先下棋的一方,1代表玩家,2代表电脑private int a; /棋盘信息,0代表无棋子,1代表玩家下的棋子,2代表电脑下的棋子private int result; /棋局结果,1代表玩家赢,2代表电脑赢,3代表平手private int c_size; /棋盘大小,本游戏中有3乘3,4乘四,5乘5三种棋盘private int c_level; /游戏级别,低级,中级,高级分别对应0,1,2private int x; /玩家出的棋子所在位置的行号private int y; /玩家所出棋子所在的列号public ChessFrame() super(井字棋人机大作战);/调用界面初始化函数frameInitnew();/退出程序WindowListener w=new WindowAdapter()public void windowClosing(WindowEvent e)ChessFrame.this.dispose();System.exit(0);this.addWindowListener(w);/定义响应鼠标单击的事件ActionListener ch=new ActionListener()public void actionPerformed(ActionEvent e)if(e.getSource()=level) /级别c_level=level.getSelectedIndex();else if(e.getSource()=size) /根据棋盘大小隐藏部分按钮c_size=size.getSelectedIndex()+3; if(c_size=3) b03.setVisible(false); b13.setVisible(false); b23.setVisible(false); b33.setVisible(false); b30.setVisible(false); b31.setVisible(false); b32.setVisible(false); b04.setVisible(false); b14.setVisible(false); b24.setVisible(false); b34.setVisible(false); b44.setVisible(false); b40.setVisible(false); b41.setVisible(false); b42.setVisible(false); b43.setVisible(false); else if(c_size=4) b03.setVisible(true); b13.setVisible(true); b23.setVisible(true); b33.setVisible(true); b30.setVisible(true); b31.setVisible(true); b32.setVisible(true); b04.setVisible(false); b14.setVisible(false); b24.setVisible(false); b34.setVisible(false); b44.setVisible(false); b40.setVisible(false); b41.setVisible(false); b42.setVisible(false); b43.setVisible(false); elseb03.setVisible(true); b13.setVisible(true); b23.setVisible(true); b33.setVisible(true); b30.setVisible(true); b31.setVisible(true); b32.setVisible(true);b04.setVisible(true); b14.setVisible(true); b24.setVisible(true); b34.setVisible(true); b44.setVisible(true); b40.setVisible(true); b41.setVisible(true); b42.setVisible(true); b43.setVisible(true);else if(e.getSource()=cb1) /控制单选按钮cb1.setSelected(true);cb2.setSelected(false);cb1.updateUI();cb2.updateUI();startturn=1;else if(e.getSource()=cb2)cb1.setSelected(false);cb2.setSelected(true);cb1.updateUI();cb2.updateUI();startturn=2;else if(e.getSource()=b4) /开始按钮/调用内部函数,初始化棋盘 beginChess(); else if(e.getSource()=b5) /结束按钮endChess();else if(e.getSource()=b6) /exitSystem.exit(0);else for(int ii=0;iic_size;ii+) for(int jj=0;jjc_size;jj+) if(e.getSource()=biijj) x=ii; y=jj; playchess(); /end else/end actionPerformed;/end actionlistener/将所有按钮加入监听器for(int i=0;i5;i+)for(int j=0;j5;j+)bij.addActionListener(ch);level.addActionListener(ch);size.addActionListener(ch);cb1.addActionListener(ch);cb2.addActionListener(ch);b4.addActionListener(ch);b5.addActionListener(ch);b6.addActionListener(ch);this.setVisible(true); /end Chessframe /界面初始化函数 private void frameInitnew() contentPane=this.getContentPane();/界面的大小和位置this.setSize(500,500);this.setResizable(false);Dimension frameSize=this.getSize();Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation(screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2); /将整个界面划分成五个区域,东南西北中/西为棋盘/北为欢迎词/中为空白区/东为命令按钮及棋局状况/南为游戏结果/初始状态为3乘3棋盘,级别为低级,电脑先手c_size=3; startturn=2;c_level=0;chessboardFormed(); /形成棋盘 /其他是固定的,所以不需单独形成函数/北区,欢迎词b1=new JLabel( 欢迎来到虫子的世界!,JLabel.CENTER);b1.setFont(new java.awt.Font(Times,Font.PLAIN, 25);b1.setForeground(Color.darkGray);b11=new JLabel( ,JLabel.CENTER);b12=new JLabel( ,JLabel.CENTER);upPanel=new JPanel();upPanel.setLayout(new GridLayout(3,1);upPanel.setPreferredSize(new Dimension(500, 80);upPanel.add(b11);upPanel.add(b1);upPanel.add(b12);contentPane.add(upPanel,BorderLayout.NORTH);/南区,棋局结果,初始状态为空b3=new JLabel( 虫子的世界 ,JLabel.CENTER);b31=new JLabel( ,JLabel.CENTER);b32=new JLabel( ,JLabel.CENTER);b3.setFont(new java.awt.Font(Times,Font.PLAIN, 25);b3.setForeground(Color.darkGray);downPanel=new JPanel();downPanel.setPreferredSize(new Dimension(500, 60);downPanel.setLayout(new GridLayout(3,1);downPanel.add(b31);downPanel.add(b3);downPanel.add(b32);contentPane.add(downPanel,BorderLayout.SOUTH);/东区,包括游戏级别选择,棋盘大小选择,先手方选择,以及开始,结束退出按钮rightPanel=new JPanel();rightPanel.setPreferredSize(new Dimension(100, 360);rightPanel.setLayout(new GridLayout(8,1,0,15);b2=new JLabel( ,JLabel.CENTER);b2.setFont(new java.awt.Font(Dialog, 0, 15);b4=new JButton(开始);b4.setFont(new java.awt.Font(Dialog, 0, 20);b4.setBorder(BorderFactory.createRaisedBevelBorder();b5=new JButton(结束);b5.setFont(new java.awt.Font(Dialog, 0, 20);b5.setBorder(BorderFactory.createRaisedBevelBorder();b6=new JButton(退出);b6.setFont(new java.awt.Font(Dialog, 0, 20);b6.setBorder(BorderFactory.createRaisedBevelBorder();b5.setEnabled(false);cb1=new JRadioButton(玩家先手);cb2=new JRadioButton(电脑先手);/cb1.setMinimumSize(new Dimension(91, 25); cb1.setPreferredSize(new Dimension(30, 15); cb1.setSelected(false); /cb2.setMinimumSize(new Dimension(91, 25); cb2.setPreferredSize(new Dimension(30, 15); cb2.setSelected(true); cb1.setFont(new java.awt.Font(Dialog, 0, 15); cb2.setFont(new java.awt.Font(Dialog, 0, 15); level=new JComboBox(); level.addItem(初级); level.addItem(中级); level.addItem(高级);size=new JComboBox();size.addItem(3乘3棋盘);size.addItem(4乘4棋盘);size.addItem(5乘5棋盘);rightPanel.add(size);rightPanel.add(level);rightPanel.add(cb1);rightPanel.add(cb2);rightPanel.add(b2);rightPanel.add(b4);rightPanel.add(b5);rightPanel.add(b6);contentPane.add(rightPanel,BorderLayout.EAST); /end frameInitnew private void chessboardFormed() /形成棋盘 int i,j; leftPanel=new JPanel();leftPanel.setPreferredSize(new Dimension(300, 300); b=new JButton55; leftPanel.setLayout(new GridLayout(5,5,10,10); for(i=0;i5;i+) for(j=0;j5;j+) bij=new JButton(); bij.setBorder(BorderFactory.createRaisedBevelBorder(); bij.setPreferredSize(new Dimension(30, 30); bij.setBackground(Color.white); bij.setEnabled(false); leftPanel.add(bij); if(c_size=3) b03.setVisible(false); b13.setVisible(false); b23.setVisible(false); b33.setVisible(false); b30.setVisible(false); b31.setVisible(false); b32.setVisible(false); b04.setVisible(false); b14.setVisible(false); b24.setVisible(false); b34.setVisible(false); b44.setVisible(false); b40.setVisible(false); b41.setVisible(false); b42.setVisible(false); b43.setVisible(false); else if(c_size=4) b04.setVisible(false); b14.setVisible(false); b24.setVisible(false); b34.setVisible(false); b44.setVisible(false); b40.setVisible(false); b41.setVisible(false); b42.setVisible(false); b43.setVisible(false); else leftPanel.setLocation(200,200); contentPane.add(leftPanel,BorderLayout.WEST); /end chessboardFormed() private void beginChess() int i,j,k; k=c_size/2; a=new intc_sizec_size; for(i=0;ic_size;i+) for(j=0;jc_size;j+) bij.setBackground(Color.white); aij=0; if(startturn=2) /电脑先手,选择中间的位置作为第一步 akk=2; bkk.setEnabled(false); /bkk.setText(x); bkk.setBackground(Color.blue); else /玩家先手,则初始化为空棋盘 bkk.setEnabled(true); for(i=0;ic_size;i+) for(j=0;jc_size;j+) if(i!=k|j!=k) bij.setEnabled(true); cb1.setEnabled(false); cb2.setEnabled(false); size.setEnabled(false); level.setEnabled(false); b2.setText(玩家思考中.); b3.setText( ); b4.setEnabled(false); b5.setEnabled(true); /end beginChess private void endChess() /终止当前游戏,棋盘为空棋盘并且不可用 int i,j; for(i=0;ic_size;i+) for(j=0;jc_size;j+) bij.setEnabled(false);bij.setBackground(Color.white); cb1.setEnabled(true); cb2.setEnabled(true); size.setEnabled(true); level.setEnabled(true); b4.setEnabled(true);b5.setEnabled(false);b2.setText( ); /end endChess private void playchess() int i,j,k,k1,k2; k=0; for(i=0;ic_size;i+)for(j=0;jc_size;j+)bij.setEnabled(false);/endfor /bxy.setText(O);bxy.setBackground(Color.red);axy=1;b2.setText(电脑思考中.);if(isWinornot() /判断是否已经分出胜负b4.setEnabled(true); b5.setEnabled(false);/根据result的值判断棋局的结果b2.setText(游戏结束);switch(result)case 1: b3.setText(恭喜您,您赢了);break;case 2: b3.setText(真笨,您输了);break;case 3: b3.setText(哈哈,平手);break;cb1.setEnabled(true);cb2.setEnabled(true);level.setEnabled(true);size.setEnabled(true);/endifelse /电脑根据级别选择下一步棋子switch(c_level)case 0: k=choosenext0();break;case 1: k=choosenext1();break;case 2: k=choosenext2();break;k1=k/10;k2=k%10; /分离出行号和列号/bk1k2.setText(X);bk1k2.setBackground(Color.blue);ak1k2=2;if(isWinornot()b4.setEnabled(true); b5.setEnabled(false); /根据result的值判断棋局的结果b2.setText(游戏结束);switch(result)case 1: b3.setText(恭喜您,您赢了);break;case 2: b3.setText(真笨,您输了);break;case 3: b3.setText(哈哈,平手);break;cb1.setEnabled(true); cb2.setEnabled(true);level.setEnabled(true);size.setEnabled(true);else /继续接受用户输入 for(i=0;ic_size;i+)for(j=0;jc_size;j+)if(aij=0)bij.setEnabled(true);b2.setText(玩家思考中.);/endelse private boolean isWinornot() int i,j,k; boolean fa; /找是否在同一行上有连成一条线的 for(i=0;ic_size;i+) k=ai0; fa=true; if(k!=0) for(j=1;jc_size;j+) if(aij!=k) fa=false; if(fa) /有一方的棋子在横向上连成一条线了 if(k=1) result=1; /判断是哪一方的棋子 else result=2; return true; /endfor /找同一列上有没有连成一条线的 for(j=0;jc_size;j+) k=a0j; fa=true; if(k!=0) for(i=1;ic_size;i+) if(aij!=k) fa=false; if(fa) /有一方的棋子在横向上连成一条线了 if(k=1) result=1; else result=2; return true; /找斜对角线有没有连成一条线的 k=a00; fa=true; if(k!=0) for(i=1;ic_size;i+) if(aii!=k) fa=false; if(fa) if(k=1) result=1; else result=2; return true; j=c_size-1; k=a0j; fa=true; if(k!=0) for(i=1,j-;ic_size;i+,j-) if(aij!=k) fa=false; if(fa) if(k=1) result=1; else result=2; return true; /若经过上面的查找,没有一方获胜,则查找是否还能输入棋子 /若还可输入,则返回false,游戏继续 /若不能继续输入棋子,则游戏结束,双方达成平手 for(i=0;ic_size;i+) for(j=0;jc_size;j+) if(aij=0) return false ; result=3; return true; /初级玩法,电脑选择下一步的做法是按从上到下从左到右选择第一个空的棋格 private int choosenext0() int i,j,c=0; for(i=0;ic_size;i+) for(j=0;jc_size;j+) if(aij=0) c=10*i+j; return c; return 0; /用阿尔发-贝他算法,向前看两部 private int choosenext1() / max_i代表最佳走法所在的行号,max_j代表最佳走法所在的列号/h为各种状态下的价值评估函数 int i,j,max_i,max_j,h; int p,q; int minus,plus; minus=200; max_i=0; max_j=0; for(i=0;ic_size;i+) /选择第一个空的棋格 for(j=0;jc_size;j+) if(aij=0) max_i=i; max_j=j; aij=2; if(isWinornot() /如果这一步可以导致电脑赢,那么就返回这一步 if(result=2) aij=0; return 10*max_i+max_j; i=c_size; /为了跳出循环 j=c_size; /找到第一步 /从第一个分支中找出价值函数最小的 for(i=0;ic_size;i+) /试探出所有的分支分别求他们的评估函数 for(j=0;jc_size;j+) /求当前棋局的价值评估函数 if(aij=0) aij=1; h=evaluate(); if(hminus) minus=h; aij=0; /一个有效分支 plus=minus; amax_imax_j=0; i=max_i; /再查找其他的分支/因为第一个找到的棋格无需再判断,将剩余的棋格分成两部分/第max_i行第max_j个棋格之后的/第max_i行之后的棋格 for(j=max_j+1;jc_size;j+) if(aij=0) minus=200; aij=2; if(isWinornot() if(result=2) aij=0; return 10*i+j; for(p=0;pc_size;p+) for(q=0;qc_size;q+) if(apq=0) apq=1; h=evaluate(); apq=0; if(h=plus) /剪枝,剩下子节点无需再判断 minus=h; q=c_size; p=c_size; /跳出两重循环 else if(hplus&minus!=200) /plus值增加,更好的走法 plus=minus; max

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论