本文实例为大家分享了AI算法实现五子棋的具体代码,供大家参考,具体内容如下
首先,实现一个五子棋要有一个棋盘,然后在这个棋盘上我们再来画出图,画五子棋棋盘有固定的行数和列数,再加上界面的大小和菜单栏,这些数据可能很多个类都需要用的到,我们可以先考虑自己写一个接口用来存储这些数据:
公共接口配置{ 公共静态最终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, jAI算法实现五子棋(java)