Java五子棋的实现(附源码)

2023-11-11

学习目的:熟悉java中swing类与java基础知识的巩固.(文末有源代码文件和打包的jar文件)
效果图:这里写图片描述
思路:**1.首先构建一个Frame框架,来设置菜单选项与按钮点击事件。
MyFrame.java文件代码如下

package StartGame;

import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

//窗体框架类
public class MyFrame extends JFrame {
    // static boolean canPlay1 = false;判断是否可以开始游戏
    final MyPanel panel = new MyPanel();

    public MyFrame() {

        // 设置窗体的大小并居中
        this.setSize(500, 600); // 设置窗体大小
        this.setTitle("五子棋游戏"); // 设置窗体标题

        int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 获取屏幕的宽度
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 获取屏幕的高度
        this.setLocation((width - 500) / 2, (height - 500) / 2); // 设置窗体的位置(居中)
        this.setResizable(false); // 设置窗体不可以放大
        // this.setLocationRelativeTo(null);//这句话也可以设置窗体居中
        /*
         * 菜单栏的目录设置
         */
        // 设置菜单栏
        JMenuBar bar = new JMenuBar();
        this.setJMenuBar(bar);
        // 添加菜单栏目录
        JMenu menu1 = new JMenu("游戏菜单"); // 实例化菜单栏目录
        JMenu menu2 = new JMenu("设置");
        JMenu menu3 = new JMenu("帮助");
        bar.add(menu1); // 将目录添加到菜单栏
        bar.add(menu2);
        bar.add(menu3);

        JMenu menu4 = new JMenu("博弈模式"); // 将“模式”菜单添加到“设置”里面
        menu2.add(menu4);

        // JMenuItem item1=new JMenuItem("人人博弈");
        // JMenuItem item2=new JMenuItem("人机博弈");
        // 设置“”目录下面的子目录
        JRadioButtonMenuItem item1 = new JRadioButtonMenuItem("人人博弈");
        JRadioButtonMenuItem item2 = new JRadioButtonMenuItem("人机博弈");
        // item1按钮添加时间并且为匿名类
        item1.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setIsManAgainst(true);
                    panel.Start();
                    item1.setSelected(true);
                }

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 设置item2按钮的事件监听事件,也就是设置人机博弈
        item2.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setIsManAgainst(false);
                    panel.Start();
                    item2.setSelected(true);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 设置按钮组并把人机博弈与人人博弈添加到一个按钮组里面
        ButtonGroup bg = new ButtonGroup();
        bg.add(item1);
        bg.add(item2);
        // 将按钮组添加到菜单里面
        menu4.add(item1);
        menu4.add(item2);
        item2.setSelected(true);

        // 先行设置
        JMenu menu5 = new JMenu("先行设置"); // 将“先行设置”菜单添加到“设置”里面
        menu2.add(menu5);
        // 设置黑子先行还是白字先行的按钮
        JRadioButtonMenuItem item3 = new JRadioButtonMenuItem("黑方先行");
        JRadioButtonMenuItem item4 = new JRadioButtonMenuItem("白字先行");
        // 设置item3的鼠标点击事件,设置黑方先行
        item3.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setIsBlack(true);
                    panel.Start();
                    item3.setSelected(true);
                }

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 设置item4的鼠标点击事件
        item4.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setIsBlack(false);
                    panel.Start();
                    item4.setSelected(true);
                }

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 设置按钮组并把人机博弈与人人博弈添加到一个按钮组里面
        ButtonGroup bg1 = new ButtonGroup();
        bg1.add(item3);
        bg1.add(item4);
        // 将按钮组添加到菜单里面
        menu5.add(item3);
        menu5.add(item4);
        item3.setSelected(true);
        // 设置“帮助”下面的子目录
        JMenuItem menu6 = new JMenuItem("帮助");
        menu3.add(menu6);
        /*
         * 菜单栏的目录设置完毕
         */
        // 开始游戏菜单设置
        JMenuItem menu7 = new JMenuItem("开始游戏");
        menu1.add(menu7);
        JMenuItem menu8 = new JMenuItem("重新开始");
        menu1.add(menu8);
        menu7.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

                panel.Start();
                // panel.repaint();

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        menu8.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否重新开始", "消息", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.Start();
                }

                // panel.repaint();

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 退出游戏选项设置
        JMenuItem menu9 = new JMenuItem("退出游戏");
        menu1.add(menu9);
        menu9.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "退出游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否退出游戏", "消息", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    System.exit(0);// 退出程序
                }

                // panel.repaint();

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 游戏难度设置
        JRadioButtonMenuItem item5 = new JRadioButtonMenuItem("傻瓜");// 添加按钮
        JRadioButtonMenuItem item6 = new JRadioButtonMenuItem("简单");
        JRadioButtonMenuItem item7 = new JRadioButtonMenuItem("普通");
        // JRadioButtonMenuItem item8= new JRadioButtonMenuItem("困难");
        ButtonGroup bg3 = new ButtonGroup();// 设置按钮组
        bg3.add(item5);
        bg3.add(item6);
        bg3.add(item7);
        // bg3.add(item8);
        JMenu menu10 = new JMenu("游戏难度设置");// 添加菜单到主菜单
        menu2.add(menu10);
        menu10.add(item5);// 添加选项到难度设置菜单
        menu10.add(item6);
        menu10.add(item7);
        // menu2.add(item8);
        item5.setSelected(true);// 默认选项按钮
        // 傻瓜难度设置的鼠标点击事件
        item5.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setGameDifficulty(0);
                    panel.Start();
                    item5.setSelected(true);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 简单难度设置模式
        item6.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "难度设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setGameDifficulty(1);
                    panel.Start();
                    item6.setSelected(true);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        // 普通难度设置
        item7.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                Object[] options = { "保存并重新开始游戏", "不,谢谢" };
                int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");
                if (n == 0) {
                    panel.setGameDifficulty(2);
                    panel.Start();
                    item7.setSelected(true);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        //游戏帮助提示信息
        menu6.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub
                Icon icon = new Icon() {

                    @Override
                    public void paintIcon(Component c, Graphics g, int x, int y) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public int getIconWidth() {
                        // TODO Auto-generated method stub
                        return 0;
                    }

                    @Override
                    public int getIconHeight() {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                };
                JOptionPane.showMessageDialog(null, "制作人员:韩红剑");

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });
        /*
         * 窗口里面的容器设置
         */
        Container con = this.getContentPane(); // 实例化一个容器父类
        con.add(panel); // 将容器添加到父类
        /*
         * 窗口里面的容器设置完毕
         */

    }

}

2.第二步,设置显示棋盘的容器,文件源代码为MyPanel.java

package StartGame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.*;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

//设置窗体里面的容器操作
public class MyPanel extends JPanel implements MouseListener, Runnable {
    private static final Toolkit ResourceUtil = null;
    public Image boardImg; // 定义背景图片
    static int[][] allChess = new int[15][15]; // 棋盘数组
    static int[][] temporaryChess = new int[15][15];
    int x;// 保存棋子的横坐标
    int y;// 保存棋子的纵坐标
    Boolean canPlay = false; // 游戏是否继续,默认为继续
    Boolean isBlack = true;// 是否是黑子,默认为黑子
    Boolean isManAgainst = false; // 判断是否是人人对战
    String message = "用户下棋";
    Thread t = new Thread(this);
    int maxTime = 120;
    int blackTime = 120;
    int whiteTime = 120;
    String blackMessage = "无限制";
    String whiteMessage = "无限制";
    static int gameDifficulty = 0;// 设置游戏难度,0为傻瓜模式,1为简单,2为普通,3为困难
    // 获取isBlack的值
public boolean getIsBlack() {
        return this.isBlack;
    }

    // 设置isBlack的值
    public void setIsBlack(boolean isBlack) {
        this.isBlack = isBlack;
    }

    // 获取isManAgainst的值
    public boolean getIsManAgainst() {
        return this.isManAgainst;
    }

    // 获取isManAgainst的值
    public void setIsManAgainst(boolean isManAgainst) {
        this.isManAgainst = isManAgainst;
    }

    // 获取isManAgainst的值
    public int getGameDifficulty() {
        return this.gameDifficulty;
    }

    // 设置setGameDifficulty的值
    public void setGameDifficulty(int gameDifficulty) {
        this.gameDifficulty = gameDifficulty;
    }

    // 构造函数
    public MyPanel() {

        boardImg = Toolkit.getDefaultToolkit().getImage("./src/StartGame/fiveCHessBourd.jpg");
        this.repaint();
        // 添加鼠标监视器
        addMouseListener((MouseListener) this);
        // addMouseMotionListener((MouseMotionListener) this);
        // this.requestFocus();
        t.start();
        t.suspend();// 线程挂起

        // t.resume();

    }

    // 数据初始化

    @Override
    public void paint(Graphics g) {

        super.paint(g);
        int imgWidth = boardImg.getWidth(this); // 获取图片的宽度
        int imgHeight = boardImg.getHeight(this); // 获取图片的高度
        int FWidth = getWidth();
        int FHeight = getHeight();
        String message; // 标记谁下棋
        int x = (FWidth - imgWidth) / 2;
        int y = (FHeight - imgHeight) / 2;
        g.drawImage(boardImg, x, y, null); // 添加背景图片到容器里面
        g.setFont(new Font("宋体", 0, 14));
        g.drawString("黑方时间:" + blackTime, 30, 470);
        g.drawString("白方时间:" + whiteTime, 260, 470);
        // 绘制棋盘
        for (int i = 0; i < 15; i++) {
            g.drawLine(30, 30 + 30 * i, 450, 30 + 30 * i);
            g.drawLine(30 + 30 * i, 30, 30 + 30 * i, 450);
        }

        // 绘制五个中心点
        g.fillRect(240 - 5, 240 - 5, 10, 10); // 绘制最中心的正方形
        g.fillRect(360 - 5, 360 - 5, 10, 10); // 绘制右下的正方形
        g.fillRect(360 - 5, 120 - 5, 10, 10); // 绘制右上的正方形
        g.fillRect(120 - 5, 360 - 5, 10, 10);// 绘制左下的正方形
        g.fillRect(120 - 5, 120 - 5, 10, 10);// 绘制左上的正方形

        // 定义棋盘数组

        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                // if (allChess[i][j] == 1) {
                // // 黑子
                // int tempX = i * 30 + 30;
                // int tempY = j * 30 + 30;
                // g.fillOval(tempX - 7, tempY - 7, 14, 14);
                // }
                // if (allChess[i][j] == 2) {
                // // 白子
                // int tempX = i * 30 + 30;
                // int tempY = j * 30 + 30;
                // g.setColor(Color.WHITE);
                // g.fillOval(tempX - 7, tempY - 7, 14, 14);
                // g.setColor(Color.BLACK);
                // g.drawOval(tempX - 7, tempY - 7, 14, 14);
                // }
                draw(g, i, j); // 调用下棋子函数
            }

        }
    }

    // 鼠标点击时发生的函数
    @Override
    public void mousePressed(MouseEvent e) {
        // x = e.getX();// 获取鼠标点击坐标的横坐标
        // y = e.getY();// 获取鼠标点击坐标的纵坐标
        // if (x >= 29 && x <= 451 && y >= 29 && y <= 451) { // 鼠标点击在棋子框里面才有效
        //
        // }

        if (canPlay == true) {// 判断是否可以开始游戏
            x = e.getX(); // 获取鼠标的焦点
            y = e.getY();
            if (isManAgainst == true) {// 判断是否是人人对战
                manToManChess();
            } else { // 否则是人机对战,人机下棋
                manToMachine();
            }
        }
    }

    // 判断是否输赢的函数
    private boolean checkWin(int x, int y) {
        // TODO Auto-generated method stub

        boolean flag = false;
        // 保存共有多少相同颜色棋子相连
        int count = 1;
        // 判断横向 特点:allChess[x][y]中y值相同
        int color = allChess[x][y];
        // 判断横向
        count = this.checkCount(x, y, 1, 0, color);
        if (count >= 5) {
            flag = true;
        } else {
            // 判断纵向
            count = this.checkCount(x, y, 0, 1, color);
            if (count >= 5) {
                flag = true;
            } else {
                // 判断右上左下
                count = this.checkCount(x, y, 1, -1, color);
                if (count >= 5) {
                    flag = true;
                } else {
                    // 判断左下右上
                    count = this.checkCount(x, y, 1, 1, color);
                    if (count >= 5) {
                        flag = true;
                    }
                }
            }
        }
        return flag;
    }

    // 判断相同棋子连接的个数
    private int checkCount(int x, int y, int xChange, int yChange, int color) {
        // TODO Auto-generated method stub
        int count = 1;
        int tempX = xChange;
        int tempY = yChange;
        while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14
                && color == allChess[x + xChange][y + yChange]) {
            count++;
            if (xChange != 0) {
                xChange++;
            }
            if (yChange != 0) {
                if (yChange > 0) {
                    yChange++;
                } else {
                    yChange--;
                }
            }
        }
        xChange = tempX;
        yChange = tempY;
        while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14
                && color == allChess[x - xChange][y - yChange]) {
            count++;
            if (xChange != 0) {
                xChange++;
            }
            if (yChange != 0) {
                if (yChange > 0) {
                    yChange++;
                } else {
                    yChange--;
                }
            }
        }
        return count;
    }

    // 机器人判断黑棋相连的数量
    private int checkCountMachine(int x, int y, int xChange, int yChange, int color) {
        // TODO Auto-generated method stub
        int count = 0;
        int tempX = xChange;
        int tempY = yChange;
        while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14
                && color == allChess[x + xChange][y + yChange]) {
            count++;
            if (xChange != 0) {
                xChange++;
            }
            if (yChange != 0) {
                if (yChange > 0) {
                    yChange++;
                } else {
                    yChange--;
                }
            }
        }
        xChange = tempX;
        yChange = tempY;
        while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14
                && color == allChess[x - xChange][y - yChange]) {
            count++;
            if (xChange != 0) {
                xChange++;
            }
            if (yChange != 0) {
                if (yChange > 0) {
                    yChange++;
                } else {
                    yChange--;
                }
            }
        }
        return count;
    }

    public void paintConmponents(Graphics g) {
        super.paintComponents(g);

    }

    // 绘制黑白棋子
    public void draw(Graphics g, int i, int j) {
        if (allChess[i][j] == 1) {
            g.setColor(Color.black);// 黑色棋子
            g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);
            g.drawString(message, 230, 20);

        }
        if (allChess[i][j] == 2) {
            g.setColor(Color.white);// 白色棋子
            g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);
            g.drawString(message, 230, 20);

        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        // 判断是否有时间限制

        if (maxTime > 0) {
            while (true) {
                // System.out.println(canPlay + "11");
                if (isManAgainst) {
                    if (isBlack) {
                        blackTime--;
                        if (blackTime == 0) {
                            JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
                        }
                    } else {
                        whiteTime--;
                        if (whiteTime == 0) {
                            JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
                        }
                    }
                } else {
                    // 监控黑子下棋的时间,也就是用户下棋的时间
                    blackTime--;
                    if (blackTime == 0) {
                        JOptionPane.showMessageDialog(this, "用户超时,游戏结束!");
                    }

                    // 不监控电脑白字下棋

                }
                blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + ":"
                        + (blackTime - blackTime / 60 * 60);
                whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
                        + (whiteTime - whiteTime / 60 * 60);

                this.repaint();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }

    // 点击开始游戏设置属性,游戏开始
    public void Start() {
        this.canPlay = true;
        for (int i = 0; i < 14; i++) {
            for (int j = 0; j < 14; j++) {
                allChess[i][j] = 0;
            }
        }
        if (canPlay == true) {
            t.resume();
        }
        this.repaint();
        JOptionPane.showMessageDialog(this, "游戏开始了,请开始下棋");

        if (isBlack == false && isManAgainst == false) {
            machineChess(gameDifficulty);
        }
        // 另一种方式 allChess=new int[19][19]
        // message = "黑方先行";
        //
        // isBlack = true;
        // blackTime = maxTime;
        // whiteTime = maxTime;
        // if (maxTime > 0) {
        // blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600
        // * 60) + ":"
        // + (maxTime - maxTime / 60 * 60);
        // whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600
        // * 60) + ":"
        // + (maxTime - maxTime / 60 * 60);
        // t.resume();
        // } else {
        // blackMessage = "无限制";
        // whiteMessage = "无限制";
        // }
        // this.repaint();// 如果不重新调用,则界面不会刷新

    }

    // 人人对战下棋函数
    public void manToManChess() {
        if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {
            // System.out.println("在棋盘范围内:"+x+"--"+y);
            x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标
            y = (y + 15) / 30 - 1;
            if (allChess[x][y] == 0) {
                // 判断当前要下的是什么棋子
                if (isBlack == true) {
                    allChess[x][y] = 1;
                    isBlack = false;
                    blackTime = 120;
                    message = "轮到白方";
                } else {
                    allChess[x][y] = 2;
                    isBlack = true;
                    whiteTime = 120;
                    message = "轮到黑方";
                }
            }

            // 判断这个棋子是否和其他棋子连成5个
            boolean winFlag = this.checkWin(x, y);
            this.repaint(); // 绘制棋子
            if (winFlag == true) {
                JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");
                canPlay = false;
            }
        } else {
            // JOptionPane.showMessageDialog(this,
            // "当前位子已经有棋子,请重新落子!!!");
        }
    }

    // 人机对战下棋函数
    public void manToMachine() {
        if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {
            // System.out.println("在棋盘范围内:"+x+"--"+y);
            x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标
            y = (y + 15) / 30 - 1;
            if (allChess[x][y] == 0) {
                // 判断当前要下的是什么棋子
                if (isBlack == true) {
                    allChess[x][y] = 1;
                    this.repaint(); // 绘制棋子
                    machineChess(gameDifficulty);
                    isBlack = true;
                    blackTime = 120;
                    message = "用户下棋";
                    whiteTime = 120;
                    boolean winFlag = this.checkWin(x, y);
                    this.repaint(); // 绘制棋子

                    if (winFlag == true) {
                        JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");
                        canPlay = false;
                    }

                } else {

                    allChess[x][y] = 1;
                    // allChess[x][y] = 2;
                    this.repaint();
                    isBlack = false;

                    whiteTime = 120;
                    blackTime = 120;
                    boolean winFlag = this.checkWin(x, y);
                    this.repaint(); // 绘制棋子

                    if (winFlag == true) {
                        JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");
                        canPlay = false;
                    }
                    machineChess(gameDifficulty);
                }
            }

            // 判断这个棋子是否和其他棋子连成5个
            // boolean winFlag = this.checkWin(x, y);
            // this.repaint(); // 绘制棋子
            //
            // if (winFlag == true) {
            // JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] ==
            // 1 ? "黑方" : "白方") + "获胜!");
            // canPlay = false;
            // }
        }
    }

    // 机器人下棋算法
    public void machineChess(int gameDifficulty) {
        if (gameDifficulty == 0) {
            int i, j;
            boolean chessSucceed = true;// 下棋成功的标志
            while (chessSucceed) {
                i = (int) (Math.random() * 15);
                j = (int) (Math.random() * 15);
                if (allChess[i][j] == 0) {
                    allChess[i][j] = 2;
                    chessSucceed = false;
                }
            }
        } else if (gameDifficulty == 1) {
            int max = 0;
            int m = 0, n = 0;
            int figureSort[] = new int[4];// 对棋子的四个方向进行打分
            for (int i = 0; i < 15; i++) {
                for (int j = 0; j < 15; j++) {
                    if (allChess[i][j] == 0) {
                        figureSort[0] = checkCountMachine(i, j, 0, 1, 1);
                        figureSort[1] = checkCountMachine(i, j, 1, 0, 1);
                        figureSort[2] = checkCountMachine(i, j, 1, -1, 1);
                        figureSort[3] = checkCountMachine(i, j, 1, 1, 1);
                        sortFourFigure(figureSort);
                        temporaryChess[i][j] = figureSort[0] * 12 + figureSort[1] * 25 + figureSort[2] * 50// 算出空白棋子的最大分
                                + figureSort[3] * 100;
                    }
                    // System.out.print(temporaryChess[i][j] + " ");
                }
                // System.out.print("\n");
            }
            // System.out.print("=============================\n");
            for (int i = 0; i < 15; i++) {
                for (int j = 0; j < 15; j++) {
                    if (temporaryChess[i][j] > max && allChess[i][j] != 2 && allChess[i][j] != 1) {
                        m = i;
                        n = j;
                        max = temporaryChess[i][j];
                    }
                }
            }
            allChess[m][n] = 2;

        } else if (gameDifficulty == 2) {

        } else {

        }
        this.repaint();
    }

    // 对数组排序
    public void sortFourFigure(int n[]) {
        Arrays.sort(n);// 正序排序
    }
}

3.最后设置整个游戏的入口主函数StartEntrance.java

package StartGame;

import javax.swing.JFrame;

public class StartEntrance {
    //public static boolean canPlay =false;
    public static void main(String[] args) {
        // 实例化一个窗口

        MyFrame myFrame = new MyFrame();
        myFrame.setVisible(true); // 设置窗口为可见
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作属性

    }

}

以上所有代码均调试通过,人机算法较为简单,可实现简单的防守功能。
java源代码:链接:https://download.csdn.net/download/q651742112/10527151
打包的jar文件:链接:http://pan.baidu.com/s/1hs1OTXM 密码:jw84

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java五子棋的实现(附源码) 的相关文章

随机推荐

  • 9.2 向量范数的三大不等式

    文章目录 柯西 施瓦茨不等式 赫尔德不等式 闵可夫斯基不等式 我这里要讲的三大不等式不是三种范数比较大小的三大不等式 而是非常经典的 学习线性代数必须掌握的三大不等式 柯西 施瓦茨不等式 赫尔德不等式和闵可夫斯基不等式 我先讲讲这三大不等式
  • 第三方jar包引入项目,发布到本地和远程仓库

    在开发过程中 往往会遇到对接其他公司的系统 然后对接公司会提供API对接方式 就是给一个jar包 我们只需要把jar包引入到项目中直接用即可 本地引用jar的话可以有两种方式 第一种就是本地包引用 如下将包放下工程下 然后maven指定 但
  • 关于Pytorch中的向量拼接

    torch cat A torch ones 2 4 print A B 2 torch ones 2 4 print B C torch cat A B 0 print C D torch cat A B 1 print D A的输出 t
  • 改变linux命令行中的颜色

    黑色背景 白色字体虽然是最经典的 但是有时候太多白花花的英文在一起也会变得乱 下面是我的改变字体的办法 目前我只实现了让root目录下的字体变为绿色 如下图 这个只是最简单的改变颜色的 虽然对大牛们来说很简单 但对我这个初学者来说 真是费了
  • 144项ppt制作技术

    1 两幅图片同时动作 PowerPoint的动画效果比较多 但图片只能一幅一幅地动作 如果你有两幅图片要一左一右或一上一下地向中间同时动作 可就麻烦了 其实办法还是有的 先安置好两幅图片的位置 选中它们 将之组合起来 成为 一张图片 接下来
  • 用Python建立可进可退的多级菜单系统

    coding utf 8 功能 可进可退的多级菜单系统 作者 XxLyle 日期 2021 12 16 def add record print 添加记录功能模块尚待开发 def find record print 查询记录功能模块尚待开发
  • Photoshop cs6 如何让图层渐变透明

    点击图层面板下方的蒙板工具 再选择左侧工具栏的渐变填充 选择黑 白渐变色 在图层上拖动 1 点击面板下方蒙板工具 在需要处理的图层上添加蒙板 2 选择渐变工具 快捷键G 选择黑白渐变 然后按住shift拖动鼠标拉个渐变就出来了 3 另外可以
  • 小程序的父子之间的传值调用

    前言 我们在小程序中父子组件之间的传值方法 目录 父传子 properties 步骤 1 在父组件 index wxml里面给调用子组件的地方绑定一个字段map 2 在父组件 index js中定义字段map 并用this setData改
  • Hbase批量查询-scan介绍

    1 scan原理 HBase的查询实现只提供两种方式 1 按指定RowKey 获取唯一一条记录 get方法 org apache hadoop hbase client Get Get 的方法处理分两种 设置了ClosestRowBefor
  • 桌面软件自动化测试小记

    什么是软件自动化测试 如何学习软件自动化及几个例子 Py UiAutomation
  • Swagger的使用详细教程

    Swagger的使用详细教程 Swagger是一款开源的API文档工具 它提供了一种简单且强大的方式来描述 展示和测试RESTful风格的Web服务接口 本文将详细介绍Swagger的使用方法 包括安装配置和使用示例 步骤 1 添加Swag
  • 基于Python的机器学习实践(portein)

    目录 数据集 简介 代码 1 数据的读入 2 数据理解 3 数据规整化处理 数据准备 4 数据建模 5 查看模型 6 模型预测 7 结果输出 数据集 https download csdn net download llf000000 86
  • JMeter使用命令行模式生成HTML测试报告

    自动生成html图形化报告 win r 输入 cmd 说明 jmeter n t Jmx脚本位置 l 结果文件result jtl存放的位置 e o 生成HTML报告指定文件夹 n 表示non gui mode 就是非图形化模式 t 指定J
  • 怎么更改dns_ESHOP连不上?SWITCH最新实用DNS地址分享

    虽然任天堂Switch采用的是不锁区的方式 但是由于各种虚拟墙的存在已经网络延迟等问题 经常导致玩家连不上eshop 买不了游戏 更新个游戏显示都要好几万小时 当然这个可以使用各种加速器等方式来解决 但是好的加速器需要付费 免费的又会经常抽
  • Receive port always be disabled.

    I configured a receive port in FILE to a local folder Biztalk administration console keep show that port is disables I f
  • 支付宝个人收款解决方案之支付宝签约方案

    关键词 签约支付 签约收款 支付宝收款 个人签约收款 背景 有做网赚或者在网上售卖个人小产品小服务的 需要进行收款 如果零星个别的收款可能直接走个人转账然后手动发货即可 但是一旦流程标准下来 量走起来之后 付款发货就需要自动化了 以提高人效
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • Hibernate Validator的使用以及自定义

    Hibernate Validator的英文官方文档 https hibernate org validator documentation Hibernate Validator的作用 Hibernate Validator是一个校验框架
  • Java五子棋的实现(附源码)

    学习目的 熟悉java中swing类与java基础知识的巩固 文末有源代码文件和打包的jar文件 效果图 思路 1 首先构建一个Frame框架 来设置菜单选项与按钮点击事件 MyFrame java文件代码如下 package StartG