AI算法实现五子棋(java)

  

本文实例为大家分享了AI算法实现五子棋的具体代码,供大家参考,具体内容如下

  

首先,实现一个五子棋要有一个棋盘,然后在这个棋盘上我们再来画出图,画五子棋棋盘有固定的行数和列数,再加上界面的大小和菜单栏,这些数据可能很多个类都需要用的到,我们可以先考虑自己写一个接口用来存储这些数据:

  

 AI算法实现五子棋(java)

        公共接口配置{   公共静态最终int大?703;//面板大小   公共静态最终int X0=大?19 * 2 - 8;   公共静态最终int Y0=X0-15;//棋盘网格起始点   公共静态最终int WID=大?19;//行宽   公共静态最终int行=15;//行数   公共静态最终int象棋=WID;//五子棋棋子大小      }      

这个时候我们来考虑写一个五子棋界面,除了常用的界面写法之外,考虑到五子棋的悔棋和重新开始,我们需要重写画方法,在需要的时候调用来达到更新棋盘的作用。

        进口java.awt.BasicStroke;   进口java.awt.BorderLayout;   进口java.awt.Color;   进口java.awt.Dimension;   进口java.awt.Graphics;   java . awt . graphics2d进口;      进口javax.swing.JPanel;         公共类Fivebord JPanel延伸实现配置{   私有静态最终长serialVersionUID l=1;   私人int[][]点=new int[大小](大小);      公共静态void main (String [] args) {   Fivebord fb=new Fivebord ();   fb.showFivebord ();   }      公共空间showFivebord () {//一下是关于界面的常规设置   javax.swing。JFrame摩根富林明=new javax.swing.JFrame ();   jf.setTitle (“FIVEBORD”);   摩根富林明。setSize(+ 100,大小);   jf.setDefaultCloseOperation (3);   jf.setLocationRelativeTo(空);   摩根富林明。setLayout(新BorderLayout ());      JPanel jp1=new JPanel ();   jp1.setBackground (Color.ORANGE);   jp1。大小)setPreferredSize(新维度(100);   jf.add (jp1 BorderLayout.EAST);      javax.swing。JButton jbu1=new javax.swing.JButton(“悔棋”);   jp1.add (jbu1);      javax.swing。JButton jbu2=new javax.swing.JButton(“人机”);   jp1.add (jbu2);      javax.swing。JButton jbu3=new javax.swing.JButton(“人人”);   jp1.add (jbu3);      this.setBackground (Color.YELLOW);   jf.add(这个,BorderLayout.CENTER);      jf.setVisible(真正的);//以下给界面添加监听器,包括画板和按钮   DrawMouse鼠标=new DrawMouse(这个);   jbu1.addActionListener(鼠标);   jbu2.addActionListener(鼠标);   jbu3.addActionListener(鼠标);   this.addMouseListener(鼠标);//监听器中需要考虑当前棋盘上的棋子和位置   mouse.setpoint(点);         }   公共空间油漆(图形g) {   super.paint (g);//super.paint//由于油漆函数是界面自带的函数且在某些时候会自动调用//super.paint (g)表示屏蔽父类的函数内容,换做自己接下来改写的内容   Graphics2D gr=(Graphics2D) g;   gr.setStroke(新BasicStroke (1));//二维画笔变粗度为1   (int i=X0; i<=X0 +线* WID; i +=WID) {   for (int j=Y0, j<=Y0 +线* WID; j +=WID) {   g。画直线(X0, j, X0 +线* WID, j);   g。画直线(Y0,我,Y0 + * WID行);   }   }//画内部16格   gr.setStroke(新BasicStroke (2));//画笔粗度变为2   g。画直线(X0-WID Y0-WID X0-WID, Y0 + (+ 1) * WID);   g。画直线(X0-WID Y0-WID X0 +(+ 1)行* WID Y0-WID);   g.drawLine (X0 +(+ 1)行* WID Y0-WID, X0 + (+ 1) * WID, Y0 + (+ 1) * WID);   g。画直线(X0-WID, Y0 +(+ 1)行* WID, X0 + (+ 1) * WID, Y0 + (+ 1) * WID);//画四周较粗的边框(美观起见,没有实际意义)   for (int i=X0; i<=X0 + (WID *(+ 1)行);i +=WID) {   for (int j=Y0, j<=Y0 +(+ 1)行* WID; j +=WID) {   如果(点[我][j]==1) {//画黑棋   g.setColor (Color.BLACK);   g。fillOval (i-WID/2, j-WID/2 WID WID);   }   else if(点[我][j]==2) {//画白棋   g.setColor (Color.WHITE);   g。fillOval (i-WID/2, j-WID/2 WID WID);   }   }   }//根据点的内容画出相应的点(即棋子)   }      }      

最最重要的就是监听器部分了,除了具有相应的监听功能,还要在每次人下棋之后智能判断出机器所需要下的位置,于此同时,每下一个棋子,都要判断是否已经有五子连成线进而提示输赢。

        进口java.awt.Color;   进口java.awt.Graphics;   进口java.awt.event.ActionEvent;   进口java.awt.event.ActionListener;   进口java.awt.event.MouseAdapter;   进口java.awt.event.MouseEvent;   进口java.util.HashMap;      进口javax.swing.JOptionPane;      公共类DrawMouse MouseAdapter延伸实现配置,ActionListener {//添加动作监听器(监听按钮)和鼠标监听器(鼠标所点位置画棋子)   私人图形g;   私人int x, y,有限公司=1,指数=0;   私人int [] [];   私人int pointweight [] []=new int [X0 +(+ 1)行* WID] [Y0 +(+ 1)行* WID];   私人int orderx []=new int [X0 +(+ 1)行* WID], ordery []=new int [Y0 +(+ 1)行* WID];   私人Fivebord fb;   私人int pc=0;   公共HashMap & lt;字符串,Integer>嗯=new HashMap & lt;字符串,Integer> ();//哈希表用来存放不同棋子布局下的不同权值         DrawMouse (Fivebord神奇动物){   这一点。g=fb.getGraphics ();   this.fb=fb;   sethashmap ();   }//传棋子数组   公共空间定位点(int [] []) {   this.point=点;   }   公共空间sethashmap () {   嗯。put (" 1 ", 1);//某一方向线上只有一个黑棋   嗯。(“12”,5);//某一方向线上紧接着一个黑棋有一个白棋   嗯。(“11”,10);   嗯。put (" 112 ", 15);//某一方向线上紧接着两个相邻的黑棋后有一个白棋(以此类推)   嗯。put (" 111 ", 100);   嗯。put (" 1112 ", 105);   嗯。put (" 1111 ", 1000);      嗯。put (" 2 ", 1);   嗯。(“21”,5);   嗯。(“22”,10);   嗯。put (" 221 ", 15);   嗯。put (" 222 ", 100);   嗯。put (" 2221 ", 105);   嗯。put (" 2222 ", 1000);   }      公共空间actionPerformed (ActionEvent e) {//悔棋操作,将棋子数目减一,然后重绘界面即可   如果(“悔棋”.equals (e.getActionCommand()),和index> 0) {   System.out.println(“悔棋”);   指数——;   点[orderx(指数)][ordery[指数]]=0;   fb.paint (g);   }//人机模式一旦点击,界面所有棋子清零,开始人机对战(pc=1)   如果(“人机“.equals (e.getActionCommand ())) {   System.out.println(“人机”);   电脑=1;   指数=0;   (int i=X0; i<=X0 + WID *线;i +=WID) {   for (int j=Y0, j

AI算法实现五子棋(java)