围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉围棋规则及技巧,以及研究简单的人工智能,决定用Java开发围棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端和服务器端的交互用Class Message定义,有很好的可扩展性,客户端负责界面维护和收集用户输入的信息,及错误处理。服务器维护在线用户的基本信息和任意两个对战用户的棋盘信息,动态维护用户列表。在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高电脑AI方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。

直接上代码啦,let’s go

/*************************MainWindow**********************/
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
//抽象类,不能用于构造方法创建对象
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Point;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
//负责创建标签对象,标签用来显示信息,但没有编辑功能
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;             //利用import引用各类包public class MainWindow extends Frame implements Runnable
{Go panelGo=new Go();   //用Go类声明并创建一个panelGo对象Image myImage;int PORT;Socket sendSocket;               //主动连接SocketPrintWriter writer;              //用来发送messageboolean stopFlag;boolean isInitiative;Point messagePoint;Point goStartPoint=null;         //初始化Point yellowPoint=null;boolean stepColor=true;Point LastPoint=null;           //移除黄点时,判断位置变动BorderLayout borderLayout1 = new BorderLayout();    //用BorderLayout布局Panel panel1 = new Panel();     //创建面板Panel panel2 = new Panel();BorderLayout borderLayout2 = new BorderLayout();Panel panel3 = new Panel();CheckboxGroup checkboxGroup1 = new CheckboxGroup();    //选项框Checkbox checkbox1 = new Checkbox();   //声明创建Checkbox类的对象Checkbox checkbox2 = new Checkbox();Label label1 = new Label();TextField textField1 = new TextField();Button button1 = new Button();Label label2 = new Label();Choice choice1 = new Choice();Button button2 = new Button();GridLayout gridLayout1 = new GridLayout();            //利用GridLayout布局BorderLayout borderLayout3 = new BorderLayout();public MainWindow()         //构造MainWindow方法{try{jbInit();     //可能发生异常的语句}catch(Exception e){e.printStackTrace();}       //异常处理}private void jbInit() throws Exception   //用关键字throws声明抛出异常{choice1.setBackground(new Color(236, 190, 120));   //设置棋盘底色button1.setBackground(new Color(236, 190, 120));this.setResizable(false);new Thread(this).start();                         //启动监听线程this.PORT=1976;this.isInitiative=false;                          //是否主动连接this.stopFlag=false;                              //是否继续监听的标志this.choice1.addItem("黑");this.choice1.addItem("白");LastPoint=new Point();messagePoint=new Point();this.setSize(470,450);this.setTitle("围棋程序       作者:围棋对弈小组");   //设置标题this.panelGo.setEnabled(false);                 //开始之前屏蔽掉盘面checkbox1.addMouseListener(new java.awt.event.MouseAdapter(){public void mouseClicked(MouseEvent e){checkbox1_mouseClicked(e);}});            //获取监听器this.goStartPoint=this.panelGo.getLocation();    //this.setLayout(borderLayout1);            //设置背景布局panel1.setLayout(borderLayout2);checkbox1.setCheckboxGroup(checkboxGroup1);checkbox1.setLabel("单机");checkbox2.setCheckboxGroup(checkboxGroup1);checkbox2.setLabel("联机");              //设置名为联机的复选框checkbox2.addMouseListener(new java.awt.event.MouseAdapter(){public void mouseClicked(MouseEvent e){checkbox2_mouseClicked(e);}});       //获取监听器label1.setText("对方地址");//button1.setLabel("连接");      //设置名为连接的按钮button1.addActionListener(new java.awt.event.ActionListener(){public void actionPerformed(ActionEvent e){button1_actionPerformed(e);}});               //告诉监听器所发生的事件,并执行方法label2.setText("  ");button2.setBackground(new Color(236, 190, 120));button2.setLabel("开始");     //设置名为开始的按钮button2.addActionListener(new java.awt.event.ActionListener(){public void actionPerformed(ActionEvent e){button2_actionPerformed(e);}});          //panel3.setLayout(gridLayout1);     //设置布局gridLayout1.setRows(8);gridLayout1.setColumns(1);gridLayout1.setHgap(100);gridLayout1.setVgap(10);      //panel2.setLayout(borderLayout3);   //this.panel2.setSize(500,70);       //panelGo.addMouseMotionListener(new java.awt.event.MouseMotionAdapter(){public void mouseMoved(MouseEvent e){panelGo_mouseMoved(e);}});            //获取监听器panelGo.addMouseListener(new java.awt.event.MouseAdapter(){public void mouseClicked(MouseEvent e){panelGo_mouseClicked(e);}});           //获取监听器this.addWindowListener(new java.awt.event.WindowAdapter(){public void windowClosing(WindowEvent e){this_windowClosing(e);}});          //获取监听器panel3.setBackground(new Color(236, 190, 120));   //设置背景颜色//初始化创建的对象panel3.add(checkbox1, null);   panel3.add(checkbox2, null);panel3.add(label1, null);panel3.add(textField1, null);panel3.add(button1, null);panel3.add(choice1, null);panel3.add(button2, null);panel3.add(label2, null);this.panel1.add(this.panelGo,BorderLayout.CENTER);  //将panelGo添加到BorderLayout布局的中间this.panel1.add(panel3, BorderLayout.EAST);  //将pane13添加到BorderLayout布局的东区域this.add(panel2, BorderLayout.SOUTH);   //将pane12添加到BorderLayout布局的南区域this.add(panel1, BorderLayout.CENTER);   //将pane13添加到BorderLayout布局的中间this.disableLink();                     //废掉控件this.checkboxGroup1.setSelectedCheckbox(this.checkbox1);   //如果复选框处于选中状态该方法返回true,否则返回falsethis.yellowPoint=new Point(1000,1000);  //初始化一个世纪外的黄点this.centerWindow();loginDialog(this);    //调用loginDialog方法传进参数this}/************用户登录界面************/private JDialog login;   //声明一个私有类变量private void loginDialog(final Frame frame) {login = new JDialog();login.setTitle("登录");    //设置标题login.setLayout(new FlowLayout());   //利用流布局来设置窗口的布局login.add(new JLabel("用户名:"));   //添加标签为用户名的对象final JTextField name = new JTextField(10);   //设置文本框中字符不得超过10个login.add(name);login.add(new JLabel("密    码:"));final JPasswordField password = new JPasswordField(10);   //设置密码框中字符不得多于10个password.setEchoChar('*');   //设置显示密码对应的字符为*login.add(password);JButton confirm = new JButton("登录");    //定义一个登录按钮confirm.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (compareUserData(name.getText().trim(), new String(password.getPassword()))) {login.setVisible(false);frame.show();myImage=frame.createImage(16,16);//用来纪录有黄点之前的图像} else {JOptionPane.showMessageDialog(login, "用户名或密码错误!", "错误提示", JOptionPane.ERROR_MESSAGE);}}});   //获取监听器,并执行事件login.add(confirm);final JDialog regDialog = new JDialog(login, "注册", true);     //定义一个对象,该对象无法被继承registerDialog(regDialog);JButton register = new JButton("注册");    //设置注册的按钮register.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {regDialog.setVisible(true);}});    //获取监听器,执行regDialog为可见login.add(register);login.setSize(200, 130);login.setResizable(false);login.setLocationRelativeTo(null);login.setVisible(true);   //确保窗体里面的组件可见}private boolean compareUserData(String name, String password) {try {RandomAccessFile out = new RandomAccessFile("user.dat", "rw");String fname, fpassword = null;while (out.getFilePointer() < out.length()) {fname = out.readUTF();out.readUTF();fpassword = out.readUTF();if (fname.equals(name) && fpassword.equals(password)) return true;}out.close();   //可能发生异常的语句} catch (IOException e) {e.printStackTrace();}         //异常语句的处理return false;}private void registerDialog(final JDialog regDialog) {Box box1 = Box.createVerticalBox();box1.add(new JLabel("用户名:", JLabel.RIGHT));  //添加用户名标签,用户名在标签中靠右对齐box1.add(Box.createVerticalStrut(10));box1.add(new JLabel("性别:", JLabel.RIGHT)); //添加性别标签,性别在标签中靠右对齐box1.add(Box.createVerticalStrut(10));box1.add(new JLabel("密码:", JLabel.RIGHT), -1); //添加密码标签,密码在标签中靠右对齐box1.add(Box.createVerticalStrut(10));box1.add(new JLabel("确认密码:", JLabel.RIGHT)); //添加确认密码标签,确认密码在标签中靠右对齐Box box2 = Box.createVerticalBox();final JTextField nameTextField = new JTextField(10);  //设置用户名文本框字符不得超过10个,且文本框不能被继承box2.add(nameTextField);box2.add(Box.createVerticalStrut(8));final CheckboxGroup cbg = new CheckboxGroup();Box box21 = Box.createHorizontalBox();final Checkbox cb1 = new Checkbox("男", cbg, true);   //复选框默认状态选定为男性box21.add(cb1);box21.add(new Checkbox("女", cbg, false));      //当鼠标点击女性复选框时,flase自动变为truebox2.add(box21);box2.add(Box.createVerticalStrut(8)); //定义密码框中的字符长度小于10个final JPasswordField pass1 = new JPasswordField(10);box2.add(pass1);box2.add(Box.createVerticalStrut(8));final JPasswordField pass2 = new JPasswordField(10);box2.add(pass2);Box baseBox = Box.createHorizontalBox();baseBox.add(box1);baseBox.add(box2);regDialog.setLayout(new FlowLayout());regDialog.add(baseBox);JButton confirm = new JButton("确定");   //创建并声明确定按钮JButton cancel  = new JButton("取消");   //创建并声明取消按钮regDialog.add(confirm);regDialog.add(cancel);regDialog.setSize(200, 200);    //设置大小regDialog.setResizable(false);regDialog.setLocationRelativeTo(null);confirm.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {String sex = null;if (cbg.getSelectedCheckbox() == cb1)sex = "男";elsesex = "女";if (saveUserData(nameTextField.getText().trim(), sex, new String(pass1.getPassword()), new String(pass2.getPassword())))regDialog.setVisible(false);elseJOptionPane.showMessageDialog(regDialog, "输入有误,请检查", "错误提示",JOptionPane.ERROR_MESSAGE);}});        //获取监听器cancel.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {regDialog.setVisible(false);}});    //获取监听器}private boolean saveUserData(String name, String sex, String password1, String password2) {if (!password1.equals(password2)) return false;try {RandomAccessFile out = new RandomAccessFile("user.dat", "rw");out.seek(out.length());out.writeUTF(name);out.writeUTF(sex);out.writeUTF(password1);out.close();                   //可能发生异常的语句} catch (IOException e) {e.printStackTrace();return false;}      //异常的处理return true;}void centerWindow(){//返回一个Dimension对象的引用,该对象实体中含有名字是width和height的成员变量。Dimension d=Toolkit.getDefaultToolkit().getScreenSize();  int pX=(d.width-this.getWidth())/2;int pY=(d.height-this.getHeight())/2;this.setLocation(pX,pY);}/**********主方法*************/public static void main(String args[]){MainWindow main=new MainWindow();}//监听线程public void run(){try{ServerSocket serverSocket=new ServerSocket(PORT);Socket receiveSocket=null;receiveSocket=serverSocket.accept();if(this.isInitiative)                       //如果已在进行,则不接受连接this.stopFlag=true;this.checkboxGroup1.setSelectedCheckbox(this.checkbox2);     //自动选择联机this.button1.setEnabled(false);this.choice1.setEnabled(true);this.textField1.setEnabled(false);this.checkbox1.setEnabled(false);this.checkbox2.setEnabled(false);this.writer=new PrintWriter(receiveSocket.getOutputStream(),true);BufferedReader reader=new BufferedReader(new InputStreamReader(receiveSocket.getInputStream()));String message;while(!this.stopFlag){this.panelGo.showError("接收连接成功");message=reader.readLine();   //按行读取文件中的内容this.doMessage(message);}reader.close();receiveSocket.close();serverSocket.close();}catch(IOException ioe){this.panelGo.showError("意外中断");}}//处理接收到的信息void doMessage(String message){if(message.startsWith("start"))//判断开始{this.panelGo.showError("对方已开始");if(message.equals("start_black"))this.choice1.select("白");elsethis.choice1.select("黑");if(this.choice1.getSelectedItem().equals("黑"))//只要你是黑的,就先走this.panelGo.setEnabled(true);this.paintMyColor();//表明颜色this.disableLink();}else//下子的信息{int color=Integer.parseInt(message.substring(0,1));this.messagePoint.x=Integer.parseInt(message.substring(1,3));this.messagePoint.y=Integer.parseInt(message.substring(3,5));this.panelGo.setEnabled(true);//解禁this.panelGo.doStep(this.messagePoint,color);}}//为鼠标定位void panelGo_mouseMoved(MouseEvent e){Point realPoint=e.getPoint();Point mousePoint=this.panelGo.getMousePoint(realPoint,this.goStartPoint);this.removeLastMousePoint(this.LastPoint,mousePoint);this.LastPoint.x=mousePoint.x;this.LastPoint.y=mousePoint.y;if(this.isPlace(mousePoint))this.showMousePoint(mousePoint);}//加黄点的范围boolean isPlace(Point p){if(p.x>19||p.x<1||p.y<1||p.y>19)return false;int color;One one;one=(One)(this.panelGo.myHash.get(p));color=one.color;if(color!=0)return false;return true;}void panelGo_mouseClicked(MouseEvent e){if(this.isSingle()){this.doSingle();}else{this.doMultiple();}}//开始void button2_actionPerformed(ActionEvent e){if(e.getActionCommand().equals("开始")){this.disableLink();this.checkbox1.setEnabled(false);this.checkbox2.setEnabled(false);this.button2.setLabel("退出");if(this.isSingle())this.panelGo.setEnabled(true);else//联机版时{if(this.choice1.getSelectedItem().equals("黑")){this.writer.println("start_black");}elsethis.writer.println("start_white");}this.paintMyColor();//表明颜色}else if(e.getActionCommand().equals("退出")){this.dispose();System.exit(0);}}//disable联机时用的控件void disableLink(){this.textField1.setBackground(new Color(236, 190, 120));this.textField1.setEnabled(false);this.choice1.setEnabled(false);this.button1.setEnabled(false);}//enable联机时的控件void enableLink(){this.textField1.setBackground(Color.white);this.textField1.setEnabled(true);this.choice1.setEnabled(true);this.button1.setEnabled(true);}//判断类型boolean isSingle(){return this.checkbox1.getState();}void single(){}void multiple(){}//加小黄点void showMousePoint(Point mousePoint){Graphics g=this.panelGo.getGraphics();g.setColor(Color.yellow);g.fillOval(mousePoint.x*20-6,mousePoint.y*20-6,this.panelGo.INTERVAL-8,this.panelGo.INTERVAL-8);this.yellowPoint.x=mousePoint.x;//定位黄点this.yellowPoint.y=mousePoint.y;Graphics myG=this.myImage.getGraphics();this.createMyImage(myG,this.yellowPoint,0);}//消除前一个黄点void removeLastMousePoint(Point thatPoint,Point thisPoint){if(thatPoint.x!=thisPoint.x||thatPoint.y!=thisPoint.y){Graphics g=this.panelGo.getGraphics();if(this.yellowPoint!=null&&this.myImage!=null)g.drawImage(this.myImage,this.yellowPoint.x*20-8,this.yellowPoint.y*20-8,16,16,null);this.yellowPoint.x=1000;//不在范围内,就一边去this.yellowPoint.y=1000;}}//构成所需要的Imagevoid createMyImage(Graphics g,Point thisPoint,int color){int px=thisPoint.x;int py=thisPoint.y;Color myColor=this.panelGo.getBackground();  //设置背景色//设置棋盘线if(px==1&&py==1&&color==0)//四个角{g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,16);g.drawLine(5,5,5,16);g.drawLine(8,8,16,8);g.drawLine(5,5,16,5);}else if(px==1&&py==19&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,0);g.drawLine(8,8,16,8);g.drawLine(5,11,16,11);g.drawLine(5,11,5,0);}else if(px==19&&py==1&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,16);g.drawLine(8,8,0,8);g.drawLine(11,5,11,16);g.drawLine(11,5,0,5);}else if(px==19&&py==19&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,0);g.drawLine(8,8,0,8);g.drawLine(11,11,11,0);g.drawLine(11,11,0,11);}else if(px==1&&color==0)//四个边{g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,16,8);g.drawLine(8,0,8,16);g.drawLine(5,0,5,16);}else if(px==19&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,0,8);g.drawLine(8,0,8,16);g.drawLine(11,0,11,16);}else if(py==1&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,16);g.drawLine(0,8,16,8);g.drawLine(0,5,16,5);}else if(py==19&&color==0){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(8,8,8,0);g.drawLine(0,8,16,8);g.drawLine(0,11,16,11);}//八个小黑点else if(color==0&&((px==4&&py==4)||(px==4&&py==10)||(px==4&&py==16)||(px==10&&py==4)||(px==10&&py==10)||(px==10&&py==16)||(px==16&&py==4)||(px==16&&py==10)||(px==16&&py==16))){g.setColor(myColor);g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(0,8,16,8);g.drawLine(8,0,8,16);g.fillOval(5,5,6,6);}else if(color==0){g.setColor(myColor);//g.fillRect(0,0,16,16);g.setColor(Color.black);g.drawLine(0,8,16,8);g.drawLine(8,0,8,16);}}//单机版走步void doSingle(){if(this.stepColor)this.panelGo.doStep(this.yellowPoint,1);elsethis.panelGo.doStep(this.yellowPoint,2);if(!this.panelGo.errorFlag)//如果不违例,则换颜色{this.stepColor=!this.stepColor;this.paintThisColor(this.stepColor);}elsethis.panelGo.errorFlag=false;this.yellowPoint.x=1000;//刚走的子不至于删掉this.yellowPoint.y=1000;}//联机版走步void doMultiple(){int color;if(this.choice1.getSelectedItem().equals("黑"))color=1;elsecolor=2;this.panelGo.doStep(this.yellowPoint,color);//如果走法不对,返回if(this.panelGo.errorFlag){this.panelGo.errorFlag=false;return;}this.panelGo.setEnabled(false);String message=this.getMessage(color,this.yellowPoint.x,this.yellowPoint.y);this.writer.println(message);this.yellowPoint.x=99;//刚走的子不至于删掉,还要可以解析this.yellowPoint.y=99;}//处理发送字符串String getMessage(int color,int x,int y){String strColor=String.valueOf(color);String strX;String strY;//如果单数的话,就加一位if(x<10)strX="0"+String.valueOf(x);elsestrX=String.valueOf(x);if(y<10)strY="0"+String.valueOf(y);elsestrY=String.valueOf(y);return strColor+strX+strY;}void this_windowClosing(WindowEvent e){this.dispose();System.exit(0);}void checkbox2_mouseClicked(MouseEvent e){this.enableLink();}void checkbox1_mouseClicked(MouseEvent e){this.disableLink();}void button1_actionPerformed(ActionEvent e){this.goToLink(this.textField1.getText().trim(),this.PORT);}//主动连接serverSocketvoid goToLink(String hostName,int port){try{this.stopFlag=true;this.sendSocket=new Socket(hostName,port);this.panelGo.showError("连接成功!!");this.choice1.setEnabled(true);this.button1.setEnabled(false);this.checkbox1.setEnabled(false);this.checkbox2.setEnabled(false);this.textField1.setEnabled(false);this.writer=new PrintWriter(this.sendSocket.getOutputStream(),true);new Listen(sendSocket,this).start();}catch(IOException ioe){this.panelGo.showError("意外中断");}}//开始时根据颜色画己方颜色void paintMyColor(){Graphics g=this.label2.getGraphics();if(this.choice1.getSelectedItem().equals("黑"))g.fillOval(20,10,30,30);else{g.setColor(Color.white);g.fillOval(20,10,30,30);g.setColor(Color.black);g.drawOval(20,10,30,30);}}//单机版画每步颜色void paintThisColor(boolean whatColor){Graphics g=this.label2.getGraphics();if(whatColor)g.fillOval(20,10,30,30);else{g.setColor(Color.white);g.fillOval(20,10,30,30);g.setColor(Color.black);g.drawOval(20,10,30,30);}}
}
/***********************Go*************************************/
import java.awt.*;
import java.util.*;//引入包public class Go extends Panel
{int whichStep;Hashtable myHash;Point pointNow;             //当前的点Point STARTPOINT;           //起始点int INTERVAL;               //等高距Vector vec;                 //定义矢量Point robPoint;             //打劫点 Point mousePoint;           //鼠标点boolean errorFlag;          //行棋错误标志//构建器public Go(){super();                                  //super函数,方便子类调用父类里面的成员变量与构造方法pointNow=new Point(1000,1000);            //把初始红点画在外面errorFlag=false;                          //行棋错误标志whichStep=0;STARTPOINT=new Point(20,20);              //新的点所在的位置INTERVAL=20;                              //棋盘的间隔myHash=new Hashtable();                   //创建对象robPoint=null;                            //打劫点mousePoint=new Point();                   //开辟鼠标点内存vec=new Vector();                         //存放校验的子this.initMyHash(STARTPOINT,INTERVAL);try{jbInit();}catch(Exception e){e.printStackTrace();}                                          //异常处理}//初始化hashtablevoid initMyHash(Point startPoint,int interval){One one;Point key;                                //逻辑点标志int i,j;                                  //定义i,jfor(i=1;i<=19;i++)for(j=1;j<=19;j++)                    //循环{key=new Point(i,j);one=new One();                    //创建对象one.posX=startPoint.x+(i-1)*interval;//相邻点处理,获取one.posY=startPoint.y+(j-1)*interval;//相邻点处理。获取//获取相邻点one.pointAround[0]=new Point(i,j-1);      //上one.pointAround[1]=new Point(i,j+1);      //下one.pointAround[2]=new Point(i-1,j);      //左one.pointAround[3]=new Point(i+1,j);      //右if(i==1)one.pointAround[2]=one.OUT;       //左的周围if(i==19)one.pointAround[3]=one.OUT;      //右的周围if(j==1)one.pointAround[0]=one.OUT;       //上的周围if(j==19)one.pointAround[1]=one.OUT;      //下的周围myHash.put(key,one);                      //我的我的哈希表并且在里键入关键字}}//更新盘面public void paint(Graphics g){Point startPoint=STARTPOINT;                     //创建对象,开始点int interval=INTERVAL;                           //定义成员变量this.paintChessboard(g,startPoint,interval);     //棋盘的操作this.paintChessman(g,startPoint,interval);       //棋子的操作}//画棋盘void paintChessboard(Graphics g,Point startPoint,int interval){int pX=startPoint.x;                           //定义相邻点Xint pY=startPoint.y;                           //相邻点Yint LINELENGTH=interval*18;                    //定义路线长度int i;for(i=0;i<19;i++){g.drawLine(pX+i*interval,pY,pX+i*interval,pY+LINELENGTH);g.drawLine(pX,pY+i*interval,pX+LINELENGTH,pY+i*interval);}//for循环,以便构造19*19的棋盘g.fillOval(pX+interval*3-3,pY+interval*3-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*9-3,pY+interval*3-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*15-3,pY+interval*3-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*3-3,pY+interval*9-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*9-3,pY+interval*9-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*15-3,pY+interval*9-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*3-3,pY+interval*15-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*9-3,pY+interval*15-3,(int)(interval-14),(int)(interval-14));g.fillOval(pX+interval*15-3,pY+interval*15-3,(int)(interval-14),(int)(interval-14));//路线长度和间隔的确定g.drawRect(pX-3,pY-3,366,366);//棋盘大小}//加棋子void paintChessman(Graphics g,Point startPoint,int interval){//加入棋子,并且是按照一黑一白int pX=startPoint.x;                                 //相邻点Xint pY=startPoint.y;                                 //相邻点YEnumeration enun=myHash.elements();                  //创建对象while(enun.hasMoreElements()){One one=(One)enun.nextElement();if(one.color!=one.BLANK){if(one.color==one.BLACK)g.setColor(Color.black);else if(one.color==one.WHITE)g.setColor(Color.white);elsebreak;                                   //如果盘里加满了棋子,则跳出循环g.fillOval(one.posX-8,one.posY-8,interval-4,interval-4);//路线长度g.setColor(Color.black);                     //获取颜色g.drawOval(one.posX-8,one.posY-8,interval-4,interval-4);//画椭圆}}g.setColor(Color.red);                               //画红点g.fillOval(this.pointNow.x*20-5,this.pointNow.y*20-5,10,10);//路线间隔}//处理每一步void doStep(Point whatPoint,int whatColor){//如果点在盘外,返回if(whatPoint.x<1||whatPoint.x>19||whatPoint.y<1||whatPoint.y>19){this.showError("不能下在此处");this.errorFlag=true;                                 //在棋盘外,出错return;}//如果点上有子,则返回if(((One)myHash.get(whatPoint)).color!=0){this.showError("此处已有子");this.errorFlag=true;                                //此点已经有棋子了,不能下return;}//如果已经开劫了,则应先应劫,否则返回if(this.isRob(whatPoint)){this.showError("已经开劫,请先应劫");this.errorFlag=true;return;}this.updateHash(whatPoint,whatColor);                    //我的棋子所在的地方this.getRival(whatPoint,whatColor);                 //对手的棋子所在的地方//如果没有气也没有己类if(!this.isLink(whatPoint,whatColor)&&!this.isLink(whatPoint,0))//0相当于one.BLANK{this.showError("此处不可放子");this.errorFlag=true;this.singleRemove(whatPoint);                       //棋子所在的地方return;//返回}this.pointNow.x=whatPoint.x;this.pointNow.y=whatPoint.y;                            //得到当前红点this.repaint();                                         //返回到当前的点}//取异类并判断执行吃子void getRival(Point whatPoint,int whatColor){boolean removeFlag=false;                             //判断这一步到底吃没吃子One one;one=(One)(this.myHash.get(whatPoint));                //确定该步的位置Point otherPoint[]=one.pointAround;                   //该步周围的棋子int i;for(i=0;i<4;i++){One otherOne=(One)(this.myHash.get(otherPoint[i]));//举出异类实例if(!otherPoint[i].equals(one.OUT))if(otherOne.color!=one.BLANK&&otherOne.color!=whatColor){if(this.isRemove(otherPoint[i]))          //如果有气this.vec.clear();                     //不吃子else{this.makeRobber(otherPoint[i]);this.doRemove();                  //进行吃子行为this.vec.clear();                 //改点被清空removeFlag=true;                  //返回}}}if(!removeFlag)this.robPoint=null;                                //如果没吃子的话消掉打劫点}//判断是否因打劫不能下boolean isRob(Point p){if(this.robPoint==null)                                //打劫点不存在return false;                                      //返回错误if(this.robPoint.x==p.x&&this.robPoint.y==p.y)         //打劫点存在进行判断return true;                                       //返回正确return false;                                          //返回错误}//建立打劫点void makeRobber(Point point){if(this.vec.size()==1)this.robPoint=point;                           //建立新打劫点elsethis.robPoint=null;                                //吃多个的话消掉打劫点}//判断吃子boolean isRemove(Point point){if(this.vec.contains(point))return false;if(this.isLink(point,0))                                //有气的话return true;this.vec.add(point);                                    //没有气就加入这个点One one;one=(One)(this.myHash.get(point));                      //创建新的点Point otherPoint[]=one.pointAround;                     //新的点周围的棋子int i;for(i=0;i<4;i++){One otherOne=(One)(this.myHash.get(otherPoint[i]));//举出同类实例if(!otherPoint[i].equals(one.OUT))                 //如果周围的点不等同于输入点的颜色if(otherOne.color==one.color)                  //如果周围的点是颜色相同if(this.isRemove(otherPoint[i]))       //这里递归,移除return true;}return false;}//执行消子void doRemove()                                            //执行消棋子的步骤{Enumeration enun=this.vec.elements();                  //列出各种情况while(enun.hasMoreElements()){Point point=(Point)enun.nextElement();             //指向下一个元素this.singleRemove(point);                          //单独移除的点}}//消单个子void singleRemove(Point point){One one=(One)(this.myHash.get(point));one.isthere=false;one.color=one.BLANK;Graphics g=this.getGraphics();g.clearRect(point.x*20-8,point.y*20-8,20,20);         //删除画面上的子}//判断有气boolean isLink(Point point,int color)                     //进行判断是否有气{One one;one=(One)(this.myHash.get(point));                   //新输入的点Point otherPoint[]=one.pointAround;                  //周围的点int i;for(i=0;i<4;i++){One otherOne=(One)(this.myHash.get(otherPoint[i]));//举出同类实例if(!otherPoint[i].equals(one.OUT))                //如果周围的点不等同于输入的点的颜色if(otherOne.color==color)                     //如果周围的点颜色相同{return true;                              //返回TRUE}}return false;                                          //如果不满足,返回错误}//每一步更新myHashvoid updateHash(Point whatPoint,int whatColor)            //更新操作{One one=(One)(this.myHash.get(whatPoint));            //创建myHashone.isthere=true;                                     //所下的点符合one.color=whatColor;                                  //确定颜色this.whichStep=this.whichStep+1;                      //走步增加1one.whichStep=this.whichStep;                         //确定走步}Point getMousePoint(Point p1,Point p2)                    //p1为真实点,p2为相对原点{this.mousePoint.x=Math.round((float)(p1.x-p2.x)/this.INTERVAL); //用四舍五入计算逻辑点位置this.mousePoint.y=Math.round((float)(p1.y-p2.y)/this.INTERVAL);//用四舍五入计算逻辑点位置return this.mousePoint;                               //返回该位置}//显示错误信息void showError(String errorMessage){Graphics g=this.getGraphics();                       //创建图gg.setColor(new Color(236,190,98));                   //定义错误信息的颜色g.fillRect(20,400,30,200);                           //路线长度g.setColor(Color.red);                               //画红点g.drawString(errorMessage,60,415);                   //错误信息g.fillOval(20,400,20,20);                            //路线间隔}private void jbInit() throws Exception                   //扔出错误{this.setBackground(new Color(236, 190, 120));        //背景色}
}
/*************************One************************/
import java.awt.*;
public class One
{int BLACK=1;//定义黑子等于1int WHITE=2;//定义白子为2int BLANK=0;Point OUT=new Point(-1,-1);int whichStep;int color=BLANK;       //定义颜色boolean isthere=false;//此处为错误的Point pointAround[]={OUT,OUT,OUT,OUT};int posX;             //定义相邻点Xint posY;             //定义相邻点Y}
/*******************GoApplet**************************/
import java.applet.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;//引用相应的包public class GoApplet extends Applet
{public void init()//创建对象{new MainWindow().show();//主窗口}}
/***********************Listen******************************/
import java.io.*;
import java.net.*;public class Listen extends Thread                      //继承
{Socket socket;MainWindow mainWindow;                              //主窗口public Listen(Socket socket,MainWindow mainWindow)  //监听{this.socket=socket;                             //使用this区分成员变量和局部变量this.mainWindow=mainWindow;                     //使用this区分成员变量和局部变量}public void run()                                   //运行{try{this.activeListen(this.socket);}catch(IOException ioe){                         //异常处理this.mainWindow.panelGo.showError("意外中断");}}void activeListen(Socket socket) throws IOException   //活动监听者{BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//缓冲流String message;                                   //键入通知while(true){message=reader.readLine();                    //读入信息this.mainWindow.doMessage(message);           //在主窗口中执行读取的信息}}
}

运行登录后的主界面如下:

java围棋对弈实例相关推荐

  1. java中怎么编写围棋对弈_java课程设计围棋对弈(含代码).doc

    java课程设计围棋对弈(含代码).doc C:\ProgramFiles\Java\jdk1.8.0_45Java程序课程设计任务书1.主要任务与目标创建一个围棋对弈平台.基于Panel类定义一个面 ...

  2. java中怎么编写围棋对弈,TPWEIQI : JAVA 网络围棋对弈系统

    1 支持简单的聊天功能. 2 在对局前可以设定猜先.让子.贴目.记时等规则,在对局中可以请求悔棋. 和棋.封棋,可以认输和手工计算比赛胜负,棋盘可以自动提死子和判别打劫. 3 客户端的棋盘大小可变化, ...

  3. java围棋毕业设计_(毕业论文)围棋游戏的设计与实现.doc

    围棋游戏的设计与实现 摘 要 围棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏.主要完成了人机对战和玩家之间联网对战2个功能.网 ...

  4. java 围棋代码_java围棋源代码

    基于 WWW 的围棋棋谱演示软件的设计 丁振凡 [期刊名称]<微型机与应用> [年(卷),期]2000(019)008 [摘要]介绍采用 Java 结合 ASP 编程实现的围棋棋谱.... ...

  5. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  6. 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)

    用 XStream 序列化/反序列化 XML 为 Java 对象(实例) Posted on 2007-06-05 19:06 Stephen Wong 阅读(1224) 评论(0)  编辑 收藏 网 ...

  7. JAVA实现SFTP实例(JSCH)

    JAVA实现SFTP实例 最近写的一个JAVA实现SFTP的实例: /* * Created on 2009-9-14 * Copyright 2009 by www.xfok.net. All Ri ...

  8. java rmi 入门实例

    java rmi 入门实例 (2009-06-16 16:07:55) 转载▼ 标签: java rmi 杂谈 分类: java-基础  java rmi即java远程接口调用,实现了2台虚拟机之间的 ...

  9. c++ java通信 protocol buffer,google protocol buffer (C++,Java序列化应用实例)

    google protocol buffer (C++,Java序列化使用实例) 转载,请注明出处: http://blog.csdn.net/eclipser1987/article/details ...

  10. java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...

    java ldap操作实例 LDAP身份验证是世界上最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft为Windows提供的LDAP实现)是另一种广泛使用的 ...

最新文章

  1. 浪潮成立人工智能部门 为AI提供顶尖计算产品
  2. 【数字信号处理】序列傅里叶变换 ( 序列傅里叶变换定义详细分析 | 证明单位复指数序列正交完备性 | 序列存在傅里叶变换的性质 | 序列绝对可和 → 序列傅里叶变换一定存在 )
  3. threejs添加立方体_前端图形学(三十)——从源码去看threejs中的光照模型
  4. 详解Attention、Tacotron、WaveNet、LPCNet声码器等前沿方法
  5. java实现分页打印功能_web 页面分页打印的实现
  6. 全文检索技术介绍与使用方法
  7. django language_「基于Python技术的智慧中医商业项目」Django问诊系统篇-1.系统配置...
  8. MyEclipse IDEA 安装 激活JRebel工具
  9. 11.2. simpara
  10. CentOS系统启动过程1-10 详细叙述
  11. WPF 入门教程 TextBox详解
  12. 你所热爱的,就是你的生活
  13. idea 2018.1破解激活方法,有效期至2099年
  14. GB、Gb、MB、Mb知识扫盲
  15. 快速了解元宇宙的 7 层产业链
  16. eclipse 3.7(indigo)在线安装中文语言包
  17. web前端布局练手项目
  18. 《微观经济学》 第七章
  19. 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)
  20. xctf 实时数据监测

热门文章

  1. chrome浏览器安装包点击无反应
  2. 组建局域网_组网方案图文教程,双路由器有线搭建网络,公司家庭组建局域网...
  3. spss常态检验_科学网—如何在SPSS中进行正态分布检验?
  4. 进程间通信之CreatePipe
  5. html网站计数器代码,网站计数器(示例代码)
  6. 算法设计与分析(期末复习重点)更新中
  7. 非线性可视化(2)非线性相图
  8. access mysql mssql_ACCESS数据库自行转换成MSSQL数据库教程
  9. java 常用的时间相关转化
  10. 金士顿u盘写保护修复教程