精华内容
下载资源
问答
  • 当前位置:我的异常网» 编程»Java从此丰富多彩-五子棋项目总结Java从此丰富多彩-五子棋项目总结www.myexceptions.net网友分享于:2013-11-08浏览:7次Java自此丰富多彩--五子棋项目总结历经数天的艰苦奋战,五子棋...

    当前位置:我的异常网» 编程 » Java从此丰富多彩-五子棋项目总结

    Java从此丰富多彩-五子棋项目总结

    www.myexceptions.net  网友分享于:2013-11-08  浏览:7次

    Java自此丰富多彩--五子棋项目总结

    历经数天的艰苦奋战,五子棋的项目终于拿下了。

    我觉得,这里面的精华是平常我们所不注意的东西。

    最开始我是有5个文件来实现的,但是我发现自己不善于整合(至少是现在),

    所以:我把一开始的判断输赢类和后来的结果输出类都归纳在了一起,这样我在实现的时候就显得很游刃有余,诚然,我是按照自己的方式做的,分开自己也没问题,只是还有待习惯。

    其实这也是我想要总结的第一点:练习。

    这个道理简单的浮云了,可是你不去做还是不知道何如,所以说,熟练程度有时候远胜于技巧,至少我是这么理解的。

    我在编写人机对战的算法的过程中,三次“易稿”:

    从最开始的原始程序,到后来的优化程序1.0,再到最后的版本2.0,

    我几乎是一种思想,三种套路,在脑子里勾画并敲击了三遍。

    没有现在的熟练,没有现在这样基础程序阶段的熟练,没有现在一步一个脚印的熟练应用,就没有将来的驰骋。

    我发现自己纠结类最久的就是那个所谓的“实例化对象”的问题,这个问题之前就有,我以为自己解决类,其实还隐藏在比较深层次的地方我没有发现。

    五子棋的编写过程中,这个问题最明显的出现就是我程序运行时无数次的“空指针异常”。

    我总结类我在解决“空指针异常”时的几种处理方式:

    1:看在使用对象或者类的方法时,有没有实例化对象,有没有赋初值,有没有将用到的方法写规范;

    2:通过在方法中或者在主函数中,添加输出行的方法来判断在程序运行中是否有错误,根据输出的值进行修正或者重写

    3:根据错误提示的位置,看调用或者被电泳的环节是否正确无误

    4:在编写程序的过程中,尽量在算法环节和必要处添加详细一点的注释,使修改和代码的含义更加明了易读

    5:最后,就是在编写大的改动时,提前进行备份,

    虽然Ctrl+Z可以为你挽回一些过失,但是当改动变多而你又需要跳出来回到原程序去找寻思路时,这个快捷键恐怕就无能为力了,

    而且,有时候它可能还会引起你不必要的错误:

    比如:忘记恢复某一文件的修改或恢复过多导致修正失效。

    五子棋项目其实是分三个阶段的实现的:

    1:实现棋盘界面,实现落子的位置相对固定,同时判定输赢

    2:实现人人对战,即黑白两种棋子交替出现

    3:实现人机对战,即简单的“人工智能”——通过编写棋子周边空位的权值的类来具体实现

    第一个阶段我在之前就顺利完成了,从第二个阶段开始就遇到了障碍。

    对于人人对战来说,就是棋子交替的出现,就是要存储每个棋子的位置,位子里面所存的值相应的随着落子发生变化,然后就是判定输赢。

    在这里则出现了我所要总结的第二点:耐心&专注。

    说实话,我有时候是没有什么所谓耐心的,我也没想过我什么时候,多久会完成这个工作,我会在失败了很多次看了无数行红字之后崩溃一段时间,此时耐心值接近零。

    从做人机开始我就一直在两个问题上纠结:一是之前的对象问题,在这里不是穿插出现;二是机器的智能落子和权值计算的问题——焦头烂额恐怕是很贴切了。

    我会每每做一个下午,然后收获甚微有时甚至是失望而归,把类实例化类放到主函数里面,调用,完善主函数的执行,优化监听器,云里雾里的。

    之后的两天我开始玩三国杀了。我每晚都要玩大概两个小时然后才回到程序的正题。在玩的过程中我几乎什么都没想就是一心玩,将我还有大量错误的程序搁置一边,不复思考。在三国杀里酣畅淋漓的胜利之后我归来了,(虽然在新手区哈哈),那是我就很想喊一声Superman returns 里面的那句台词:I’m BACK!!

    我觉得热那就是有时候需要一种释放,然后回到自己的自我中来,我一边回忆一边思考,差不多搞了一个大概,又是两天,我终于完成了!

    我觉得自己突然间就顿悟了,真的,那种不能说是大彻大悟吧,至少也是那种可以长久影响人的顿悟:

    人世间有很多道理,你一直以为他们显而易见,一直以为他们过于简单,但是只有你去做一件事,去投身到一个事业中去,才会知道他们一点都不简单,他们都不只是我们所用的语言中的简单名词,突想起柏拉图的一句话:存在即合理。简单的才最深刻,浅显的往往都是真理,只有由浅入深才是王道,于我现在的状况来说,Java大放异彩的日子,才刚刚开始,Just Go!

    文章评论

    展开全文
  • java图形界面五子棋

    2016-11-01 15:47:31
    java图形界面五子棋,界面比较美观 ;功能也非常强大,里面注释也很多
  • 实现功能与平常五子棋一样! 黑白棋子 五颗连续即赢
  • java图形界面五子棋源代码共享

    千次阅读 2015-02-11 17:31:00
    是人机对战,但是没有AI,所以这个五子棋游戏的玩法就有改变了,最短 时间内让电脑也就是白棋获胜就赢了。(供学习 纪念之用) import javax.swing.*; import javax.imageio.*; import java.awt.event.*; import ...


    有自己的加入也有书本的代码,整合,需要的素材网上找的。

    是人机对战,但是没有AI,所以这个五子棋游戏的玩法就有改变了,最短

    时间内让电脑也就是白棋获胜就赢了。奋斗(供学习 纪念之用)

    import javax.swing.*;
    import javax.imageio.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import java.awt.*;
    import java.io.*;
    import java.util.concurrent.ThreadLocalRandom;


    public class Gobang2 
    {
    //下面三个位图分别代表棋盘,黑棋,白棋
    BufferedImage table;
    BufferedImage black;
    BufferedImage white;
    //当鼠标移动时的选择框
    BufferedImage selected;
    //定义棋盘的大小
    private static int BOARD_SIZE=15;
    //定义棋盘宽,高多少个像素
    private final int TABLE_WIDTH=500;
    private final int TABLE_HEIGHT=501;
    //定义棋盘坐标的像素值和棋盘数组之间的比率
    private final int RATE=TABLE_WIDTH/BOARD_SIZE;
    //定义棋盘坐标的像素值和棋盘数组之间的偏移距离
    private final int X_OFFSET=12;
    private final int Y_OFFSET=9;
    //定义一个二维数组来当棋盘
    private int[][] board=new int[BOARD_SIZE][BOARD_SIZE];
    //五子棋游戏窗口
    JFrame f=new JFrame("星星*五子棋游戏        玩法:在最短时间内让白棋赢");
    //五子棋游戏棋盘对应的Canvas组件
    ChessBoard chessBoard=new ChessBoard();
    //当前选中点的坐标
    private int selectedX=-1;
    private int selectedY=-1;
        private Font fontGameOver = new Font("宋体", Font.BOLD, 50);
    public void init()throws Exception
    {
           ThreadLocalRandom rand= ThreadLocalRandom.current();
           table=ImageIO.read(new File("board.jpg"));
      black=ImageIO.read(new File("black.gif"));
      white=ImageIO.read(new File("white.gif"));
      selected=ImageIO.read(new File("select.gif"));
      //把每个元素赋值为0代表没有棋子
      for(int i=0;i<BOARD_SIZE;i++)
    {
                  for(int j=0;j<BOARD_SIZE;j++)
     {
     board[i][j]=0;
     }
      }
      chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));//设置组件的首选大小
      chessBoard.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
    {
                //将用户鼠标事件的坐标转换成棋子数组的坐标
        int xPos=(int)((e.getX()-X_OFFSET)/RATE);
        int yPos=(int)((e.getY()-Y_OFFSET)/RATE);
    board[xPos][yPos]=1;//黑棋
    judge(1,xPos,yPos);
               int dxpos=rand.nextInt(0,14);
    int dypos=rand.nextInt(0,14);
    if(board[dxpos][dypos]!=1)
    {
                    board[dxpos][dypos]=2;//白棋
    }
    else
    {
                    dxpos=rand.nextInt(0,14);
    dypos=rand.nextInt(0,14);
    board[dxpos][dypos]=2;//白棋
    }
        judge(2,dxpos,dypos);
    chessBoard.repaint();
      }
      //当鼠标退出棋盘区后,复位选中点坐标 
      public void mouseExited(MouseEvent e)
    {
      selectedX=-1;
      selectedY=-1;
      chessBoard.repaint();
      }
      });
      chessBoard.addMouseMotionListener(new MouseMotionAdapter()
    {
      //鼠标移动时,改变选中点的坐标
      public void mouseMoved(MouseEvent e)
    {
                    selectedX=(e.getX()-X_OFFSET)/RATE;
       selectedY=(e.getY()-Y_OFFSET)/RATE;
    chessBoard.repaint();
      }   
      });
           f.setResizable(false);//用户不能调整窗口大小
      f.add(chessBoard);
      f.pack();
      f.setVisible(true);
    }
       


     public void judge(int a1,int x,int y )//判断
      {
            
      Graphics g=chessBoard.getGraphics();
      g.setColor(Color.RED);
     int count1=0,count2=0,count3=0,count4=0; 
     int a=x,b=y;
        
    if(a1==1)
     {
     
     //横向
         while(x<=13&&board[x][y]==board[++x][y])
     {
                  count1++;
     }
      x=a;
      y=b;
     while(x>=1&&board[x][y]==board[--x][y])
     {
     count1++;
     }
     if(count1==4)
     {
                g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------黑棋赢了!!!-----------");
      System.exit(0);
     
     }
     else
     {
                  x=a;
     y=b;
     }
     //纵向
     while(y<=13&&board[x][y]==board[x][++y])
     {
     count2++;
     }
      x=a;
      y=b;
     while(y>=1&&board[x][y]==board[x][--y])
     {
     count2++;
     }
     if(count2==4)
     {
       g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------黑棋赢了!!!-----------");
       System.exit(0);
      
     }
     else
     {
                  x=a;
     y=b;
     }
     //斜上
     while(y>=1&&x<=13&&board[x][y]==board[++x][--y])
     {
     count3++;
     }
      x=a;
      y=b;
     while(y<=13&&x>=1&&board[x][y]==board[--x][++y])
     {
     count3++;
     }
     if(count3==4)
     {
       g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------黑棋赢了!!!-----------");
       System.exit(0);
     
     }
     else
     {
     x=a;
         y=b;
     }
     //斜下
     while(y>=1&&x>=1&&board[x][y]==board[--x][--y])
     {
     count4++;
     }
     x=a;
     y=b;
              while(y<=13&&x<=13&&board[x][y]==board[++x][++y])
     {
     count4++;
     }
     if(count4==4)
     {
       g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------黑棋赢了!!!-----------");
       System.exit(0);
     
     }
     else
     {
                   x=a;
          y=b;
     }
     }
            
    else
     {
            //横向
         while(x<=13&&board[x][y]==board[++x][y])
     {
                  count1++;
     }
      x=a;
      y=b;
     while(x>=1&&board[x][y]==board[--x][y])
     {
     count1++;
     }
     if(count1==4)
     {
       g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------白棋赢了!!!-----------");
        System.exit(0);
     
     }
     else
     {
                  x=a;
     y=b;
     }
     //纵向
     while(y<=13&&board[x][y]==board[x][++y])
     {
     count2++;
     }
      x=a;
      y=b;
     while(y>=1&&board[x][y]==board[x][--y])
     {
     count2++;
     }
     if(count2==4)
     {
        g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------白棋赢了!!!-----------");
       System.exit(0);

     }
     else
     {
                  x=a;
     y=b;
     }
     //斜上
     while(y>=1&&x<=13&&board[x][y]==board[++x][--y])
     {
     count3++;
     }
      x=a;
      y=b;
     while(y<=13&&x>=1&&board[x][y]==board[--x][++y])
     {
     count3++;
     }
     if(count3==4)
     {
       g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------白棋赢了!!!-----------");
       System.exit(0);
     
     }
     else
     {
     x=a;
         y=b;
     }
     //斜下
     while(y>=1&&x>=1&&board[x][y]==board[--x][--y])
     {
     count4++;
     }
     x=a;
     y=b;
              while(y<=13&&x<=13&&board[x][y]==board[++x][++y])
     {
     count4++;
     }
     if(count4==4)
     {
        g.setFont(fontGameOver);
    g.drawString("游戏结束", 120, 180);
     System.out.println("---------白棋赢了!!!-----------");
      System.exit(0);
       
     }
     else
     {
                   x=a;
          y=b;
     }


    }
      }


    public static void main(String[] args)throws Exception
    {
    Gobang2 gb2=new Gobang2();
    gb2.init();
           
    }
    class ChessBoard extends JPanel
    {
    //重写JPanel的paint方法,实现绘画
    public void paint(Graphics g)
    {
    //绘制五子棋棋盘
    g.drawImage(table,0,0,null);
    //绘制选中点的红框
    if(selectedX>=0&&selectedY>=0)
    {
                   g.drawImage(selected,selectedX*RATE+X_OFFSET,
      selectedY*RATE+Y_OFFSET,null);
    }
    //遍历数组,绘制棋子
    for(int i=0;i<BOARD_SIZE;i++)
    {
    for(int j=0;j<BOARD_SIZE;j++)
    {
    //绘制黑棋
    if(board[i][j]==1)
    {
    g.drawImage(black,i*RATE+X_OFFSET,
    j*RATE+Y_OFFSET,null);
    }
    //绘制白棋
    if(board[i][j]==2)
    {
                           g.drawImage(white,i*RATE+X_OFFSET,
    j*RATE+Y_OFFSET,null);
    }
    }


    }
    }
    }

    }


    展开全文
  • java五子棋 这次把图形界面做上了
  • *public class TableFace...import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEve...

    *public class TableFace *

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.Toolkit;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    public class TableFace {
    
    	JFrame frame;
    	static int width;
    	static int height;
    	
    	static {
    //		获得屏幕的尺寸
    		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    		width = d.width;
    		height = d.height;	
    	}
    	
    //	下棋顺序		黑棋先手
    	static boolean hand = true;
    	
    	public static void main(String[] args) {
    
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					TableFace window = new TableFace();
    					window.frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	public TableFace() {
    		initialize();
    	}
    
    	
    //	定义棋盘
    //	private MyJLabel[][] chessMap = {
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null},
    //			{null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null}
    //			};
    	
    	private MyJLabel[][] chessMap = new MyJLabel[25][25];
    
    	private void initialize() {
    		frame = new JFrame();
    		frame.setSize(width, height);
    		frame.getContentPane().setLayout(new GridLayout(25, 25));
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		for(int i = 0;i < 625;i++) {
    			MyJLabel lab = new MyJLabel("+",i);
    			lab.setHorizontalAlignment(JLabel.CENTER);
    			lab.addMouseListener(new MouseAdapter() {
    				@Override
    				public void mouseClicked(MouseEvent e) {
    //					获得待落子的位置信息
    					MyJLabel my = (MyJLabel) e.getSource();
    //					获取位置的数值
    					int pos = my.getCurrentNo();
    //					获取行数
    					int row = pos / 25;
    //					获取列数
    					int col = pos % 25;
    //					得到 chessMap 上的坐标
    					MyJLabel fromMap = chessMap[row][col];
    //					System.out.println(row + "\t" +col);
    //					检测位置上是否存在棋子
    //					1、该位置存在棋子					
    					if(fromMap != null) {
    						return;
    					}
    //					2、该位置不存在棋子
    //					清空  + 
    					my.setText("");
    //					落子无悔
    					if(hand) {
    						Icon img = new ImageIcon(TableFace.class.getResource("/").getFile() + "black.png");
    						my.setIcon(img);
    						my.setType("Black");
    						hand = false;
    					}else {
    						Icon img = new ImageIcon(TableFace.class.getResource("/").getFile() + "white.png");
    						my.setIcon(img);
    						my.setType("White");
    						hand = true;
    					}
    					
    //					记录已落子的位置
    					chessMap[row][col] = my;
    //					记录判断结果
    					boolean back = calChessCount(my,row,col);
    					if(back == true) {
    						JOptionPane.showMessageDialog(null, my.getType() +"\nWIN!");
    						TableFace.this.frame.setVisible(false);
    						new WinInterface().frame.setVisible(true);
    						TableFace.this.frame.dispose();
    					}
    				}
    				
    			});
    			frame.getContentPane().add(lab);
    		}
    
    	}
    
    //	判断棋子个数
    	protected boolean calChessCount(MyJLabel myChess, int row, int col) {
    //		初始化棋子个数
    		int count = 1;
    		
    //		定义X轴方向的临时变量
    		int tempX = 1;
    //		定义Y轴方向的临时变量
    		int tempY = 1;
    		
    //		计算落子的上方棋子个数
    		while(row > 0){
    			int y = row - tempY;
    			MyJLabel chess = chessMap[y][col];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    			
    		}
    		
    //		重置Y轴方向的临时变量
    		tempY = 1;
    //		计算落子的下方棋子个数
    		while(row < 25){
    			int y = row + tempY;
    			MyJLabel chess = chessMap[y][col];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    		
    		
    //		重置Y轴方向的临时变量
    		tempY = 1;
    //		计算落子的右上方棋子个数
    		while(row > 0 && col < 25){
    			int y = row - tempY;
    			int x = col + tempX;
    			MyJLabel chess = chessMap[y][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    		
    		
    //		重置Y轴方向的临时变量
    		tempY = 1;
    //		重置X轴方向的临时变量
    		tempX = 1;
    //		计算落子的左下方棋子个数
    		while(row < 25 && col > 0){
    			int y = row + tempY;
    			int x = col - tempX;
    			MyJLabel chess = chessMap[y][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    		
    		
    //		重置X轴方向的临时变量
    		tempX = 1;
    //		计算落子的右方棋子个数
    		while(col < 0){
    			int x = col + tempX;
    			MyJLabel chess = chessMap[row][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    			
    		}
    		
    //		重置X轴方向的临时变量
    		tempX = 1;
    //		计算落子的左方棋子个数
    		while(col > 0){
    			int x = col - tempX;
    			MyJLabel chess = chessMap[row][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    		
    //		重置Y轴方向的临时变量
    		tempY = 1;
    //		重置X轴方向的临时变量
    		tempX = 1;
    //		计算落子的右下方棋子个数
    		while(col > 0 && row < 25){
    			int y = row + tempY;
    			int x = col + tempX;
    			MyJLabel chess = chessMap[y][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    		
    		
    //		重置Y轴方向的临时变量
    		tempY = 1;
    //		重置X轴方向的临时变量
    		tempX = 1;
    //		计算落子的左上方棋子个数
    		while(col < 25 && row > 0){
    			int y = row - tempY;
    			int x = col - tempX;
    			MyJLabel chess = chessMap[y][x];
    //			上方为null	上方棋子  type 不同
    			if(chess == null || chess.getType().equals(myChess.getType()) == false) {
    				break;
    			}
    //			记录个数
    			count++;
    //			继续向上查找
    			tempY++;
    			tempX++;
    //			判断结果
    			if(count == 5) {
    				return true;
    			}
    		}
    	
    		System.out.println(myChess.getType()+"\t"+count);
    		
    		return false;
    	}
    
    }
    
    

    TIP:tempX和tempY可以用同一个变量表示

    *public class MyJLabel *

    package com.nsg.action;
    
    import javax.swing.JLabel;
    
    public class MyJLabel extends JLabel{
    	
    	private static final long serialVersionUID = 1L;
    	
    	private int currentNo;
    	private Object content;
    	private String type;
    	
    	
    	public MyJLabel(String title, int currentNo) {
    		super(title);
    		this.currentNo = currentNo;
    	}
    	public int getCurrentNo() {
    		return currentNo;
    	}
    	public void setCurrentNo(int currentNo) {
    		this.currentNo = currentNo;
    	}
    	public Object getContent() {
    		return content;
    	}
    	public void setContent(Object content) {
    		this.content = content;
    	}
    	public String getType() {
    		return type;
    	}
    	public void setType(String type) {
    		this.type = type;
    	}
    		
    }
    

    *public class WinInterface *

    package com.nsg.action;
    
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class WinInterface {
    
    	JFrame frame;
    
    	public WinInterface() {
    		initialize();
    	}
    
    	private void initialize() {
    		frame = new JFrame();
    		frame.setBounds(100, 100, 450, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().setLayout(null);
    		
    		JButton button = new JButton("\u7EE7\u7EED\u6E38\u620F");
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    //				继续游戏
    				new TableFace().frame.setVisible(true);
    				WinInterface.this.frame.dispose();
    			}
    		});
    		button.setBounds(147, 72, 129, 42);
    		frame.getContentPane().add(button);
    		
    		JButton button_1 = new JButton("\u9000\u51FA\u6E38\u620F");
    		button_1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    //				结束程序
    				System.exit(0);
    			}
    		});
    		button_1.setBounds(147, 138, 129, 42);
    		frame.getContentPane().add(button_1);
    		
    	}
    }
    
    
    展开全文
  • 群里还含有:Java80g学习视频+Java学习书籍+Java项目实战源码+安装软件等】 各类资源都有哦~ 按钮什么的还未完成,只是能实现正常的下棋了。 加微信可领资料 alpha_beta 剪枝搜索 未了解过此...

    前言:

    源码放在群862461829里,可自取(群主要是方便大家学习交流)

    同时也提供了一些学习资源

    群里还含有:Java80g学习视频+Java学习书籍+Java项目实战源码+安装软件等】

    各类资源都有哦~

    按钮什么的还未完成,只是能实现正常的下棋了。

     

    加微信可领资料

     

     

    alpha_beta

    剪枝搜索

    未了解过此算法的可先去看
    最大最小搜索
    Alpha-Beta剪枝
    上面两文解释的很清楚了,在此就不再赘述。

    估值函数

    判断是否能成5, 如果是机器方的话给予100000分,如果是人方的话给予-100000 分;
    判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予10000分,如果是人方的话给予-10000分;
    判断是否已成双活3,如果是机器方的话给予5000分,如果是人方的话给予-5000 分;
    判断是否成死3活3,如果是机器方的话给予1000分,如果是人方的话给予-1000 分;
    判断是否能成死4,如果是机器方的话给予500分,如果是人方的话给予-500分;
    判断是否能成单活3,如果是机器方的话给予200分,如果是人方的话给予-200分;
    判断是否已成双活2,如果是机器方的话给予100分,如果是人方的话给予-100分;
    判断是否能成死3,如果是机器方的话给予50分,如果是人方的话给予-50分;
    判断是否能成双活2,如果是机器方的话给予10分,如果是人方的话给予-10分;
    判断是否能成活2,如果是机器方的话给予5分,如果是人方的话给予-5分;
    判断是否能成死2,如果是机器方的话给予3分,如果是人方的话给予-3分。
     

    存在的问题以及未完成的地方 

    最主要的问题就是偶尔会走臭棋。反复调试找原因,甚至把搜索方法又重新写了一遍,还是无果。觉得问题出现在估值函数上,但又想不出如何解决。
    未完成的地方当然是提高搜索的效率了,每次估值都是要全盘进行估值,这样造成的时间影响是很大的,还可以用位棋盘来保存局面的情况,每走一步进行更新,每次回溯时再恢复,这样估值时之用考虑最近的一步,而不是全局了。这个等日后有时间再好好改进一下吧。
    对于输赢的判断已经有了,但是还少了UI部分的显示,只是仅仅输出提示在命令行上。
     

    代码

    AI走法搜索部分 --

    import java.util.Random;
    
    /**
     * Created by shiyi on 16/3/14.
     */
    public class Robot {
    
        private static ChessBoard chess = ChessBoard.getInstance();
        private Robot() {}
        private static int depth = 1;
        private static int robotColor = chess.BLACK;
        private static Robot robot = new Robot();
    
        public static Robot getRobot() {
            return robot;
        }
    
        /* alpha_beta剪枝搜索 */
        public int alpha_betaFind(int depth, int alpha, int beta, int color, int prex, int prey) {
    
            if(depth >= Robot.depth || 0 != chess.isEnd(prex, prey, color%2+1)) {
    
                int ans = chess.reckon(robotColor) - chess.reckon(robotColor%2 + 1);
    
                if(depth % 2 == 0)
                    ans = -ans;
    
                return ans;
            }
    
            for(int x=1; x<=chess.N; x++) {
                for(int y=1; y<=chess.N; y++) {
    
                    if(!chess.isEmpty(x, y))
                        continue;
    
                    chess.makeMove(x, y, color);
                    int val = -alpha_betaFind(depth+1, -beta, -alpha, color%2+1, x, y);
    
                    chess.unMove(x, y);
    
                    if(val >= beta)
                        return beta;
    
                    if(val > alpha)
                        alpha = val;
                }
            }
            return alpha;
        }
    
        /* 返回AI走法 */
        public int[] getNext(int color) {
            int rel[] = new int[2];
            int ans = -100000000;
    
            Random random = new Random();
    
            for(int x=1; x<=chess.N; x++) {
                for(int y=1; y<=chess.N; y++) {
    
                    if(!chess.isEmpty(x, y))
                        continue;
    
                    chess.makeMove(x, y, color);
    
                    int val = -alpha_betaFind(0, -100000000, 100000000, color%2 + 1, x, y);
    
                    int ra = random.nextInt(100);
                    if(val > ans || val == ans && ra >= 50) {
                        ans = val;
                        rel[0] = x;
                        rel[1] = y;
                    }
                    chess.unMove(x, y);
                }
            }
            return rel;
        }
    }

    落子撤子以及估值 --ChessBoard 

     

    /**
     * Created by shiyi on 16/3/14.
     */
    public class ChessBoard {
        public final int N = 15;
        public final int EMPTY = 0;
        public final int BLACK = 1;
        public final int WHITE = 2;
    
        public int[][] board = new int[N+1][N+1];
    
        private ChessBoard() {}
        private static final ChessBoard chess = new ChessBoard();
    
        /* 返回类单例 */
        public static ChessBoard getInstance() {
            return chess;
        }
    
        /*  判断该位置是否无子 */
        public boolean isEmpty(int x, int y) {
            return board[x][y] == EMPTY;
        }
    
        /* 落子 */
        public void makeMove(int x, int y, int color) {
            board[x][y] = color;
        }
    
        /* 撤子 */
        public void unMove(int x, int y) {
            board[x][y] = EMPTY;
        }
    
        public int reckon(int color) {
    
            int dx[] = {1, 0, 1, 1};
            int dy[] = {0, 1, 1, -1};
            int ans = 0;
    
            for(int x=1; x<=N; x++) {
                for (int y = 1; y <= N; y++) {
                    if (board[x][y] != color)
                        continue;
    
                    int num[][] = new int[2][100];
    
                    for (int i = 0; i < 4; i++) {
                        int sum = 1;
                        int flag1 = 0, flag2 = 0;
    
                        int tx = x + dx[i];
                        int ty = y + dy[i];
                        while (tx > 0 && tx <= N
                                && ty > 0 && ty <= N
                                && board[tx][ty] == color) {
                            tx += dx[i];
                            ty += dy[i];
                            ++sum;
                        }
    
                        if(tx > 0 && tx <= N
                                && ty > 0 && ty <= N
                                && board[tx][ty] == EMPTY)
                            flag1 = 1;
    
                        tx = x - dx[i];
                        ty = y - dy[i];
                        while (tx > 0 && tx <= N
                                && ty > 0 && ty <= N
                                && board[tx][ty] == color) {
                            tx -= dx[i];
                            ty -= dy[i];
                            ++sum;
                        }
    
                        if(tx > 0 && tx <= N
                                && ty > 0 && ty <= N
                                && board[tx][ty] == EMPTY)
                            flag2 = 1;
    
                        if(flag1 + flag2 > 0)
                            ++num[flag1 + flag2 - 1][sum];
                    }
    
                    //成5
                    if(num[0][5] + num[1][5] > 0)
                        ans = Math.max(ans, 100000);
                        //活4 | 双死四 | 死4活3
                    else if(num[1][4] > 0
                            || num[0][4] > 1
                            || (num[0][4] > 0 && num[1][3] > 0))
                        ans = Math.max(ans, 10000);
                        //双活3
                    else if(num[1][3] > 1)
                        ans = Math.max(ans, 5000);
                        //死3活3
                    else if(num[1][3] > 0 && num[0][3] > 0)
                        ans = Math.max(ans, 1000);
                        //死4
                    else if(num[0][4] > 0)
                        ans = Math.max(ans, 500);
                        //单活3
                    else if(num[1][3] > 0)
                        ans = Math.max(ans, 200);
                        //双活2
                    else if(num[1][2] > 1)
                        ans = Math.max(ans, 100);
                        //死3
                    else if(num[0][3] > 0)
                        ans = Math.max(ans, 50);
                        //双活2
                    else if(num[1][2] > 1)
                        ans = Math.max(ans, 10);
                        //单活2
                    else if(num[1][2] > 0)
                        ans = Math.max(ans, 5);
                        //死2
                    else if(num[0][2] > 0)
                        ans = Math.max(ans, 1);
    
                }
            }
    
            return ans;
        }
    
        /* 判断局面是否结束 0未结束 1WHITE赢 2BLACK赢 */
        public int isEnd(int x, int y, int color) {
            int dx[] = {1, 0, 1, 1};
            int dy[] = {0, 1, 1, -1};
    
            for (int i = 0; i < 4; i++) {
                int sum = 1;
    
                int tx = x + dx[i];
                int ty = y + dy[i];
                while (tx > 0 && tx <= N
                        && ty > 0 && ty <= N
                        && board[tx][ty] == color) {
                    tx += dx[i];
                    ty += dy[i];
                    ++sum;
                }
    
                tx = x - dx[i];
                ty = y - dy[i];
                while (tx > 0 && tx <= N
                        && ty > 0 && ty <= N
                        && board[tx][ty] == color) {
    
                    tx -= dx[i];
                    ty -= dy[i];
                    ++sum;
                }
    
    
                if(sum >= 5)
                    return color;
            }
            return 0;
        }
    }
    

    UI部分 

     

    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.Random;
    
    /**
     * Created by shiyi on 16/3/15.
     */
    public class UI {
        private ChessBoard chess = ChessBoard.getInstance();
        private int userColor = chess.WHITE;
        private int robotColor = chess.BLACK;
        private Frame frame = new Frame("绘制棋盘");
        private MyChess drawArea = new MyChess();
        private Robot robot = Robot.getRobot();
    
        public void init(){
    
            Panel p = new Panel();
            //机器执先
            chess.makeMove(chess.N/2+1, chess.N/2+1, chess.BLACK);
    
            drawArea.setPreferredSize(new Dimension(720, 720));
    
            drawArea.addMouseListener(new MouseListener() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int x = e.getX();
                    int y = e.getY();
                    int i = (x-60)/40+1;
                    int j = (y-60)/40+1;
                    System.out.println(i+"---"+j);
                    if(chess.isEmpty(i, j)) {
    
                        chess.makeMove(i, j, userColor);
                        int rel = chess.isEnd(i, j, userColor);
                        if(rel != 0) {
                            System.out.println("玩家胜利");
                            return;
                        }
                        drawArea.repaint();
                        int rob[] = robot.getNext(robotColor);
                        chess.makeMove(rob[0], rob[1], robotColor);
                        rel = chess.isEnd(rob[0], rob[1], robotColor);
                        if(rel != 0) {
                            System.out.println("机器胜利");
                            return;
                        }
                        drawArea.repaint();
                    }
    
                }
    
                @Override
                public void mousePressed(MouseEvent e) {
    
                }
    
                @Override
                public void mouseReleased(MouseEvent e) {
    
                }
    
                @Override
                public void mouseEntered(MouseEvent e) {
    
                }
    
                @Override
                public void mouseExited(MouseEvent e) {
    
                }
            });
    
            frame.add(drawArea);
            frame.setSize(900, 720);
            frame.setVisible(true);
        }
    }
    
    
    class MyChess extends Canvas {
    
        private ChessBoard chess = ChessBoard.getInstance();
        private final int N = chess.N + 2;
        private final int square = 40;
        private final int stx = square;
        private final int sty = square;
        private final int length = (N-1)*square;
    
        public void drawPiece(int color, int x, int y, Graphics g) {
            if (color == chess.BLACK) {
                g.setColor(new Color(0, 0, 0));
                g.fillArc(stx + x * square - 19, sty + y * square - 19, 38, 38, 0, 360);
            } else if (color == chess.WHITE) {
                g.setColor(new Color(255, 255, 255));
                g.fillArc(stx + x * square - 19, sty + y * square - 19, 38, 38, 0, 360);
            }
        }
    
        public void paint(Graphics g) {
    
            g.setColor(new Color(0, 0, 0));
            g.fillRect(stx-8, sty-8, stx+(N-2)*square+15, sty+(N-2)*square+15);
            g.setColor(new Color(139, 255, 71));
            g.fillRect(stx-4, sty-4, stx+(N-2)*square+7, sty+(N-2)*square+7);
    
            g.setColor(new Color(0, 0, 0));
    
            g.fillArc(stx+8*square-6, sty+8*square-6, 12, 12, 0, 360);
            g.fillArc(stx+4*square-6, sty+4*square-6, 12, 12, 0, 360);
            g.fillArc(stx+4*square-6, sty+12*square-6, 12, 12, 0, 360);
            g.fillArc(stx+12*square-6, sty+4*square-6, 12, 12, 0, 360);
            g.fillArc(stx+12*square-6, sty+12*square-6, 12, 12, 0, 360);
    
            for(int i = 0; i < N; i++) {
    
                g.drawLine(stx+i*square, sty, stx+i*square, sty+length);
                g.drawLine(stx, sty+i*square, stx+length, sty+i*square);
            }
    
            for(int i=1; i<=chess.N; i++) {
                for(int j=1; j<=chess.N; j++) {
                    drawPiece(chess.board[i][j], i, j, g);
                }
            }
        }
    }

    Main 

    /**
     * Created by shiyi on 16/3/14.
     */
    public class Main {
        public static void main(String[] args) {
            System.out.println("游戏开始");
    
            UI ui = new UI();
            ui.init();
        }
    }

    展开全文
  • 基于java实现的局域网五子棋堆栈,可创建房间,加入房间。 主要学习java的多线程、图形化开发、网络通信开发。提供完整源码。包括服务端与客户端两部分。 优先启动服务端。
  • java实现的五子棋代码

    2017-12-02 16:11:32
    这是我用java语言写的五子棋游戏,作为期末作业。适用于初学者。
  • 4、定义五子棋游戏棋盘对应的Canvas组件 private class ChessBoard extends JPanel{ //重写paint方法,实现绘画 @Override public void paint(Graphics g) { //绘制五子棋棋盘 g.drawImage(table,0,0,null);...
  • Java开发的五子棋

    2012-04-26 13:08:51
    java swing编程做得五子棋图形界面程序
  • java 五子棋

    2014-04-18 01:34:02
    非常简单的java 五子棋 没有图形界面的
  • Java五子棋

    2012-01-29 01:54:30
    Java版本的五子棋,有漂亮的图形界面,可以实现网络对战和网络聊天功能。
  • JAVA课设(五子棋

    2021-01-27 15:30:23
    采用图形用户界面(GUI),较为完善的五子棋游戏。代码方面都是常规操作,没有花里胡哨,易懂。
  • java小游戏,Joption 编程。大一暑期小作业
  • 本人是学生,闲暇之余写的五子棋小程序(个人感觉不错),通俗易懂适合刚刚入门的同学学习。喜欢的可以下载一下,谢谢各位客官老爷。
  • #开始最近在忙着做一个基于酷Q的QQ机器人,想到了做游戏,第一个想到的霸气点的游戏就是五子棋啊 ` _>`因为没有图形界面的原因 所有核心就是判断是否在棋盘上出现了五个棋子连在一起的情况 然后我想到了三种搜索...
  • Java设计的五子棋游戏

    2020-06-20 15:04:28
    1.用java编写五子棋的游戏 2.该程序拥有简洁美观的图形化界面,且界面主要由棋盘、标题和游戏操作的按钮三部分组成。另外,该游戏界面的大小是不可变的,程序会自动获取电脑屏幕的大小信息,并且计算出合适的位置...
  • java单机版五子棋

    2009-12-02 15:04:01
    一个用java 做的单机版小游戏 用swing做的图形界面
  • java入门-五子棋游戏的制作 想要 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 ...
  • 里面包含客户端和服务器代码,自己测试的改下连接的IP地址
  • 主要为大家详细介绍了Java swing五子棋的实现方法,Java开发图形界面程序五子棋的实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java开发的Socket五子棋

    2018-12-11 10:30:50
    利用JAVA开发的socket五子棋编程,实现网络版对战的五子棋,可聊天,可认输,最新下的棋子有红点标记,可人机对战,有图形化界面,有背景图片。
  • java课程设计-五子棋

    2012-01-03 14:16:04
    java语言的五子棋设计,实现图形用户界面的五子棋双人对战。
  • java 五子棋游戏

    2009-08-20 14:08:50
    一个用java 编的五子棋游戏,主要用到了图形绘制,swing,二维数组等方面的知识
  • JavaFx/Java 大作业 五子棋 实验报告

    千次阅读 2020-07-01 17:50:36
    Java大作业五子棋实验报告 实验目的 通过此次实验,对这一学期学习的内容尤其是界面开发部分做了一个很好的回顾,看似简单的五子棋程序,设计好也确实费了我一点功夫 功能模块简介和系统结构图 ChessGame类 作为布局...
  • 这个程序,没有设计AI,只是为玩家提供一个下棋的平台,有图形界面。
  • java五子棋游戏

    2012-02-07 18:23:43
    本程序是运用java基础只是所编写的五子棋游戏,大体框架都已写好,有兴趣的话可以加入图形界面,完成一个完整的五子棋游戏。
  • JAVA五子棋游戏

    2017-06-21 15:52:53
    1.五子棋游戏功能实现,黑先、白后,从天元开始相互顺序落子。最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜; 2.新游戏:初始相关变量,清空棋盘; 3.步数计算:计算当前是第几步; 4.棋子坐标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 828
精华内容 331
关键字:

java图形化五子棋

java 订阅