1.效果展示
亲测,我这里用的AI算法还是蛮强的
2.UI界面的绘制
其中,类是继承JPanel的
public void Showui(){ JFrame jf = new JFrame(); //初始化 jf.setSize(1300,1045); jf.setTitle("五子棋"); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //布局管理器 BorderLayout br = new BorderLayout(); jf.setLayout(br); //面板 jf.add(this,br.CENTER); JPanel eastJpanel = new JPanel(); eastJpanel.setPreferredSize(new Dimension(250,0)); jf.add(eastJpanel,br.EAST); //添加鼠标监听器 mouseListener mouseListener = new mouseListener(); this.addMouseListener(mouseListener); //添加右侧按钮和按钮监听器 ArrayList<String> functionlist = new ArrayList(); functionlist.add("开始"); functionlist.add("悔棋(一步)"); functionlist.add("悔棋(多步)"); functionlist.add("重新开始"); functionlist.add("和棋"); functionlist.add("人机执黑"); functionlist.add("人机执白"); functionlist.add("提示"); for(String f:functionlist){ JButton a = new JButton(f); a.setPreferredSize(new Dimension(200,50)); eastJpanel.add(a); a.addActionListener(mouseListener); } //可见 jf.setVisible(true); //从窗口获取画板并传递给鼠标监听器 Graphics g = this.getGraphics(); mouseListener.setG(g); mouseListener.setUi(this); }
这些没有什么好说的,在之前我写的创意画板中都有具体解释
3.重写paint()方法,绘制棋盘
由于要绘制棋盘,而且棋盘每次绘制都要加载,所以将棋盘的绘制方法写在paint()中
public void paint(Graphics g){ Graphics2D d2 = (Graphics2D)g; g = d2; d2.setStroke(new BasicStroke(2));//设置线段的粗细 super.paint(g);//注意,必不可少 for (int i = 0; i < 15; i++) { g.drawLine(45+65*i,45,45+65*i,955); } for (int i = 0; i < 15; i++) { g.drawLine(45,45+65*i,955,45+65*i); } g.fillOval(235,235,10,10); g.fillOval(235,755,10,10); g.fillOval(755,235,10,10); g.fillOval(755,755,10,10); g.fillOval(495,495,10,10); g.drawLine(25,25,975,25); g.drawLine(25,25,25,975); g.drawLine(975,975,25,975); g.drawLine(975,975,975,25);//绘制棋盘,根据你之前绘制的窗口大小进行划分,绘制 }
4.绘制棋子
在棋盘绘制好了之后,我们要在上面下棋就要绘制棋子,所以这里我们新建chess类
public class chess { private int x,y;//棋子在棋盘上的坐标值 private int flag;//棋子的三种状态flag=0:没有落子,flag=1:落白字,flag=2,:落黑子 private int value;//棋子的权值 //对应get,set方法 public int getValue() { return value; } public void setValue(int value) { this.value = value; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } //构造器 public chess(){ x = 0; y = 0; flag = 0; value = 0; } public chess(int x, int y) { this.x = x; this.y = y; } public chess(int x, int y, int flag) { this.x = x; this.y = y; this.flag = flag; } }
这里我提供了三种构造器,也不是一开始就全写出来的,是在写后续程序的时候根据需要后添加的。
新建mouselistener类实现MouseListener,ActionListener接口。
在释放方法中获取释放时鼠标在组件中的坐标,代入并调用playchess()方法
这里我用了flag旗帜来达到黑白交替进行下棋的功能
public void playChees(int x, int y