五子棋人机对战(Java项目)

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值